Spring boot spring kafka KafkaListener中的并行处理和自动缩放
我使用SpringKafka来使用来自两个kafka主题的消息,这两个主题发送的消息格式与下面相同Spring boot spring kafka KafkaListener中的并行处理和自动缩放,spring-boot,apache-kafka,kafka-consumer-api,spring-kafka,autoscaling,Spring Boot,Apache Kafka,Kafka Consumer Api,Spring Kafka,Autoscaling,我使用SpringKafka来使用来自两个kafka主题的消息,这两个主题发送的消息格式与下面相同 @KafkaListener(topics = {"topic_country1", "topic_country2"}, groupId = KafkaUtils.MESSAGE_GROUP) public void onCustomerMessage(String message, Acknowledgment ack) throws Exception { l
@KafkaListener(topics = {"topic_country1", "topic_country2"}, groupId = KafkaUtils.MESSAGE_GROUP)
public void onCustomerMessage(String message, Acknowledgment ack) throws Exception {
log.info("Message : {} is received", message);
ack.acknowledge();
}
- KafkaListener是否可以根据自己监听的主题数量和并行处理两个主题中的消息来分配使用者线程的数量?或者它不支持并行处理,消息必须在主题中等待一条消息得到处理
- 如果主题中的消息数更高,我需要自动缩放微服务以启动新实例(直到分区数)。从KafkaListener的角度来看,我可以依靠哪些参数(CPU、内存)来确定主题中的消息数量较高?(即,在API中,我可以通过监视HTTP延迟来自动扩展服务)
并发
属性以运行更多线程;但是每个分区只能由一个线程处理。要增加并发性,必须增加每个主题中的分区数。在同一个侦听器中侦听多个主题时,如果这些主题只有一个分区,则可能无法获得所需的并发性,除非更改kafka使用者分区赋值器
看
当收听多个主题时,默认的分区分布可能不是您所期望的。例如,如果您有三个主题,每个主题有五个分区,并且您希望使用concurrency=15,那么您只会看到五个活动使用者,每个使用者从每个主题分配一个分区,而其他10个使用者处于空闲状态。这是因为默认的Kafka PartitionAssignor是RangeSignator(参见其Javadoc)。对于这种情况,您可能需要考虑使用RoNoDRIN分配器,而不是将分区分配给所有的消费者。然后,为每个消费者分配一个主题或分区
如果我错了,请纠正我。如果我将并发级别设置为15并运行两个实例,那么第二个实例的侦听器将处于空闲状态?创建新线程以分配给分区的步骤我的要求是分配给主题。i、 e如果@KafkaListener侦听两个分区,那么应该有两个线程并行使用。可能吗?另外,可以考虑哪些参数来衡量自动伸缩的高消息量?我创建了两个主题,每个主题有6个分区,并使用相同的侦听器(并发性=2)侦听主题。在这种情况下,即使侦听器创建了两个线程,该线程的分配在两个组的分区中也是随机的。不会根据主题分配线程。您可以实现自己的
分区赋值器
,也可以简单地向方法添加两个@KafkaListener
注释,每个注释获得一个主题;然后,您将获得所需的分布。