在kafka消费者中重试逻辑

时间:2016-05-06 11:45:35

标签: apache-kafka kafka-consumer-api kafka-producer-api

我有一个用例,我从队列中使用某些日志并使用该日志中的一些信息命中某些第三方API,以防第三方系统没有正确响应我希望为该特定日志实现重试逻辑

我可以添加一个时间字段并将消息重新发送到同一个队列,如果时间字段有效,即小于当前时间,则会再次消耗此消息,如果没有,则再次将其推送到队列中。

但是这个逻辑会一次又一次地添加相同的日志,直到重试时间正确并且队列将不必要地增长。

是否有更好的方法在Kafka中实现重试逻辑?

3 个答案:

答案 0 :(得分:3)

您可以创建多个重试主题并在那里推送失败的任务。例如,您可以在分钟中创建3个具有不同延迟的主题,并旋转单个失败的任务,直到达到最大尝试次数。

  

'retry_5m_topic' - 在5分钟内重试

     

'retry_30m_topic' - 在30分钟内重试

     

'retry_1h_topic' - 在1小时内重试

详情请见https://blog.pragmatists.com/retrying-consumer-architecture-in-the-apache-kafka-939ac4cb851a

答案 1 :(得分:1)

是的,这可能是我想到的一个直接的解决方案。但有了这个,我们最终会创建许多主题,因为消息处理可能会再次失败。

我通过将此用例映射到Rabbit MQ来解决了这个问题。在Rabbit MQ中,我们有重试交换的概念,如果消息处理从交换失败,那么你可以将它发送到与TTL的重试交换。一旦TTL过期,该消息将移回主交换机并准备好再次处理。

我可以发布一些示例来解释如何使用Rabbit MQ实现指数退避消息处理。

答案 2 :(得分:0)

在使用者中,如果它抛出异常,则生成另一条尝试编号为1的消息。因此,下次消耗该消息时,它具有尝试否的属性1.在生成器中处理它,如果它尝试超过您的重试计数,然后停止生产它。