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