func ConsumeGroupAssignor(assignorStr string) { config := sarama.NewConfig() switch assignorStr { // consumer_group case "stickyRoundRobin": // 黏性roundRobin,rebalance之后首先保证前面的分配,从后面剥离 // topic:T0{P0,P1,P2,P3,P4,P5},消费者:C1,C2 // ---------------before rebalance:即roundRobin // C1: T0{P0} T0{P2} T0{P4} // C2: T0{P1} T0{P3} T0{P5} // ----------------after rebalance:增加了一个消费者 // C1: T0{P0} T0{P2} // C2: T0{P1} T0{P3} // C3: T0{P4} T0{P5} until每个消费者的分区数误差不超过1 config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategySticky case "roundrobin": // roundRobin --逐个平均分发 // topic: T0{P0,P1,P2},T1{P0,P1,P2,P3}两个消费者C1,C2 // C1: T0{P0} T0{P2} T1{P1} T1{P3} // C2: T0{P1} T1{P0} T1{P2} config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRoundRobin case "range": // 默认值 --一次平均分发 // topic: T0{P0,P1,P2,P3},T1{P0,P1,P2,P3},两个消费者C1,C2 // T1分区总数6 / 消费者数2 = 3 ,即该会话的分区每个消费者分3个 // T2分区总数4 / 消费者数2 = 2 ,即该会话的分区每个消费者分2个 // C1: T0{P0, P1, P2} T1{P0, P1} // C2: T0{P3, P4, P5} T1{P2, P3} config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange default: err := fmt.Sprintf("assignor的值在\{rang,roundRobin,stickyRoundRobin\}三个值中选择一个!\n", assignorStr) panic(err) } }