生成批处理消息
Producing a batch message
假设有一个批次 API 用于执行任务 List[T]。为了完成这项工作,所有任务都需要推送到卡夫卡。有两种方法可以做到这一点:
1) 在kafka中将List作为消息推送
2)在kafka中推送个人任务T
我相信方法 1 会更好,因为我不必为单个批处理调用多次将消息推送到 kafka。有人可以告诉我这种方法是否有任何危害?
Kafka 生产者可以在短时间内将发送的单个消息批处理 window(特定配置为 linger.ms
),因此发送单个消息的成本可能比您想象的要低很多.
可能需要考虑的更重要的因素是消费者将如何消费消息。例如,如果消费者无法处理其中一项任务,应该怎么办?如果消费者只是要调用其他一些基于批处理的 API ,它作为一个批处理成功或失败,那么包含任务列表的单个消息将是一个非常合适的选择。另一方面,如果消费者最终必须单独处理任务,那么发送单独的消息可能更合适,并且可能会让您不必在消费者中实施某种重试逻辑,因为您可以将 Kafka 配置为与你需要的语义。
从 Kafka v0.11 开始,您还可以在生产者中使用事务以原子方式发布整个批次。即您开始交易,然后逐条消息发布您的任务消息,最后您提交交易。即使消息可以分批发送到 kafka,只要您的消费者 运行 处于读取提交模式,它们只会在您提交事务后对消费者可见。
选项 1 是 Kafka 中的首选方法,只要整个批次始终保持在一起。如果您将记录列表作为批次发布,那么它们将作为批次存储,它们将(可选)作为批次压缩以产生更好的压缩,并且它们将被消费者作为批次获取,从而产生更少的获取请求。
如果您发送单独的消息,那么您将必须给它们一个公共密钥,否则它们将分散在不同的分区中,并且可能会乱序发送,或者发送给消费者组的不同消费者。
假设有一个批次 API 用于执行任务 List[T]。为了完成这项工作,所有任务都需要推送到卡夫卡。有两种方法可以做到这一点:
1) 在kafka中将List作为消息推送 2)在kafka中推送个人任务T
我相信方法 1 会更好,因为我不必为单个批处理调用多次将消息推送到 kafka。有人可以告诉我这种方法是否有任何危害?
Kafka 生产者可以在短时间内将发送的单个消息批处理 window(特定配置为 linger.ms
),因此发送单个消息的成本可能比您想象的要低很多.
可能需要考虑的更重要的因素是消费者将如何消费消息。例如,如果消费者无法处理其中一项任务,应该怎么办?如果消费者只是要调用其他一些基于批处理的 API ,它作为一个批处理成功或失败,那么包含任务列表的单个消息将是一个非常合适的选择。另一方面,如果消费者最终必须单独处理任务,那么发送单独的消息可能更合适,并且可能会让您不必在消费者中实施某种重试逻辑,因为您可以将 Kafka 配置为与你需要的语义。
从 Kafka v0.11 开始,您还可以在生产者中使用事务以原子方式发布整个批次。即您开始交易,然后逐条消息发布您的任务消息,最后您提交交易。即使消息可以分批发送到 kafka,只要您的消费者 运行 处于读取提交模式,它们只会在您提交事务后对消费者可见。
选项 1 是 Kafka 中的首选方法,只要整个批次始终保持在一起。如果您将记录列表作为批次发布,那么它们将作为批次存储,它们将(可选)作为批次压缩以产生更好的压缩,并且它们将被消费者作为批次获取,从而产生更少的获取请求。
如果您发送单独的消息,那么您将必须给它们一个公共密钥,否则它们将分散在不同的分区中,并且可能会乱序发送,或者发送给消费者组的不同消费者。