在@ KafkaListener-method中确认没有"失去"消息

时间:2017-01-04 10:13:32

标签: spring apache-kafka spring-kafka

我们目前基本上使用以下简化机制确认消息:

  @KafkaListener(topics = "someTopic")
  public void listen(final String message, final Acknowledgment ack) {
    try {
        processMessage(message);
        ack.acknowledge();
    } catch (final IOException e) {
        // do not acknowledge here since we can temporarily not process the message
    } 

基本上,每当我们暂时无法处理消息时(在IOExceptions的情况下),我们希望以后再次接收它。

但这不起作用,因为确认假定同一分区中的所有先前消息都已成功处理。在我们的IOException情况下,将跳过失败的消息,但可能会被同一分区上具有更高索引的其他消息确认。

我们有一些想法如何解决这个问题,但这将意味着一些讨厌的解决方法,以避免在KafkaListener方法中直接调用确认。我们的用例是非常具体的,还是更像是"默认"春天卡夫卡用户会假设的行为?

是否存在针对此类问题的spring-kafka解决方案?或者你有想法正确解决这个问题"?

1 个答案:

答案 0 :(得分:2)

这就是卡夫卡的作品;您可以启用重试以尝试超越IOException,然后再转到下一条消息。

您可以配置错误句柄以将失败的邮件发布到另一个主题以便稍后重播。或者,错误处理程序可以停止容器以防止任何新的交付。

重新启动容器时,将重播该消息。