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提交也并不影响消费啊?而如果是因为长时间的网络问题,那么重试提交本身好像本身意义也不大。
回答:
昨天提问题的时候时间太晚了,脑子瓦特了,睡醒了就明白了,在需要顺序消费的场景下,且特定的代码环境下,就必须有一个重试的动作。
回答:
一般来说,放弃重试是可行的,但有些时候,特别是对于一些重要的业务场景,需要一直重试直到成功为止,这样才能保证处理的准确性,避免重复操作。如果你可以接受数据丢失或者延迟,那放弃重试是可以的
以上是 kafka消费者的异步提交偏移量方法中,什么时候需要在回调方法中重试提交?场景是什么? 的全部内容, 来源链接: utcz.com/p/945115.html