Spring Cloud Stream:需要很长时间来处理消息时,对StreamListener的正确处理

时间:2019-02-12 11:49:50

标签: spring-boot apache-kafka spring-cloud-stream spring-kafka

当StreamListener花费很长时间(比max.poll.interval.ms长)来处理一条消息时,该特定使用者将被占用,并且其他新消息将分配给其他分区。时间大于max.poll.interval.ms之后,发生了重新平衡,另一位消费者也会遇到相同的情况。因此,该消息将在所有分区中传播,并继续占用资源。

但是,这种情况并不经常发生,只有几条消息以某种方式花费了很长时间才能处理,并且这是无法控制的。

经过几次重新平衡后,我们可以提交偏移量并将其扔给DLQ吗?如果是,我们该怎么做?如果没有,那么这种情况的正确处理方法是什么?

1 个答案:

答案 0 :(得分:0)

增加max.poll.interval.ms不会对性能产生任何影响(除非检测到确实死亡的消费者需要更长的时间)。

每次处理此“不良”记录时都要进行重新平衡,这会对性能造成更大的损害。

但是,您可以使用自定义SeekToCurrentErrorHandler together with a recoverer such as the DeadLetterPublishingRecoverer来完成所需的操作。您还需要一个重新平衡监听器来计算重新平衡,并需要一种机制来跨实例共享来自错误处理程序的状态(标准的机制仅将状态保存在内存中)。

我认为这很复杂。