Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

比官方示例慢一些,想知道是哪些地方会导致慢,怎么优化,或者能说一下怎么设计的,感谢 #23

Open
aitxiaogang opened this issue Mar 15, 2024 · 11 comments

Comments

@aitxiaogang
Copy link

比官方示例慢一些,想知道是哪些地方会导致慢,怎么优化,或者能说一下怎么设计的,感谢

@aitxiaogang
Copy link
Author

同样环境下,对比官方示例慢接近1秒

@xizixuejie
Copy link
Owner

感谢提出这个问题,大概执行流程如下:

  1. 入口是 ICanalClient 中的 handleListening 方法,监听原始的canal消息
  2. IMessageHandler 中使用 EntryListenerContext 找到表名对应的 EntryListener 。以及处理转换原始消息,获取每一行的数据。
  3. RowDataHandler 中使用 IConvertFactory 创建实体对象,根据 CanalEntry.EventType 确定执行EntryListener 的那个方法。

@aitxiaogang
Copy link
Author

感谢回复,建议你创建一个QQ或者微信群,大家群策群力一起优化。另外发现你代码写的很整洁,点赞

@aitxiaogang
Copy link
Author

image
抛出异常,消息没有回滚。请教异常处理机制是什么

@xizixuejie
Copy link
Owner

canal.async 默认为true,设置为false才会回滚消息。
但是如果你是用的tcp模式或者 canal.mq.flat-message 设置为false了,由于AbstractMessageHandler 中catch异常没抛出,我改一下。

@aitxiaogang
Copy link
Author

消息拉取间隔设置0延时有什么不好的地方吗

@xizixuejie
Copy link
Owner

tcp模式下 canal.timeout 设置为 -1
kafka模式下 canal.timeout 设置为 0

@xizixuejie
Copy link
Owner

不知道啊,我一直是设置的1

@aitxiaogang
Copy link
Author

请教一个问题,看了官方文档没有找到答案。canal客户端或者说你的这个项目如果停止了,再重新启动这个程序的时候怎么获取到停止的这段时间数据库数据的变化历史呢

@xizixuejie
Copy link
Owner

如果消息没被消费,客户端会自动拉取的

如果你是连了其他的mq,那就存到消息中间件里了;如果你是直连的,应该是存到canal的服务端了

@aitxiaogang
Copy link
Author

能说一下怎么配置rabbitMQ消费方式吗,virtual-host不知道设置什么格式。另外我看源码不管哪种消费方式都添加了超时配置,怎么取消超时机制呢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants