Spring boot Kafka使用1键或多键流传输性能

Spring boot Kafka使用1键或多键流传输性能,spring-boot,apache-kafka,apache-kafka-streams,spring-kafka,Spring Boot,Apache Kafka,Apache Kafka Streams,Spring Kafka,我使用的是1.5.4 spring boot、Java8和kafka 2.2.0版本。我有5个代理和4个不同的主题,每个主题有50个分区 我有一个这样的系统: 我有200万或300万张唱片。我在每封卡夫卡的邮件上输出2500份记录。我的意思是1条卡夫卡消息由2500条记录组成,但我使用的是同一个密钥,这意味着所有这些记录都会进入同一个分区。我使用的压缩主题也有2-3百万条记录,我使用的是ktable-kstream连接并收集另一条记录。(此记录具有不同的密钥,如Id,以便重新分区)此联接操作后,

我使用的是1.5.4 spring boot、Java8和kafka 2.2.0版本。我有5个代理和4个不同的主题,每个主题有50个分区

我有一个这样的系统:

我有200万或300万张唱片。我在每封卡夫卡的邮件上输出2500份记录。我的意思是1条卡夫卡消息由2500条记录组成,但我使用的是同一个密钥,这意味着所有这些记录都会进入同一个分区。我使用的压缩主题也有2-3百万条记录,我使用的是ktable-kstream连接并收集另一条记录。(此记录具有不同的密钥,如Id,以便重新分区)此联接操作后,我将返回到原始密钥进行重新分区。我的kafka流式代码侦听此主题,并执行重新分区和联接操作,如3次重新分区和2次联接操作,但正如我所说,在上述操作之后,所有这些主题消息都使用相同的键。我的spring boot应用程序由每个应用程序10个concurreny组成,我有5个spring boot应用程序的副本

总结:5个代理+4个不同的主题+内部主题,但我的所有操作都使用相同的键,这意味着所有消息都将始终转到1个分区

假设我使用密钥作为

我的问题是,如果我用不同的键将消息分发到不同的分区(现在我有键A1、A2、A3、A4…A50),我能获得好的性能吗?它的利弊是什么?我的意思是,如果我使用1个分区,卡夫卡在服务器上使用的磁盘操作是否更少,网络成本是否更低?因为我的连接操作在同一个分区上?kafka在使用1个分区进行连接操作时是否能够更快地到达和读取消息?因为它可能不同于将消息分发到50个分区,并且可能很难从不同的分区、不同的机器和不同的分区读取消息。我应该认为不同的分区可以在其他服务器上,我是说其他代理?这是网络成本吗

因为使用了相同的键,所以我所有关于内部主题的消息都会进入相同的分区,对吗?并且只有一个线程可以从该分区中使用

如果我分配到50个分区,我将以50个分区的形式进行批处理,并分配到50个分区,那么我的代码性能是否会像x2 x3 x4倍那样提高?我能知道你的想法吗

我的问题是,如果我用不同的密钥将消息分发到 不同的分区(现在我有键A1,A2,A3,A4…A50)我能得到好的吗 表演

增加分区可以提高性能。一般来说,一个800字节的msg,一个分区可以提供24k msg/秒。如果你有两个部分,这将成为48k毫秒/秒

它的利弊是什么?我的意思是如果我使用1个分区,是吗 kafka在服务器机器上使用更少的磁盘操作和更少的网络 成本

唯一的缺点是你失去了跨分区的MSG排序

因为我的连接操作在同一个分区上?卡夫卡到达了吗 &使用1个分区执行联接操作时,是否可以更快地读取消息

kafka使用者并行读取每个分区。这意味着jvm1上可能有一个消费者在使用partition1;jvm 2上的使用者2并行使用分区2。另外,耗电元件1和耗电元件2不需要以相同的速度耗电