如何使用apache kafka实现延迟队列?

时间:2014-11-12 15:13:22

标签: priority-queue apache-kafka

如何在kafka上添加延迟作业?据我所知,它并不是针对每个消息而是针对每个主题进行处理。我的工作有不同的时间表我希望他们被消费。假设一个将在接下来的4个小时内,另一个将是我12月1日等等。

kafka是否拥有本地或其他第三方实现相同目标的原生支持?

我正在考虑将Redis用于延迟队列,并在其计划到达后将作业推送到kafka,但如果可能的话,我只想使用一个依赖项。

4 个答案:

答案 0 :(得分:8)

这里有点延迟回答。现在,使用每条消息的新时间戳,最新的Kafka版本0.10+可以从延迟流中消耗。我现在正在使用它来实现连续聚合数据集,而不依赖于外部依赖性。

这些记录通过,并且可能在第一个事件发生后的60分钟内有更新/删除,因此在看到所有更新之前,我不能将其声明为“最终”。

所以,为了处理这个案例,我正在使用所有CREATEs / UPDATEs / DELETE两次主题,第一个实时(或尽可能快),第二个延迟90分钟以确保我不会什么都没有。在实时消费者身上,我在本地存储了创建所需的所有更新。然后在延迟的消费者上,当我收到特定的“创建”时,我将查找我的本地存储以进行任何更新/删除,更新记录以便它知道它的最终状态,并将其生成为最终主题再次进入卡夫卡。

为了确保我的磁盘空间不足,我还会不断截断本地存储,因此它最多可以保留两个小时的更新/删除。

答案 1 :(得分:5)

卡夫卡没有工作的概念。它只是一个愚蠢的高性能消息排队服务。根据您的要求,您可以考虑将作业存储在支持按作业执行时间索引的存储中,如某些RDBMS。然后在某些过程中定期提取具有一些小范围执行时间的作业[last_check_time,current_time + lookahead_interval]并将它们放入Kafka主题中以便最终处理。

答案 2 :(得分:0)

作为替代方案,您可以使用消息TTL 死信交换

来使用支持此功能的RabbitMQ。

有关更多信息,请访问:

https://m.alphasights.com/exponential-backoff-with-rabbitmq-78386b9bec81

答案 3 :(得分:0)

不幸的是,Kafka无法像某些消息队列那样延迟消息的可见性。消息发布后,将立即向所有消费者提供。唯一的例外是,发布发生在事务范围中,并且使用者已启用读提交隔离模式。即使那样,延迟也将是最小的。

Kafka将所有处理语义留给消费者自行决定。如果需要延迟处理,则可能要在用户端使用持久性数据存储(例如RDBMS或Redis)或其他队列。您当然肯定不想使用Thread.sleep()阻止生产者上的记录使用,因为这会影响您轮询记录的能力,而Kafka最终会认为您的消费者失败了。