Skip to content

消费者组 ​

工作原理 ​

消费者组实现消息的负载均衡和容错。

Group: my-group
├── Consumer 1: Partition 0, 1
└── Consumer 2: Partition 2, 3

Rebalance(重平衡) ​

消费者加入/离开时重新分配分区。

触发条件 ​

  • 消费者加入/离开
  • Topic 分区数变化
  • 订阅主题变化

策略 ​

go
config := sarama.NewConfig()

// Range策略(默认)
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange

// RoundRobin策略
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRoundRobin

// Sticky策略(推荐)
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategySticky

Offset 管理 ​

自动提交 ​

go
config.Consumer.Offsets.AutoCommit.Enable = true
config.Consumer.Offsets.AutoCommit.Interval = time.Second

手动提交 ​

go
func (h *ConsumerHandler) ConsumeClaim(session sarama.ConsumerGroupSession, 
    claim sarama.ConsumerGroupClaim) error {
    
    for msg := range claim.Messages() {
        // 处理消息
        processMessage(msg)
        
        // 手动提交
        session.MarkMessage(msg, "")
        session.Commit()
    }
    return nil
}

消费语义 ​

  • At most once:最多一次(可能丢失)
  • At least once:至少一次(可能重复)
  • Exactly once:精确一次(需要额外处理)

参考:https://kafka.apache.org/documentation/