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参数是什么呢