繁体   English   中英

Kafka:生产不同消息速率的数千个主题的吞吐量

[英]Kafka: Throughput of producing to thousands of topics with different message rate

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

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

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

我们可以设置实际ProduceRequest最小大小,即像batch.size ,但对于请求中的整体批次,即与max.request.size相反的东西吗?

或者有什么办法可以增加生产者的吞吐量?

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

  1. Kafka-producer 尝试在开始时分配batch.size * number_of_destination_partitions memory。 如果你有batch.size等于10mb3k主题,每个主题有1分区,Kafka-producer 将需要至少~30gb开始( 源代码)。 所以你拥有的目标分区越多,你需要设置的batch.size就越少,或者你需要的 memory 就越多。 我们选择小batch.size

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

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

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

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

我希望它会有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM