如何使用 Apache Kafka 生成/消费延迟消息?似乎标准 Kafka(和 Java kafka-client)功能没有此功能。我知道我可以用标准的等待/通知机制自己实现它,但它看起来不太可靠,因此任何建议和良好实践都值得赞赏。
Found 相关问题 https://stackoverflow.com/questions/31775003/kafka-delayed-queue-implementation-using-high-level-consumer,但这没有帮助。
正如我所看到的:Kafka 基于从文件系统的顺序读取,只能用于直接读取主题,保持消息顺序。我对吗?
事实上,kafka 最低的结构是一个分区,它是队列中具有增量偏移量的顺序事件 - 您不能将日志插入到生成日志时的末尾以外的任何位置。没有延迟消息的概念。
您到底想实现什么目标?
您的情况有一些可能性:
您想要在特定时间推送消息(例如,事件“开始作业”)。在这种情况下,使用计划任务(不是来自 kafka,在您的操作系统/语言/自定义应用程序/其他上使用某种标准方式)在给定时间发送消息 - 消费者将在适当的时间收到它们。
您现在想要发送一个事件,但消费者现在不应该考虑该事件。在这种情况下,您可以使用自定义结构,在其有效负载中包含“时间”。消费者必须了解这个领域并进行定制处理来应对。例如:“在 2017-12-27T20:00:00Z 开始工作”。您也可以为此使用标头,但目前并非所有客户端都支持标头。
您可以更改发送消息的时间戳。在内部,它仍然会按顺序读取,但是一些暗示时间的函数会以不同的方式工作,并且消费者可以使用消息的时间戳来执行其操作 - 这有点像前面的命题,除了时间戳是事件的一个元数据,而不是事件有效负载本身。我个人不会使用这个 - 我只在代理某些事件时处理时间戳。
对于你的最后一个问题:基本上是的,但有一些注意事项:
- 主题实际上是在分区中分割的,并且顺序仅在分区中保留。所有具有相同密钥的消息都发送到同一分区。
- 大多数时候,您只从内存中读取,除非您读取旧事件 - 在这种情况下,因为这些事件是从磁盘顺序读取的,所以速度非常快
- 您可以选择从哪里开始读取 - 给定的偏移量或给定的时间 - 甚至可以在运行时更改它
- 您可以跨进程并行读取 - 多个消费者可以读取相同的主题,并且不会两次读取相同的消息(每次读取不同的分区,请参阅消费者组)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)