开发者社区> 问答> 正文

ack 能实现对某一个 Message 中的某个 Entry 提交吗

com.alibaba.otter.canal.client.CanalConnector.get 方法中有 batchSize 参数。当我设置成 100 时,假如我在处理某些 entry 出错,然后调用 connector.rollback(batchId),这就会导致此次的所有 entry 回滚吗?那是否会导致接下来出现重复处理相同 entry 的问题 ?

我想问下 canal 有提供 "ack 提交某个 Message Entry" 的方案吗?

我现在的思路是在记录 "库名+表名+主键" 做唯一判断,防止 rollback 后重复处理

原提问者GitHub用户idreamshen

展开
收起
绿子直子 2023-05-09 16:00:34 138 0
2 条回答
写回答
取消 提交回答
  • 随心分享,欢迎友善交流讨论:)

    Canal没有提供直接针对单个Entry进行ack提交的方案,可以考虑在处理过程中记录已经处理过的Entry,以避免重复处理的情况。在回滚操作时,确实会将该batchId之后的所有Entry都回滚,但在下一次拉取到该batchId之前的数据时,Canal会重新发送。因此,需要在处理过程中进行幂等性判断,避免重复处理已经处理过的Entry。记录"库名+表名+主键"做唯一判断是一种可行的方案。

    2023-05-10 12:18:19
    赞同 展开评论 打赏
  • 没有单条ack的功能,get的时候设置batchSize小一点. ps. 主要是性能考虑

    原回答者GitHub用户agapple

    2023-05-10 11:02:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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