Kafka是一款高吞吐量的分布式发布订阅消息系统,被广泛于日志收集、消息系统、流式处理等应用场景下。通常情况下,用户的服务只会消费kafka集群中少数topics,并采用消费组的形式来多实例拉取消息。采用消费组的优点是,很容易横向扩容消费者实例的数量,同时当某个消费实例crash后,它之前消费的partitions会迁移到其他正常的实例上,从而实现故障的自动恢复。
然而,对于云服务消费用户kafka数据的场景(比如,SLS的kafka数据导入服务),采用消费组的形式可能并不适合,因为用户希望云服务消费的并不总是少量的topics,而有可能是整个kafka集群的数据。那么为何消费集群级别的kafka数据不适合采用消费组呢?
下图显示了消费组的基本工作过程,可以看到,同一消费组中的消费实例会均摊订阅关联的topic partitions(其中Group A订阅了Topic A和Topic B,Group B订阅了Topic B)。这样的好处是容易根据partitions的数量横向扩容consumer实例,比如Topic B中的partition 0产生的数据量过大,C5消费不过来,这时可以通过增加Topic B partition的数量以及Group B的消费实例数量来解决消息堆积的问题。

图1. 消费组工作原理
另外,采用消费组的方式,能够在部份消费实例不可用时自动实现故障转移。比如