kafka消费者的异步提交偏移量方法中,什么时候需要在回调方法中重试提交?场景是什么?
今天正好翻到《Kafka权威指南》第2版中描述consumer异步提交偏移量的一段内容,大概意思是说:consumer同步提交的commitSync()
在提交成功之前或碰到无法恢复的错误之前,该方法会一直重试,但异步提交方法commitAsync()
不会重试,因为这里有一个提交顺序问题,因为假设有”提交1--偏移量2000“和”提交2--偏移量3000“,那么如果”提交1“因为网络问题而失败,而”提交2“先提交成功,那么提交1如果重试后会将broker端原来的3000偏移量更新为2000偏移量,从而增加了重复消费的数量。所以如果要用commitAsync()
重试提交,则可以利用它的回调接口commitAsync(OffsetCommitCallback callback)
,配合一个AtomicLong
等单调递增的变量来维护提交的顺序,即每次调用commitAsync()
时让变量+1,然后在callback中如果发现有异常需要重试之前就检查回调的序列号和变量的序列号是否相等,如果相等才允许重试。
上面的这些内容本身很好理解,我的问题是:为什么不干脆放弃重试呢?因为如果是因为短暂的网络问题造成”提交1“失败,那么后面的提交产生更大的offset提交也并不影响消费啊?而如果是因为长时间的网络问题,那么重试提交本身好像本身意义也不大。
回复
1个回答

test
2024-07-05
昨天提问题的时候时间太晚了,脑子瓦特了,睡醒了就明白了,在需要顺序消费的场景下,且特定的代码环境下,就必须有一个重试的动作。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容