具有相同组ID的不同使用者多次使用Kafka消息

时间:2019-06-06 12:24:18

标签: java spring apache-kafka messaging

我正在将kafka与Java sprig一起使用。 我可以看到只产生一次的消息被消耗了多次。

有时,消息仅被消费一次,而有时,消息被多次消费。 根据我的日志,消息处理在非常短的时间内开始,相差几毫秒。 我可以看到消息处理是多次发生,没有错误,并且在“ max.poll.interval.ms”之前完成。

有时,处理是在不同线程的同一服务容器中进行的,有时是在不同容器中进行。 所有广告连播具有完全相同的组ID。 这种情况在该群组ID的所有主题中都会发生。

此外,我仍然看到很多以下错误:

org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time message processing. You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.
at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.sendOffsetCommitRequest(ConsumerCoordinator.java:722) ~[kafka-clients-1.0.1.jar!/:?]
at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.commitOffsetsSync(ConsumerCoordinator.java:600) ~[kafka-clients-1.0.1.jar!/:?]
at org.apache.kafka.clients.consumer.KafkaConsumer.commitSync(KafkaConsumer.java:1250) ~[kafka-clients-1.0.1.jar!/:?]
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.commitIfNecessary(KafkaMessageListenerContainer.java:1327) ~[spring-kafka-2.1.5.RELEASE.jar!/:2.1.5.RELEASE]
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.processCommits(KafkaMessageListenerContainer.java:1188) [spring-kafka-2.1.5.RELEASE.jar!/:2.1.5.RELEASE]
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:688) [spring-kafka-2.1.5.RELEASE.jar!/:2.1.5.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_202]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_202]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_202]

和:

由于该组已经重新平衡并已将分区分配给另一个成员而无法完成提交,这意味着后续调用poll()的时间比配置的max.poll.interval.ms更长,这通常意味着轮询循环在消息处理上花费了太多时间。您可以通过增加会话超时或通过使用max.poll.records减小poll()中返回的最大批处理大小来解决此问题。

我的kafka用户配置为:

              consumer:
                autoRebalanceEnabled: true
                autoCommitOnError: true
                enableDlq: true
                ackEachRecord: true
                configuration:
                  max.poll.records: 20
                  max.poll.interval.ms: 1000000

在此先感谢您的帮助!

0 个答案:

没有答案