【问题标题】:Delayed message consumption in KafkaKafka中的延迟消息消费
【发布时间】:2018-06-08 01:38:45
【问题描述】:

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

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

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

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

    你到底想达到什么目的?

    在您的情况下的一些可能性:

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

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

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

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

    • 主题实际上是在分区中拆分的,顺序只保留在分区中。所有具有相同密钥的消息都发送到同一个分区。
    • 大多数时候,您只从内存中读取,除非您读取旧事件 - 在这种情况下,由于这些事件是从磁盘中顺序读取的,因此速度非常快
    • 您可以选择从哪里开始读取 - 给定的偏移量或给定的时间 - 甚至可以在运行时更改它
    • 您可以跨进程并行读取 - 多个使用者可以读取相同的主题,并且不会两次读取相同的消息(每次读取不同的分区,请参阅使用者组)

    【讨论】:

    • 非常感谢您的解释!我正在重新考虑我关于延迟消息传递的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多