kafka 消费者组与重平衡与offset

消费者组

  1. 消费能力不足时,可以在消费者组,扩展消费者
  2. 一个topic 可以被多个消费者组消费
  3. 消费者是消费组的一部分。消费组保证每个分区只能被一个消费者使用,避免重复消费
  4. 单个Partition只能由消费者组中某个消费者消费
  5. 消费者数量不应该大于主题的分区数量,因为没有意义
  6. 消费者都隶属于同一个消费组,相当于点对点模型
  7. 消费者都隶属于不同的消费组,相当于发布/订阅模式的应用

分区与消费者组关系

 重平衡

  1. 特别耗性能,所以能不做就不做
  2. 重平衡操作会正消费者暂停消费。什么也干不了,影响吞吐

触发时机

  1. 新增或删除消费者
  2. 消费者订阅的主题信息发生变化
  3. 主题的分区发生了变化

避免

  1. session.timout.ms:控制心跳超时时间
  2. heartbeat.interval.ms:控制发送心跳的频率,频率越高越不容易被误判,但也会消耗更多资源
  3. max.poll.interval.ms:控制poll的间隔

消费者poll数据后,需要一些处理,再进行拉取

如果两次拉取时间间隔超过这个参数设置的值,那么消费者就会被踢出消费者组

默认值是5分钟,而如果消费者接收到数据后会执行耗时的操作,则应该将其设置得大一些

推荐设置

  1. session.timout.ms:设置为6s
  2. heartbeat.interval.ms:设置2s
  3. max.poll.interval.ms:推荐为消费者处理消息最长耗时再加1分钟

导致的重复消费

Consumer 每 5s 提交 offset

假设提交 offset 后的 3s 发生了 Rebalance

Rebalance 之后的所有 Consumer 从上一次提交的 offset 处继续消费

因此 Rebalance 发生前 3s 的消息会被重复消费

offset

  1. 由于consumer在消费过程中可能会出现断电宕机等故障,consumer恢复后,需要从故障前的位置的继续消费,所以consumer需要实时记录自己消费到了哪个offset,以便故障恢复后继续消费。
  2. __consumer_offsets主题中保存各个消费组的偏移量。
  3. 位移是提交到Kafka中的 __consumer_offsets 主题。 __consumer_offsets 中的消息保存了每个消费组某一时刻提交的offset信息。配置了compact策略,使得它总是能够保存最新的位移信息,既控制 了该topic总体的日志容量,也能实现保存最新offset的目的。
  4. 消费者通过偏移量来区分已经读过的消息,从而消费消息

在Spring Boot中,Kafka消费者通过消费组(Consumer Group)来管理消息的消费。消费组允许多个消费者实例共享同一个主题上的消息,这样可以实现负载均衡并避免重复消费。以下是消费组管理的关键点: 1. **分区分配**: 每个主题在Kafka中被划分为多个分区。Spring Boot的`KafkaConsumer`自动跟踪每个分区的分配情况,确保多个消费者实例均匀地接收分区。 ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; @KafkaListener(topics = "my-topic") public void consume(String message, @Header(KafkaHeaders.GROUP_ID) String groupId) { // ... } ``` 在上面的代码中,`@KafkaListener`会自动配置分区分配策略,监听名为"my-topic"的主题。 2. **消费模式**: Spring Boot提供了多种消费模式,如`CONSUMER`, `LEADER_ONLY`等,其中`CONSUMER`是最常见的,它按照顺序消费消息,直到消费者离开或手动取消订阅。 ```java @Configuration public class KafkaConfig { @Bean public ConsumerFactory<String, String> consumerFactory() { // 设置消费模式为顺序消费 Map<String, Object> props = new HashMap<>(); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); return new DefaultKafkaConsumerFactory<>(props); } } ``` 3. **消费组ID**: 消费者实例需要提供一个唯一的`GROUP_ID`,这决定了哪些消费者实例属于同一组。如果两个消费者具有相同的`GROUP_ID`,它们会协同工作,共同消费主题的消息。 4. **消息确认**: 消费者在接收到消息后发送一个确认,告诉Kafka已经成功处理了消息。这有助于保证消息不会丢失,并防止重复消费。 5. **监控与扩展**: Spring Boot提供了对消费者性能的监控工具,如`@KafkaMetricsListener`。随着生产系统的扩展,可以通过增加消费者实例数量来平衡负载。 **相关问题--:** 1. 如何在Spring Boot中设置自定义的消费策略? 2. 如何处理消费者组内的失败重试机制? 3. Spring Boot的Kafka消费者如何实现流量控制?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值