为什么使用消费者组
负载均衡
- 消费者组机制可以将一个主题的消息负载均衡到多个消费者实例上,提高了整体系统的吞吐量和扩展性
- 当有新的消费者加入或退出组时,kafka 都会自动触发平衡机制,确保分区保持合理分配
状态隔离
- 每个消费者组都有自己独立的消费位移(offset),互不干扰,这确保了不同业务场景的状态隔离,提高了系统的可维护性及可靠性
- 可针对不同的业务需求,创建独立的消费组,实现更合理或更符合业务需求的状态管理
通过消费者组,Kafka 可以实现消息的负载均衡和消费者的水平扩展,从而处理大规模的实时数据流和实现高吞吐量的消息处理。
配置消费者组的传统方式
- 在配置文件中硬编码 group-id
spring.kafka.consumer.group-id=my-group
- 在消费者类中使用 Spring kafka 提供的
@KafkaListener
注解:
@KafkaListener(topic = "my-topic", groupId = "my-group")
public void consume(String message){
//处理消息逻辑
}
此处的groupId
即以上在配置文件中配置的消费者组 id
存在的问题
- 配置方式:在应用程序的配置文件中,需要手动指定 Kafka 消费者组的 id。但当我们需要配置多个消费者组或消费者组的数量无法在应用程序运行前知晓时,此时便陷入了困境。
- 扩展性:如果需要动态扩展应用程序的消费者实例数量,又需要我们手动修改配置,增加了复杂度。
- 资源竞争:如若我们只使用一个或少量的消费者组,多个应用实例同时使用了相同的消费者消费者组 id,他们可能会争抢同一批分区,可能会导致资源竞争和状态干扰
Kafka 的消费者组机制是非常重要的组成部分,但其传统的配置方式存在一些局限性,这就需要我们找寻更为灵活可靠的方式来配置多个消费者组。