看完代码我发现每个batch里面最后一条事务可能只会有事务自身一半的数据,另一半的数据在下一个batch里面 而这时ack一个batch的时候并不会ack在batch最后一个event,而是会ack在这条事务的事务头位置
假如获取数据时,用户依次get到了10001、10002这两个batch,当用户消费完了10001这个batch,会告诉canal去ack batchId(10001),
这时就感觉会有点问题,假如10001的最后一条事务是t,canal ack的点是在t的事务头位置,但对于下游数据库已经消费到了t的中间位置。如果用户在消费10002的时候失败了,会告诉canal去rollback batchId(10002),那么下次get的时候事务t的前半部分数据又会重复发送出去了,下游会不会重复消费这一部分数据?
如果用户想避免重复消费的话,是否需要做一个transaction buffer来缓存最后一条事务吗?比如通过transaction buffer来接收完整的一条事务,然后再提交?但如果事务本身太过巨大,trannsaction buffer容不下怎么办?
原提问者GitHub用户xy720
重新看了一遍代码,发现我之前看错了,其实只有重新订阅的时候才会从最后一条事务头开始读,正常ack的位置是batch的结尾
原回答者GitHub用户xy720
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。