【问题标题】:Producing a batch message生成批处理消息
【发布时间】:2017-07-09 03:52:00
【问题描述】:

假设有一个批处理 API 用于执行任务 List[T]。为了完成这项工作,所有任务都需要推送到 kafka。有两种方法可以做到这一点:

1) 推送列表作为 kafka 中的消息 2)在kafka中推送单个任务T

我相信方法 1 会更好,因为我不必为单个批处理调用多次将消息推送到 kafka。有人可以告诉我这种方法是否有任何危害?

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    Kafka 生产者可以将在短时间内发送的单个消息批处理在一起(特定配置为linger.ms),因此发送单个消息的成本可能比您想象的要低很多。

    可能需要考虑的一个更重要的因素是消费者将如何消费消息。例如,如果消费者无法处理其中一项任务,应该怎么办?如果消费者只是要调用其他基于批处理的 API,该 API 作为批处理成功或失败,则包含任务列表的单个消息将非常适合。另一方面,如果消费者最终必须单独处理任务,那么发送单独的消息可能更合适,并且可能会使您不必在消费者中实现某种重试逻辑,因为您可能可以配置 Kafka 以使其行为您需要的语义。

    【讨论】:

    • 非常感谢汤姆 :)
    • linger.ms 和事务是否一起工作?或者我可以在 kafka 中定义 Exactly-once 交付批次吗?
    【解决方案2】:

    从 Kafka v0.11 开始,您还可以使用生产者中的事务以原子方式发布整个批次。即您开始交易,然后逐条发布您的任务消息,最后您提交交易。尽管消息可以分批发送到 kafka,但它们只有在您提交事务后才会对消费者可见,只要您的消费者在读提交模式下运行。

    【讨论】:

    • 非常感谢迈克尔 :)
    【解决方案3】:

    选项 1 是 Kafka 中的首选方法,只要整个批次应始终保持在一起。如果您将记录列表作为批处理发布,那么它们将作为批处理存储,它们将(可选)作为批处理压缩以产生更好的压缩,并且它们将被消费者作为批处理获取,从而产生更少的获取请求。

    如果您发送单独的消息,那么您必须为它们提供一个公共密钥,否则它们将分散在不同的分区上,并且可能会乱序发送,或者发送给消费者组的不同消费者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2016-03-21
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多