Spring Boot中如何使两个@KafkaListener监听同一Topic并均触发执行?
解决同一Topic下两个@KafkaListener方法仅触发一个的问题
这个问题我之前做Kafka相关项目时也踩过坑,核心是对Kafka消费者组的机制理解不到位!
核心原因
Kafka的消费者组规则很明确:同一个消费者组(groupId相同)内的消费者会共同分摊监听Topic的分区。如果你的vijay Topic只有1个分区,那同一时刻只有一个消费者(也就是你的其中一个@KafkaListener方法)能获取到消息,自然只会触发其中一个方法。
两种可行解决方案
方案1:给两个Listener设置不同的groupId(推荐,满足“每条消息都被两个方法处理”的需求)
如果你的业务要求每条消息都必须被两个方法执行处理,那最简单直接的方式就是让两个Listener归属不同的消费者组。修改代码如下:
类A的方法:
@KafkaListener(topics = "vijay", groupId = "group_id_a") public void consumeMethodOne(String jsonString) { System.out.println("ConsumerPrice1-->" + jsonString); }
类B的方法:
@KafkaListener(topics = "vijay", groupId = "group_id_b") public void consumeMethodTwo(String jsonString) { // 建议修改输出标识,方便区分是哪个方法触发的 System.out.println("ConsumerPrice2-->" + jsonString); }
这样两个Listener会作为独立的消费者组,各自消费整个Topic的所有消息,每条消息都会被两个方法依次处理。
方案2:保持同一groupId,给Topic增加分区并配置并发(适用于负载分摊场景)
如果业务上必须使用同一个groupId,且只是想让两个方法都能分到消息(不是每条消息都触发两个方法),那需要两步操作:
- 先给
vijayTopic增加至少2个分区(可以通过Kafka命令行或管理工具完成修改) - 给@KafkaListener配置
concurrency参数,或者在全局配置中设置消费者并发数。示例:
@KafkaListener(topics = "vijay", groupId = "group_id", concurrency = "2")
不过这种方式下,消息会按分区分发到不同的Listener实例,每条消息只会被其中一个方法处理,适合做消费负载分摊,而非重复消费。
额外小提示
你代码里类B的方法输出和类A完全一致,建议修改成不同的标识,这样测试时能直观看到两个方法都被成功触发了。
内容的提问来源于stack exchange,提问作者vijayk
相关产品推荐
相关产品推荐

