我有一个风暴拓扑来处理来自Kafka的消息,并根据手头的任务在Cassandra中进行HTTP调用/保存。我会在消息到来时立即处理。由于来自HTTP等外部源的响应,很少有消息未被完全处理。我想实现重试的指数退避机制,以便在一段时间后HTTP服务器不响应/返回错误消息重试。我可以想到几个我可以实现它们的想法。我想知道哪些是更好的解决方案,如果有任何其他我可以使用的解决方案是容错的。由于这用于实现指数退避,因此每条消息将具有不同的延迟时间。
虽然这几乎是我想做的事情。我无法找到实现Kafka - Delayed Queue implementation using high level consumer
中提到的delayProcessingUntil的文档我已经从Data-store完成了预定的工作并且在过去使用Beanstalk延迟了,但我更喜欢使用Kafka。
答案 0 :(得分:1)
Kafka spout内置了指数退避消息重试。您可以通过喷口配置配置初始延迟,延迟乘数和最大延迟。如果螺栓中有错误,您可以调用collector.fail(输入)。在那之后你只需要让它喷出来进行重试。
答案 1 :(得分:0)
我认为您的用例描述了对数据库而不是队列的需求。您希望暂时将记录存储到他们的时间,然后将其删除,以便他们不会在将来的搜索中显示。正如您的分析所示,尝试在队列中执行此操作最多也会很尴尬。
我建议您在Cassandra中创建另一个列族来保存这些延迟的请求。您存储请求本身以及重试时间。您是否还想拥有失败的HTTP尝试和相关数据的时间序列取决于您。当最终满足延迟请求时,您将从CF中删除相应的行。搜索延迟请求也很简单。
当然,任何数据库,甚至本地驱动器或HDFS上的文件也可以正常工作。
答案 2 :(得分:0)
您可能对Kafka Retry项目https://github.com/IBM/kafka-retry感兴趣。它使用单个重试主题提供了延迟的重试队列。