开发者社区> 问答> 正文

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

看完代码我发现每个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

展开
收起
山海行 2023-04-27 18:25:48 133 0
1 条回答
写回答
取消 提交回答
  • 重新看了一遍代码,发现我之前看错了,其实只有重新订阅的时候才会从最后一条事务头开始读,正常ack的位置是batch的结尾

    原回答者GitHub用户xy720

    2023-04-28 13:26:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载