繁体   English   中英

Spring Kafka - 所有主题进入同一个消费者

[英]Spring Kafka - All topics into the same consumer

我正在尝试使用相同的 @KafkaListener 实现从 Kafka 消费多个主题,但我希望每个主题都有一个消费者(每个主题只有一个分区)。 为了做到这一点我创建了一个@KafkaListenertopicPattern="topic1|topic2|topic3"和并发3和的groupId一个ConcurrentKafkaListenerContainerFactory consumer_group 问题是所有主题都分配给同一个消费者,而其他 2 个消费者变得空闲,如以下日志所示:

21:49:13.140 [org.springframework.kafka.KafkaListenerEndpointContainer#0-1-C-1] INFO oakcciConsumerCoordinator - Setting newly assigned partitions [] for group consumer_group 21:49:13.140 [org.springframework.kafka.KafkaListenerEndpointContainer#0-2-C-1] INFO oakcciConsumerCoordinator - Setting newly assigned partitions [] for group consumer_group 21:49:13.141 [org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1] INFO oakcciConsumerCoordinator - Setting newly assigned partitions [topic1, topic2, topic3] for group consumer_group

如何提示 Spring Kafka 将每个主题传播给不同的消费者?

干杯

每个消费者使用不同的 GroupID。 由于您的所有 3 个消费者都在同一组中,因此他们将从一个主题中划分分区。 由于每个主题有 1 个分区,因此只有一个消费者可以分配它。

也不要在 subscribe 调用中包含每个主题,只包含每个消费者中想要的主题。

在 KAFKA 网站上阅读更多信息。 他们非常清楚地涵盖了这一点。

替代方案:保持相同的组 ID,但让每个消费者只订阅它想要的主题

并发消息侦听器容器将创建 3 个具有相同组 ID 的消费者; 那是设计使然。 为了做你想做的事,你需要 3x @KafkaListener ,每个主题一个; 当然,它们可以委托给相同的方法。

@KafkaListener(topic = ...)
public void l1(...) {
    doListen(...);
}

@KafkaListener(topic = ...)
public void l2(...) {
    doListen(...);
}

@KafkaListener(topic = ...)
public void l3(...) {
    doListen(...);
}

private void doListen(...) {
    ...
}

尝试将分区分配策略更改为循环(或粘性)。 由于您使用的是弹簧:

props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RoundRobinAssignor.class.getName());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM