假设有一个用于执行任务列表[t]的批处理api。为了完成这项工作,所有的任务都需要推给Kafka。有两种方法:1) kafka中的消息推送列表2)kafka中的推送单个任务t我相信方法1会更好,因为我不必为一个批处理调用多次将消息推送到Kafka。有人能告诉我这样做有什么坏处吗?
41zrol4v1#
从kafkav0.11开始,您还可以使用producer中的事务以原子方式发布整个批处理。i、 e.开始事务,然后逐个消息发布任务,最后提交事务。即使这些消息可以分多批发送到kafka,但只有在您提交事务后,只要您的消费者以read committed模式运行,它们才会对消费者可见。
pinkon5k2#
选项1是Kafka的首选方法,只要整个批次始终保持在一起。如果将记录列表发布为一个批,则它们将存储为一个批,它们将(可选)压缩为一个可产生更好压缩的批,并且消费者将获取它们作为一个可产生较少获取请求的批。如果您发送单个消息,则必须给它们一个公共密钥,否则它们将分散在不同的分区上,可能会无序发送,或者发送到某个消费组的不同消费者。
a2mppw5e3#
kafka生产者可以将短时间内发送的单个消息批处理在一起(特定的配置是 linger.ms ),因此发送单个消息的成本可能比您想象的要低得多。可能需要考虑的一个更重要的因素是消费者将如何消费消息。例如,如果使用者不能处理其中一个任务,应该怎么办?如果使用者只是想调用其他基于批处理的api,它作为一个批处理成功或失败,那么包含任务列表的单个消息就非常适合了。另一方面,如果使用者最终必须单独处理任务,那么发送单独的消息可能更合适,并且可能会使您不必在使用者中实现某种重试逻辑,因为您可能可以配置kafka以使用所需的语义。
linger.ms
3条答案
按热度按时间41zrol4v1#
从kafkav0.11开始,您还可以使用producer中的事务以原子方式发布整个批处理。i、 e.开始事务,然后逐个消息发布任务,最后提交事务。即使这些消息可以分多批发送到kafka,但只有在您提交事务后,只要您的消费者以read committed模式运行,它们才会对消费者可见。
pinkon5k2#
选项1是Kafka的首选方法,只要整个批次始终保持在一起。如果将记录列表发布为一个批,则它们将存储为一个批,它们将(可选)压缩为一个可产生更好压缩的批,并且消费者将获取它们作为一个可产生较少获取请求的批。
如果您发送单个消息,则必须给它们一个公共密钥,否则它们将分散在不同的分区上,可能会无序发送,或者发送到某个消费组的不同消费者。
a2mppw5e3#
kafka生产者可以将短时间内发送的单个消息批处理在一起(特定的配置是
linger.ms
),因此发送单个消息的成本可能比您想象的要低得多。可能需要考虑的一个更重要的因素是消费者将如何消费消息。例如,如果使用者不能处理其中一个任务,应该怎么办?如果使用者只是想调用其他基于批处理的api,它作为一个批处理成功或失败,那么包含任务列表的单个消息就非常适合了。另一方面,如果使用者最终必须单独处理任务,那么发送单独的消息可能更合适,并且可能会使您不必在使用者中实现某种重试逻辑,因为您可能可以配置kafka以使用所需的语义。