Kafka - 根据预定时间将消息移动到队列前面

时间:2018-05-18 19:08:21

标签: apache-kafka message-queue

Kafka(或其他消息队列)中是否有一项功能可以通过该功能添加仅在指定时间内处于活动状态的消息。这意味着不应在指定时间之前使用该消息。

跟进,有没有办法在达到预定时间时将这些消息移到队列的前面。

2 个答案:

答案 0 :(得分:1)

卡夫卡不能这样做。 Kafka基本上只是一个提交日志,它将按照接收顺序写入消息,并以相同的顺序读取它们。

然而,其他更传统的消息传递经纪人可以做到这一点 - 例如,ActiveMQ Artemis支持scheduled messages。我认为消息不会在队列中移动,但在预定时间之前不会消耗。

答案 1 :(得分:1)

不在Kafka经纪人本身,但您可以使用Kafka Streams通过定义自定义Processor执行此操作,该操作执行以下操作:

  • 使用应将消息作为密钥处理的时间戳将每条消息存储到StateStore中。由于多条消息可能具有相同的时间戳,因此您需要将它们包装到一个集合中,或者使用一些唯一值将该密钥后缀。
  • init方法中安排一个标点符号,该标点符号定期在状态存储上执行ranged query,并forwards已达到其时间戳的邮件,并将其从商店中删除。
  • 转发的消息将进入一个单独的主题,消费者将不得不从该主题中消费,但消息将按照您定义的顺序消费。