Kafka中的消息延迟消耗

时间:2017-12-27 11:51:13

标签: apache-kafka kafka-consumer-api

如何使用Apache Kafka生成/使用延迟消息?似乎标准的Kafka(和Java kafka-client)功能没有此功能。我知道我可以使用标准的等待/通知机制自己实现它,但它似乎不太可靠,所以任何建议和良好实践都会受到赞赏。

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

2 个答案:

答案 0 :(得分:3)

实际上,kafka最低结构是一个分区,它是具有增量偏移的队列中的顺序事件 - 您不能在生成日志时将日志插入到结尾之外的任何位置。没有延迟消息的概念。

您想要达到什么目标?

您的案例有一些可能性:

  • 您希望在特定时间推送消息(例如,事件“开始作业”)。在这种情况下,使用计划任务(不是来自kafka,在您的操作系统/语言/自定义应用程序/等等上使用某种标准方式)在给定时间发送消息 - 消费者将在适当的时间收到它们。

  • 您想立即发送一个事件,但消费者现在不应该考虑这个事件。在这种情况下,您可以使用自定义结构,该结构在其有效负载中包含“时间”。消费者必须了解这个领域,并有自定义处理来处理它。例如:“在2017-12-27T20:00:00Z开始工作”。您也可以使用标头,但目前所有客户端都不支持标头。

  • 您可以更改已发送邮件的时间戳。在内部,它仍然会按顺序读取,但是一些暗示时间的函数会以不同的方式工作,并且消费者可以使用消息的时间戳来执行其操作 - 这有点像以前的命题,除了时间戳是事件的一个元数据,而不是事件有效载荷本身。我不会亲自使用它 - 当我代理某些事件时,我只处理时间戳。

对于你的上一个问题:基本上,是的,但有一些注意事项:

  • 主题实际上是在分区中拆分的,订单只保留在分区中。具有相同密钥的所有消息都将发送到同一分区。
  • 大部分时间,你只读内存,除非你读旧事件 - 在这种情况下,因为那些是从磁盘顺序读取的,这是非常快的
  • 您可以选择开始阅读的位置 - 给定偏移量或给定时间 - 甚至可以在运行时更改
  • 您可以跨进程并行化读取 - 多个消费者可以读取相同的主题,并且永远不会读取相同的消息两次(每个读取不同的分区,请参阅消费者组)

答案 1 :(得分:-3)

配置消费者本身可能是解决此问题的方法。

使用波纹管配置属性值#

max.poll.interval.ms
max.poll.records
fetch.max.wait.ms

或根据要求。

consumer configuration