Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 如何决定在spring kafka中设置的并发性?_Apache Kafka_Kafka Consumer Api_Spring Kafka - Fatal编程技术网

Apache kafka 如何决定在spring kafka中设置的并发性?

Apache kafka 如何决定在spring kafka中设置的并发性?,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring Kafka,我正在使用@KafkaListener注释编写一个kafka使用者,我知道有一种方法可以使用ConcurrentKafkaListenerContainerFactory中的方法增加来自不同分区的并发kafka使用者的数量 e.g. factory.setConcurrency(3); Javadoc for setconcurrency是这样说的:- 运行的并发KafkCamessageListenerContainer的最大数目。来自同一分区的消息将按顺序处理。 现在我的问题是 我有一个k

我正在使用@KafkaListener注释编写一个kafka使用者,我知道有一种方法可以使用ConcurrentKafkaListenerContainerFactory中的方法增加来自不同分区的并发kafka使用者的数量

e.g. factory.setConcurrency(3);
Javadoc for setconcurrency是这样说的:-

运行的并发KafkCamessageListenerContainer的最大数目。来自同一分区的消息将按顺序处理。

现在我的问题是

我有一个kafka主题,有144个分区,我们的应用程序需要在其中使用消息,3个应用程序实例正在并行运行

我想知道如何确定需要设置的并发值

ConcurrentKafkaListenerContainerFactory.setconcurrency (<Value>) 
ConcurrentKafkaListenerContainerFactory.setconcurrency()
因此,我们可以在使用消息时实现高吞吐量


我应该使用144/3=48作为并发因子,还是有一个公式来推导这个数字?

是的,您最好在每个实例中将并发设置为
48
,这样每个分区将从使用者组中的唯一线程中使用,并且还可以实现您可以使用的高吞吐量

另一个最好的选择是运行更多的实例,例如14,每个实例的并发级别为10。在这两种方法中,还需要考虑每个实例

的可用CPU。 从1.1版开始,您可以配置@KafkaListener方法来接收从消费者调查中接收到的整批消费者记录。要将侦听器容器工厂配置为创建批处理侦听器,可以设置batchListener属性


是的,您最好在每个实例中将并发性设置为
48
,这样每个分区都将从使用者组中的唯一线程中使用,并实现您可以使用的高吞吐量

另一个最好的选择是运行更多的实例,例如14,每个实例的并发级别为10。在这两种方法中,还需要考虑每个实例

的可用CPU。 从1.1版开始,您可以配置@KafkaListener方法来接收从消费者调查中接收到的整批消费者记录。要将侦听器容器工厂配置为创建批处理侦听器,可以设置batchListener属性


请记住,每个分区不必有一个使用者;您需要多少并发性取决于许多因素,包括但不限于您的代码、任何同步块、任何下游瓶颈(数据库、网络等)。@GaryRussell在开发spring kafka库时,您对我的问题陈述有何建议?@GaryRussell:-假设(试图理解并发性)我将并发保持为1,然后3个实例必须连接到所有142个分区。这意味着每个实例将连接到42个分区,但应用程序线程一次只消耗一条消息,因为并发为1。完成一个处理后,将从42个分区中提取下一条分区消息,并消耗t消息。我的理解正确吗?不可能提供通用的指导-每个环境都不同;您需要进行实验以确定适合您的情况的最佳设置。如果您无法获得所需的吞吐量,则需要分析应用程序以找出瓶颈所在。是的,如果您的并发性为1,一次只能获取一条记录;在从另一个分区获取任何记录之前,一个分区可能会获取多条记录。@Deadpool:-使用具有更大批量大小(如5000)的批处理侦听器不会增加应用程序的堆大小,因为我正在消耗所有记录并将其放入内存中,然后再确认它们。请更正如果我的理解不正确,请记住,每个分区不必有一个使用者;需要多少并发性取决于许多因素,包括但不限于代码、任何同步块、任何下游瓶颈(数据库、网络等)@GaryRussell在开发spring kafka库时,您对我的问题陈述有什么建议吗?@GaryRussell:-假设(试图理解并发性)我将并发保持为1,然后3个实例必须连接到所有142个分区。这意味着每个实例将连接到42个分区,但应用程序线程一次只消耗一条消息,因为并发为1。完成一个处理后,将从42个分区中提取下一条分区消息,并消耗t消息。我的理解正确吗?不可能提供通用的指导-每个环境都不同;您需要进行实验以确定适合您的情况的最佳设置。如果您无法获得所需的吞吐量,则需要分析应用程序以找出瓶颈所在。是的,如果您的并发性为1,一次只能获取一条记录;在从另一个分区获取任何记录之前,一个分区可能会获取多条记录。@Deadpool:-使用具有更大批量大小(如5000)的批处理侦听器不会增加应用程序的堆大小,因为我正在消耗所有记录并将其放入内存中,然后再确认它们。请更正如果我的理解不对?