标签:恢复 gradient visible absolute mon 处理 nowrap back overflow
1 | // 自动提交,默认true |
1 | consumer.commitSync(); |
1 | consumer.commitAsync(); |
上面说了既然异步提交 offset 可能会重复消费, 那么我使用同步提交是否就可以表明这个问题呢?
1 | while(true) { |
很明显不行, 因为 insertIntoDB 和 commitSync() 做不到原子操作, 如果 insertIntoDB() 成功了,但是提交 offset 的时候 consumer 挂掉了,然后服务器重启,仍然会导致重复消费问题。
只要保证处理消息和提交 offset 得操作是原子操作,就可以做到不重复消费。我们可以自己管理 committed offset, 而不让 kafka 来进行管理。
比如如下使用方式:
每条记录都有自己的 offset, 所以如果要管理自己的 offset 还得要做下面事情
通过上面的方式就可以在消费端实现”Exactly Once” 的语义, 即保证只消费一次。但是是否真的需要保证不重复消费呢?这个得看具体业务, 重复消费数据对整体有什么影响在来决定是否需要做到不重复消费。
标签:恢复 gradient visible absolute mon 处理 nowrap back overflow
原文地址:https://www.cnblogs.com/doit8791/p/11312979.html