Kafka 提供了 3 种提交 offset 的方式

  1. 自动提交
复制
1
2
3
4
// 自动提交,默认true
props.put("enable.auto.commit", "true");
// 设置自动每1s提交一次
props.put("auto.commit.interval.ms", "1000");
  1. 手动同步提交 offset
复制
1
consumer.commitSync();
  1. 手动异步提交 offset
复制
1
consumer.commitAsync();

上面说了既然异步提交 offset 可能会重复消费, 那么我使用同步提交是否就可以表明这个问题呢?

复制
1
2
3
4
5
6
7
while(true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis());
records.forEach(record -> {
insertIntoDB(record);
consumer.commitSync();
});
}

很明显不行, 因为 insertIntoDB 和 commitSync() 做不到原子操作, 如果 insertIntoDB() 成功了,但是提交 offset 的时候 consumer 挂掉了,然后服务器重启,仍然会导致重复消费问题。

如何做到不重复消费?

只要保证处理消息和提交 offset 得操作是原子操作,就可以做到不重复消费。我们可以自己管理 committed offset, 而不让 kafka 来进行管理。

比如如下使用方式:

  1. 如果消费的数据刚好需要存储在数据库,那么可以把 offset 也存在数据库,就可以就可以在一个事物中提交这两个结果,保证原子操作。
  2. 借助搜索引擎,把 offset 和数据一起放到索引里面,比如 Elasticsearch

每条记录都有自己的 offset, 所以如果要管理自己的 offset 还得要做下面事情

  1. 设置 enable.auto.commit=false
  2. 使用每个 ConsumerRecord 提供的 offset 来保存消费的位置。
  3. 在重新启动时使用 seek(TopicPartition, long) 恢复上次消费的位置。

通过上面的方式就可以在消费端实现”Exactly Once” 的语义, 即保证只消费一次。但是是否真的需要保证不重复消费呢?这个得看具体业务, 重复消费数据对整体有什么影响在来决定是否需要做到不重复消费。

最新文章

  1. NOIp 1109
  2. java web学习总结(六) -------------------servlet开发(二)
  3. Codeforces 711E ZS and The Birthday Paradox
  4. Js练笔——用循环和递归实现追踪对象深度(循环引用关系不考虑)
  5. visual studio 2012 has stopped working
  6. angularjs探秘&lt;一&gt;
  7. JavaScript BOM 遗漏知识再整理;弹窗和记时事件;
  8. No.013 Roman to Integer
  9. PHP 魔术方法 __construct __destruct (一)
  10. iOS图片的伪裁剪(改变图片的像素值)
  11. 还原数据库“XXX”时失败。System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份。
  12. ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方案
  13. 虚拟机搭建CentOS主机win10通过xshell连接
  14. 在 Linux 上安装 Oracle 数据库 11g
  15. 用Java实现MVPtree——MVPtree点集内去重以及衍生出来的多维向量Hash问题
  16. Single Number II leetcode java
  17. webpack浅析---入口篇
  18. delphi Image 处理
  19. Android RoboGuice开源框架、Butter Knife开源框架浅析
  20. 深浅 buffer

热门文章

  1. Java学习:Set接口与HashSet集合存储数据的结构(哈希表)
  2. .NET Core MD5加密 32位和16位
  3. Kubeadm 1.9 HA 高可用集群本地离线镜像部署【已验证】
  4. 分布式系统根基:物理时钟和Lamport逻辑时钟
  5. 理解 Kubernetes 的亲和性调度
  6. Bootstrap4 glyphicon 移除图标 glyphicon fonts-faces 解决方案
  7. 【JVM】CMS垃圾回收器
  8. sweetalert 弹框简单使用
  9. selenium 开启开发者工具(F12)
  10. QTGraphics-View拖拽以及鼠标指针操作