apache-kafka - Kafka 中的延迟消息消费

标签 apache-kafka kafka-consumer-api

如何使用 Apache Kafka 生成/使用延迟消息?似乎标准的 Kafka(和 Java kafka-client)功能没有这个功能。我知道我可以用标准的等待/通知机制自己实现它,但它似乎不是很可靠,所以任何建议和好的做法都值得赞赏。

找到 related question ,但这没有帮助。
如我所见:Kafka 基于从文件系统的顺序读取,只能用于直接读取主题以保持消息顺序。我对吗?

最佳答案

实际上,kafka 的最低结构是一个分区,它是队列中具有增量偏移量的顺序事件 - 在生成日志的那一刻,除了末尾之外,您不能在其他任何地方插入日志。没有延迟消息的概念。

你到底想达到什么目标?

您的情况的一些可能性:

  • 您想在特定时间推送消息(例如,事件“开始作业”)。在这种情况下,使用计划任务(不是来自 kafka,在您的操作系统/语言/自定义应用程序/任何东西上使用某种标准方式)在给定时间发送消息 - 消费者将在适当的时间收到它们。
  • 您想立即发送一个事件,但消费者现在不应考虑该事件。在这种情况下,您可以使用自定义结构,在其有效负载中包含“时间”。消费者必须了解该领域并进行自定义处理来处理它。例如:“在 2017-12-27T20:00:00Z 开始工作”。您也可以为此使用 header ,但目前并非所有客户端都支持 header 。
  • 您可以更改发送消息的时间戳。在内部,它仍然会被按顺序读取,但一些暗示时间的函数会以不同的方式工作,消费者可以使用消息的时间戳来执行它的操作——这有点像之前的命题,除了时间戳是事件的一个元数据,而不是事件负载本身。我不会亲自使用它 - 我只在代理某些事件时处理时间戳。

  • 对于你的最后一个问题:基本上,是的,但有一些注意事项:
  • 主题实际上是在分区中拆分的,并且顺序仅在分区中保留。所有具有相同 key 的消息都发送到相同的分区。
  • 大多数情况下,您只从内存中读取,除非您读取旧事件 - 在这种情况下,因为这些事件是从磁盘顺序读取的,所以速度非常快
  • 您可以选择从哪里开始读取 - 给定的偏移量或给定的时间 - 甚至在运行时更改它
  • 您可以跨进程并行读取 - 多个消费者可以读取相同的主题并且永远不会读取相同的消息两次(每个读取不同的分区,请参阅消费者组)
  • 关于apache-kafka - Kafka 中的延迟消息消费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47991670/

    相关文章:

    apache-kafka - 偏移量的异步自动提交失败

    apache-kafka - 消费群体如何在kafka中运作?

    apache-kafka - 为什么我们需要在Kafka Consumer Configuration中添加所有zookeeper节点

    java - 多处理kafka消息

    hadoop - 在 5 节点集群的每个节点上设置多代理 kafka

    java - 获取kafka分区中最后一条记录的偏移量

    Python-Kafka : Keep polling topic infinitely

    c# - Consumer 中 Confluence.Kafka 中的事务

    java - 生产者无法将消息分发给多个消费者?

    apache-kafka - Apache Kafka 如何与多个代理和单个代理一起工作