Multithreading 卡夫卡流中的线程分配策略是什么?

Multithreading 卡夫卡流中的线程分配策略是什么?,multithreading,apache-kafka,apache-kafka-streams,Multithreading,Apache Kafka,Apache Kafka Streams,我在代码中做了更多更少的设置: // loop over the inTopicName(s) { KStream<String, String> stringInput = kBuilder.stream( STRING_SERDE, STRING_SERDE, inTopicName ); stringInput.filter( streamFilter::passOrFilterMessages ).map( processor_i ).to( outTopicName );

我在代码中做了更多更少的设置:

// loop over the inTopicName(s) {

KStream<String, String> stringInput = kBuilder.stream( STRING_SERDE, STRING_SERDE, inTopicName );
stringInput.filter( streamFilter::passOrFilterMessages ).map( processor_i ).to( outTopicName );

// } end of loop

streams = new KafkaStreams( kBuilder, streamsConfig );
streams.cleanUp();
streams.start();
//在inTopicName上循环{
KStream stringInput=kBuilder.stream(STRING\u SERDE,STRING\u SERDE,inTopicName);
stringInput.filter(streamFilter::passOrFilterMessages).map(processor_i).to(outTopicName);
//}循环结束
streams=新的KafkaStreams(kBuilder、streamsConfig);
streams.cleanUp();
streams.start();
如果有num.stream.threads>1,如何将任务分配给准备好的和分配好的(循环中的)线程

我假设(我不确定)存在线程池,并且使用某种循环策略将任务分配给线程,但是可以在运行时完全动态地完成任务,也可以通过创建过滤/映射到结构在开始时完成一次任务

特别是当一个主题是计算密集型任务而另一个主题不是时,我很感兴趣。应用程序是否可能会因所有线程都将分配给处理器而耗尽时间

让我们看一下场景:
num.stream.threads=2
no.partitions=4
每个主题,
no.topics=2
(大主题和小主题) 我问题中的循环在应用程序启动时完成一次。如果在循环中我定义了两个主题,我知道从一个主题来的消息是重的(大的主题),而从另一个主题来的消息是轻的(小的主题)。 num.stream.threads中的两个线程是否都可能只忙于从大型主题提交的任务?来自Slim_主题的消息必须等待处理

如果有num.stream.threads>1,则任务如何分配给 准备和分配(循环中)线程

使用分区分组将任务分配给线程。你可以读到它。好吧,这是在重新平衡后调用的,所以这不是一个非常动态的过程。也就是说,我认为没有饥饿的选择

如果有num.stream.threads>1,则任务如何分配给 准备和分配(循环中)线程


使用分区分组将任务分配给线程。你可以读到它。好吧,这是在重新平衡后调用的,所以这不是一个非常动态的过程。也就是说,我认为没有饥饿的选择。

在内部,Kafka流基于分区创建任务。继续循环示例,假设有3个输入主题A、B、C,分别有2、4和3个分区。为此,您将获得4个任务(即,所有主题上的最大分区数),分区到任务分配如下:

  • t0:A-0,B-0,C-0
  • t1:A-1,B-1,C-1
  • t2:B-2,C-2
  • t3:B-3
分区“按编号”分组并分配给相应的任务。这是在运行时确定的(即,在调用
KafakStreams#start()
)之后),因为在此之前,每个主题的分区数是未知的

如果您不了解Kafka流的所有内部细节,建议不要弄乱分组的分区——您很容易破坏这些内容(此接口已被弃用,将在即将发布的3.0版本中删除。)

关于线程:任务限制线程的数量。对于我们的示例,这意味着您最多可以有4个线程(如果您有更多线程,那么这些线程将处于空闲状态,因为没有剩余的任务用于线程分配)。如何“分发”这些线程取决于您。您可以拥有4个单线程应用程序实例的4个单线程应用程序实例,其中一个应用程序实例具有4个线程(或介于两者之间的任何内容)


如果您的任务数少于线程数,则会根据任务数以负载平衡的方式分配任务(假定所有任务都具有相同的负载)。

在内部,Kafka Streams基于分区创建任务。继续循环示例,假设有3个输入主题A、B、C,分别有2、4和3个分区。为此,您将获得4个任务(即,所有主题上的最大分区数),分区到任务分配如下:

  • t0:A-0,B-0,C-0
  • t1:A-1,B-1,C-1
  • t2:B-2,C-2
  • t3:B-3
分区“按编号”分组并分配给相应的任务。这是在运行时确定的(即,在调用
KafakStreams#start()
)之后),因为在此之前,每个主题的分区数是未知的

如果您不了解Kafka流的所有内部细节,建议不要弄乱分组的分区——您很容易破坏这些内容(此接口已被弃用,将在即将发布的3.0版本中删除。)

关于线程:任务限制线程的数量。对于我们的示例,这意味着您最多可以有4个线程(如果您有更多线程,那么这些线程将处于空闲状态,因为没有剩余的任务用于线程分配)。如何“分发”这些线程取决于您。您可以拥有4个单线程应用程序实例的4个单线程应用程序实例,其中一个应用程序实例具有4个线程(或介于两者之间的任何内容)


如果任务数少于线程数,则将根据任务数以负载平衡的方式分配任务(假定所有任务都具有相同的负载)。

谢谢您的回答。它正在休息。如果每个主题有10个分区,那么num.stream.threads参数用于什么?一个应用程序中可以有多个处理线程,并且可以有多个应用程序实例。最终你有决定权,而不是卡夫卡。卡夫卡文档的线程建模部分有更多细节(合流部分):我知道你提到的页面:-)。我通过添加示例扩展了我的问题。谢谢你的回答。它正在休息。如果每个主题都有10个分区,那么num.stream.threads参数是什么呢