Confluent Kafka poll场景下消息何时提交?崩溃后队列消息会丢失吗?
问题解答:autocommit=True时崩溃,后台队列消息是否会丢失?
会丢失,核心原因和逻辑如下:
- 开启
autocommit=True后,Confluent Kafka消费者会按auto.commit.interval.ms的配置(默认5秒)自动提交偏移量,提交的是后台线程已拉取到队列中的所有消息的最高偏移量——完全不管主线程有没有实际处理这些消息。 - 你的应用用
poll(1000)每秒触发一次拉取动作,后台线程会持续把消息塞进本地队列。只要到了自动提交的时间点,队列里所有已拉取的消息的偏移量都会被同步到Kafka broker。 - 一旦这时候消费者崩溃,那些还躺在后台队列里没被主线程处理的消息,因为偏移量已经被提交,重启后的消费者会从提交的偏移量之后开始拉取,这些未处理的消息就再也不会被消费,直接丢失。
如果想避免这种情况,最可靠的方式是关闭autocommit,在主线程确认消息处理完成后手动提交偏移量;要是不想改代码逻辑,也可以调大auto.commit.interval.ms,但还是手动提交能彻底规避丢消息的风险。
内容的提问来源于stack exchange,提问作者Miguel Wang
相关产品推荐
相关产品推荐

