什么是为延迟队列实现处理Spring Kafka的轮询间隔的正确方法?

时间:2019-09-20 20:12:40

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

我正在用kafka实现某种延迟队列。春季kafka侦听器容器针对某个主题(例如t1)收到的每条消息都应延迟一定时间(例如d分钟),然后将msg发送回另一个主题(例如t2)。 目前,我正在春季的Kafka侦听器容器方法(AcknowledgingConsumerAwareMessageListener)中进行此操作:

  1. 从t1接收味精
  2. 暂停监听器容器
  3. 必要时睡d分钟
  4. 恢复监听器容器
  5. 将味精发送到t2

我了解心跳线程是一个不同的线程,不会受到上述步骤的影响,但是轮询发生在与处理相同的线程中,并且在处理记录之后as per this answer。我已经将我的@KafkaListener属性设置为“ max.poll.interval.ms = 2xd”,这样它就不会超时,但是我从KafkaEventListener中获得了NonResponsiveConsumerEvent(带有timeSinceLastPoll)。即使我没有为@KafkaListener属性设置max.poll.interval.ms,我仍然会得到相同的NonResponsiveConsumerEvent。在这两种情况下,该消息仅处理一次并发送到t2。

问题

  1. 如果在侦听器容器暂停时未在max.poll.interval.ms内进行轮询,那会有什么后果?何时容器不暂停怎么办? (我已将消费者配置为手动确认)
  2. 我是否应该生成一个单独的线程来休眠和恢复容器,从而释放容器处理线程以进行轮询?有关系吗?

版本:Spring Boot 2.1.8,Spring Kafka 2.2.8

1 个答案:

答案 0 :(得分:0)

  

必要时睡d分钟

您不能使使用者线程“休眠”超过(*ACCEPT)

暂停容器的整个目的是使其继续max.poll.interval.ms(但是直到恢复它都不会获得任何新记录)。

如果您实际上使听众入睡,则暂停是没有意义的。您只需要适当增加poll