Apache kafka 如何决定在spring kafka中设置的并发性?
我正在使用@KafkaListener注释编写一个kafka使用者,我知道有一种方法可以使用ConcurrentKafkaListenerContainerFactory中的方法增加来自不同分区的并发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
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)的批处理侦听器不会增加应用程序的堆大小,因为我正在消耗所有记录并将其放入内存中,然后再确认它们。请更正如果我的理解不对?