gpt4 book ai didi

apache-kafka - 卡夫卡 : Throughput of producing to thousands of topics with different message rate

转载 作者:行者123 更新时间:2023-12-05 05:31:48 25 4
gpt4 key购买 nike

任务是将消息从一个巨大的源主题路由到许多(几千个)目标主题。总体速率约为每秒几百万条记录。它现在几乎无法处理此类负载,我们正在寻找优化它的解决方案。但是,它似乎没有达到硬件或网络级别的任何限制,所以我认为它可以改进。延迟并不重要(几分钟延迟就可以),平均消息大小小于 1 KiB。

增加吞吐量最明显的方法是使 batch.sizelinger.ms 更大。但问题是目标主题中的消息速率不同:取决于消息目标,速率可能从每秒几条消息到每秒数十万条消息不等。

据我了解(如果我错了,请纠正我),但是 batch.size 是每个分区的参数。因此,如果我们将 batch.size 设置得太大,我们就会耗尽内存,因为它乘以了许多目标主题,即使它们都只有一个分区。否则,如果 batch.size 较小,则生产者将过于频繁地向代理发送请求。在每个应用程序实例中,我们为所有目标主题使用一个生产者(ProduceRequest 可以包含不同主题的批处理)。为每个主题设置不同的参数的唯一方法是为每个主题使用单独的生产者,但这意味着数千个线程和许多上下文切换。

我们能否设置实际 ProduceRequest最小 大小,即像 batch.size,但对于请求中的整体批处理,即某些东西与 max.request.size 相对?

或者有什么办法可以提高producer的吞吐量?

最佳答案

问题看起来可以解决,而且我们似乎已经解决了。 Kafka 流到 3k 主题不是什么大问题,但是有一些事情你应该注意:

  1. Kafka-producer 尝试在开始时分配 batch.size * number_of_destination_partitions 内存。如果您的 batch.size 等于 10mb3k 主题,每个主题有 1 分区,Kafka-producer 将需要至少 ~30gb 开始 ( source code )。因此,您拥有的目标分区越多,您需要设置的 batch.size 就越少,或者您需要的内存就越大。我们选择了小的 batch.size

  2. 每个目标主题的消息速率不会影响总体性能。 Kafka 生产者为每个请求发送多个批处理。这里 max.request.size 发挥作用( source codemaxSizemax.request.size)。 max.request.size 越高,每个请求可以发送的批处理越多。重要的是要了解达到 batch.sizelinger.ms 不会立即触发向代理发送批处理。一旦批处理达到 batch.sizelinger.ms,它就会被标记为可发送,稍后将与其他批处理一起处理 (source code)。此外,batch.sizelinger.ms 并不是将批处理标记为可发送的唯一原因(查看前面的链接)。这是实际发送批处理的地方(source code)。这就是为什么不需要每个目标主题的相同事件率,但仍然存在一些细微差别,接下来将进行描述。

    2.1。关于 linger.ms 的几句话。不能确定它在这种情况下的作用。一方面,它越大,Kafka 生产者等待收集确切分区的消息的时间就越长,并且每个请求将发送该分区的更多数据。另一方面,似乎它越少,不同分区的更多批处理就可以打包到一个请求中。虽然不确定如何做得更好。

  3. 尽管 Kafka-producer 能够为每个请求发送多个批处理,但它不能为一个特定分区的每个请求发送多个批处理。这就是为什么如果目标主题的消息速率偏斜,则必须增加大多数加载主题的分区数以增加吞吐量。但始终有必要记住,分区数的增加会导致内存使用量的增加。

实际上,上面的信息帮助我们解决了性能问题。但可能还有其他我们还不知道的细微差别。

希望有用。

关于apache-kafka - 卡夫卡 : Throughput of producing to thousands of topics with different message rate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74275706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com