阅读kafka consumer commitSync/commitcommitAsync文档

This commit is contained in:
wuxiangkai
2023-11-25 17:14:21 +08:00
parent 01f013fbe8
commit bace3202f5

View File

@@ -402,13 +402,25 @@ kafka中的分区策略通过`partition.assignment.strategy`参数来进行配
>
> - kafka commitSync可手动同步提交offset但是在调用commitSync接口后会等待broker返回确认信息在此之前消费者会一直阻塞。这样会影响消费者的吞吐量故而为了提高吞吐量可以尽量减少commitSync的提交次数
>
> - kafka commitAsync相比于同步提交commitAsync在调用后并不会阻塞而是直接返回此后可以继续调用poll来继续从broker拉取后续消息。
> - kafka commitAsync相比于同步提交commitAsync在调用后并不会阻塞而是直接返回此后可以继续调用poll来继续从broker拉取后续消息。但是相比同步提交commitAsync可能在发生rebalance时造成重复消费的情况。
>
> 在使用异步提交时如果在发生rebalance之前rebalance只能发生在poll过程中commitAsync提交失败由于commitAsync不会失败重试故而在分区重新分配后新分配到该分区的消费者实例将会重新消费之前未提交成功的消息因此产生了消息的重复消费
>
> 而同步提交时commitSync在提交失败后会无限次重试直到提交成功故而在发生rebalance时rebalance只能发生在poll的过程中在发生rebalance之前可以保证之前commitSync操作已经成功。
> #### kafka的手动提交重试机制
> 针对kafka的手动提交当使用`commitSync`进行同步提交时,如果提交失败,同步提交会无限次的进行重试,直到提交成功或是发生了不可恢复的异常。
>
> 但是,在使用`commitAsync`方法进行提交时kafka消费者在提交失败之后则不会进行重试。在处理kafka commitAsync重试问题时还需要考虑commit order。当消费者进行异步提交时如果发现当前batch提交失败此时可能位于当前batch之后的batch已经处理完成并进行提交commitAsync并不会等待当前batch提交成功之后再拉取下一批而是直接拉取下一批继续处理故而下一批batch可能提交早于当前batch。故而如果对当前异常的batch进行重试提交可能会之后批次的commit offset被覆盖从而造成消息的重复消费。
##### rebalance
rebalance通常有两个阶段`revocation``assignment`即撤销当前消费者被分配的分区和重新分配给消费者新的分区。revocation方法会在rebalance之前被调用且revocation是rebalance之前消费者最后一次提交offset的机会可以重写revocation方法在rebalance发生之前对offset进行同步提交。
而assignment则是发生在rebalance之后可以重写assignment方法来初始化各分区的offset。
通常情况下commitAsync相较commitSync是更不安全的在宕机之前提交失败将会造成消息的重复消费。可以通过在回调中使用commitSync来减轻消息的重复消费风险。