获取canal数据时batch的最后一条事务会可能只有一半的数据?

yzuktlbb  于 2022-10-24  发布在  其他
关注(0)|答案(1)|浏览(155)

看完代码我发现每个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容不下怎么办?

xdnvmnnf

xdnvmnnf1#

重新看了一遍代码,发现我之前看错了,其实只有重新订阅的时候才会从最后一条事务头开始读,正常ack的位置是batch的结尾

相关问题