聊一下kafka的消费组
介绍
消费组使kafka中很重的概念,只有弄清楚消费组的概念,才能在项目中把它运用好,在kafka中,每个消费者都对应一个消费组,消费者可以是一个线程,一个进程,一个服务实例,如果kafka想要消费消息,那么需要指定消费那个topic的消息以及自己的消费组id(groupId),也可以直接指定那个主题的哪些分区,不然无法消费消息,消费组是一个逻辑上的概念,如下图是主题,分区,消费组,消费者的关系图。
从上图看出都两个消费组,分别为消费组a和消费组b,消费组a有三个消费者c1,c2,c3,其中c1消费分区1,c2消费分区2,c3消费分区3和分区4,消费组b有c4和恶c5两个消费者,c4消费分区1和分区2,c5消费分区3和分区4,我们可以看出,一个消费组内的消费者可以同时消费一个或者几个分区,反之,一个分区只能被同一个消费组内的消费者消费
。
消费组增加消费者
此时我们在消费组a中添加了一个消费者c6
,我们看到,原来的c3消费分区3和分区4,现在c3只消费分区4,把分区4让给了c6去消费,由此可以看出kafka会使消费者平均消费分区。
继续在消费组a中增加一个消费者c7,如下图,那么由于消费组a中的每个消费者都订阅了一个分区,因为秉承一个分区只能被同一个消费组内的一个消费者消费的原则,四个分区刚好对应4个消费者,所以c7消费者就只能空闲下来。
消费模式
从上面的消费组的一些介绍,我们就可以引申出消息中间件的消费模式,我们知道消息中间件的消费模式有发布订阅模式
和点对点模式
,在不同的场景下使用的消费模式也不一样,这样根据我们的业务需求去选择,下面我们消息介绍一下这两种模式。
发布订阅模式
发布订阅模式顾名思义就是生产者发布消息以后,消费者订阅对应的主题分区,然后进行消费,它是一对多的,就像学校的在广播里面通知,所有的学生都能听到,还有微信的订阅号,一个订阅号会有很多人关注,当订阅号的号主发布一篇文章,关注的人都能收到。
那么在kafka中,怎么做发布订阅模式呢?很简单,就是不同的消费组就能实现发布订阅模式,在上面我们说了一个分区只能被同一个消费组内的消费者消费
,那么我们使用不同的消费组的消费者消费同一个分区就行了,这就实现了发布订阅模式,如下图,有三个消费组a,b,c的消费者c1,c2,c3消费同一个分区,在kafka中使用groupId
来表示消费组,如果所有的消费者的groupId都设置一样,那么他们就属于同一个消费组。
发布订阅模式的应用场景有很多,比如下游有很多服务都需要使用同一份数据,如果通过编码的方式来实现的话,可以通过RPC方式来调用,但是就会造成系统的耦合,使用消息中间件的话,上游只管投递消息,下游服务订阅后,就可以消费到消息,大大降低了耦合。
点对点模式
点对点模式就是一对一模式,现实生活中我们打电话,私聊都属于点对点模式,在kafka中要使用点对点模式,那么我们还是要回到一个分区只能被同一个消费组内的消费者消费
这个问题,那么我们就创建一个消费组,每个分区的数据只能被这个消费组内的消费者消息,就实现了点对点模式。
点对点的应用场景也很多,因为它的数据只能被一个消费者使用,比如可以削峰,比如上游服务发送了很多数据过来,如果下游服务的就只有一个消费者实例,那么就可能造成消息的积压,这时候就可以多开几个消费者实例一起消费,就加快了消息的消费速度,不过也得考虑一些因素,比如消息的顺序。
总结
上面对消费组和消费者进行了详细的图文介绍,也引申出了消费模式的发布订阅模式,点对点模式,并说了一些应用场景,在实际使用的时候,我们需要根据自己的业务去衡量需要多少消费者,消费者与主题分区之间的数量规划等等,对于kafka的参数调优啊,消息的顺序消费,消息的丢失,重复消费等问题,后续我们再继续。
感谢你的观看,我们下期见,如果文中有说得不合理或者不正确的地方,希望你能进行指点!