kafka rebalance 重复消费
问:Kafka Consumer自动提交机制
- 答:Consumer消费消息之后不需要手动提交,consumer客户端会自动提交已经消费的消息的offset。
调用栈为:
KafkaConsumer#assign
ConsumerCoordinator#mitOffsetsNow
调用栈为:
KafkaConsumer#poll
KafkaConsumer#pollOnce
ConsumerCoordinator#poll
ConsumerCoordinator#mitOffsetsAsync
调用栈为:
KafkaConsumer#poll
KafkaConsumer#pollOnce
ConsumerCoordinator#poll
AbstractCoordinator#ensureActiveGroup
AbstractCoordinator#joinGroupIfNeeded
AbstractCoordinator#onJoinPrepare
ConsumerCoordinator#mitOffsetsSync
只要开启了自动提交,此处是一定会向协调者同步提交位移,因为需要重新rebalance,消费者组中各个消费者的分区既有可能会发生改变,重新消费之前一定要获取最新的唯一,尽最大努力避免重复消费。
调用栈为:
KafkaConsumer#close
ConsumerCoordinator#close
关闭的时候肯定是要同步提交消费位移的。
问:2022-02-15 带宽瓶颈导致kafka消费无法rebalance成功
- 答:美西机器消费宁夏kafka集群 跨洋网络消费 公司带宽有限制为20m
应用消费topic多 concurrency高 两台机器加起来有200+线程同时消费
问题:重启机器后 kafka rebalance期间 两台机器cpu同时飙高99% 跨洋专线带宽占满 导致服务端收不到心跳 又重新开始rebalance 进入恶性循环
原因:每次rebalance完成后,所有消费者线程获知各自被分配的partition,同时去kafka服务器拉取消息,导致瞬间带宽被占满,
稳定消费时带宽占用没有这么高是由于各消费线程拉取消息的时机不是完全同步
解决:每次服务端kafka消费线程收到rebalance完成自己被分配的消费分区时,不马上开始拉取消息,而是阻塞一段时间,错开rebalance完成后第一次消费的时机,减少瞬间带宽占用
本文来源: https://www.lw50.cn/article/6c7099534a044b2b39f7b5aa.html