如何在kafka上添加延迟作业?据我所知,它并不是针对每个消息而是针对每个主题进行处理。我的工作有不同的时间表我希望他们被消费。假设一个将在接下来的4个小时内,另一个将是我12月1日等等。
kafka是否拥有本地或其他第三方实现相同目标的原生支持?
我正在考虑将Redis用于延迟队列,并在其计划到达后将作业推送到kafka,但如果可能的话,我只想使用一个依赖项。
答案 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最终会认为您的消费者失败了。