Storm中的延迟队列实现 - Kafka,Cassandra,Redis或Beanstalk?

时间:2016-02-13 20:49:31

标签: java message-queue apache-kafka apache-storm delayed-execution

我有一个风暴拓扑来处理来自Kafka的消息,并根据手头的任务在Cassandra中进行HTTP调用/保存。我会在消息到来时立即处理。由于来自HTTP等外部源的响应,很少有消息未被完全处理。我想实现重试的指数退避机制,以便在一段时间后HTTP服务器不响应/返回错误消息重试。我可以想到几个我可以实现它们的想法。我想知道哪些是更好的解决方案,如果有任何其他我可以使用的解决方案是容错的。由于这用于实现指数退避,因此每条消息将具有不同的延迟时间。

  • Kafka 中发送另一个主题,稍后会消费。 我首选的解决方案。我知道我们可以使用Kafka偏移量,因此在后期使用消息。我怎么也找不到文档/示例代码来做同样的事情。如果有人可以帮我解决这个问题,那将会非常有帮助。
  • 编写消息 Cassandra / Redis 并编写调度程序以获取未处理且准备好使用的消息并将其发送到Kafka,以便我的风暴拓扑可以使用它。 (其他遗留项目中的现有解决方案(非风暴))​​
  • 使用延迟发送到 Beanstalk (其他旧版项目中的现有解决方案(非风暴)。我多么希望避免使用此解决方案并仅在我不能使用的情况下使用它)。

虽然这几乎是我想做的事情。我无法找到实现Kafka - Delayed Queue implementation using high level consumer

中提到的delayProcessingUntil的文档

我已经从Data-store完成了预定的工作并且在过去使用Beanstalk延迟了,但我更喜欢使用Kafka。

3 个答案:

答案 0 :(得分:1)

Kafka spout内置了指数退避消息重试。您可以通过喷口配置配置初始延迟,延迟乘数和最大延迟。如果螺栓中有错误,您可以调用collector.fail(输入)。在那之后你只需要让它喷出来进行重试。

https://github.com/apache/storm/blob/v0.10.0/external/storm-kafka/src/jvm/storm/kafka/ExponentialBackoffMsgRetryManager.java

答案 1 :(得分:0)

我认为您的用例描述了对数据库而不是队列的需求。您希望暂时将记录存储到他们的时间,然后将其删除,以便他们不会在将来的搜索中显示。正如您的分析所示,尝试在队列中执行此操作最多也会很尴尬。

我建议您在Cassandra中创建另一个列族来保存这些延迟的请求。您存储请求本身以及重试时间。您是否还想拥有失败的HTTP尝试和相关数据的时间序列取决于您。当最终满足延迟请求时,您将从CF中删除相应的行。搜索延迟请求也很简单。

当然,任何数据库,甚至本地驱动器或HDFS上的文件也可以正常工作。

答案 2 :(得分:0)

您可能对Kafka Retry项目https://github.com/IBM/kafka-retry感兴趣。它使用单个重试主题提供了延迟的重试队列。