消费者组
工作原理
消费者组实现消息的负载均衡和容错。
Group: my-group
├── Consumer 1: Partition 0, 1
└── Consumer 2: Partition 2, 3Rebalance(重平衡)
消费者加入/离开时重新分配分区。
触发条件
- 消费者加入/离开
- 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.BalanceStrategyStickyOffset 管理
自动提交
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:精确一次(需要额外处理)