首页/数据/数据工程与 ETL 速查/Canal client 拉取与位点确认
本包目录(311 条)
管道基础52 条Kafka64 条调度与编排40 条数仓建模52 条数据质量50 条
CDC 与同步53 条

Canal client 拉取与位点确认

Canal 客户端以批次为单位拉取并回执位点:getWithoutAck 拉取、业务处理成功后 ack 提交、处理失败 rollback 让位点回退。ack 时机决定消息语义——先处理再 ack 是至少一次投递,先 ack 后处理则可能丢消息;批大小与处理耗时决定吞吐和重投规模。

客户端消费骨架(Java API 方法名)

客户端消费骨架(Java API 方法名)
// 拉取批次
Message message = connector.getWithoutAck(1000, 5L, TimeUnit.SECONDS);
long batchId = message.getId();
try {
    process(message.getEntries()); // 业务处理
    connector.ack(batchId);        // 处理成功再确认
} catch (Exception e) {
    connector.rollback(batchId);   // 失败回滚,下轮重拉
}
getWithoutAck拉取但不提交位点
ack按 batchId 提交位点
rollback回滚批次,下轮重新拉取
建议处理完成后统一 ack,异常时回滚并记录日志
位点以 ack 为准:不 ack 会重复消费同一批;空批次也要注意批次 id 的处理规则。

易错点

  • catch 里吞异常后照样 ack,数据静默丢失
  • 多线程处理同一批次但只在部分线程成功后 ack,位点与处理进度错位

数据来源与参考

  • Canal 官方文档(Client API:getWithoutAck/ack/rollback)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌