Kafka基础概念
一、组成结构
- broker(消息代理): 指kafka的服务器,存储消息
- producer (消息生产者): 消息产生的源头,负责生成消息并发送至broker
- consumer (消息消费者): 消息的使用方, 负责消费broker上的消息
- topic (主题): 生产者与消费者之间的订阅关系,可以理解为消息的分组方式 -> 生产者发送消息到指定的topic下,消费者从指定的topic获取消息消费
- partition (消息分区): 一个topic下会分成不同的分区,消息归集到topic后会进入分区被消费
- group (消费者组): 同类消费者的集合,一条消息只会被消费者组里的其中一个消费者消费(可以多个消费者组消费)
- offset (消息偏移量): 连续的、被用于定位分区内消息的***
二、结构图解
简单图例:
producerA、B两个生产者都可生成同一个topic类型的消息,该topic下分为三个分区,消息进入分区后被消费者消费。
这张图可以简单展示消息的产生与消费的生命周期,此时没有加入消费者组的概念。
消费者组图例:
如图:
有两个topic,这两个topic分别有两个分区(P0,P3)、(P1,P2)
有两个消费者组A、B分别包含消费者(C1,C2)、(C3、C4、C5、C6)
对于第一个topic,分区P0和P3,两者产生的消息都会被消费者组A、B消费,但对于消费者组A来说,C1 C2只有一个能消费P0的消息。
即一条消息可以被多个消费者组消费,但一个消费者组只能有一个消费者来消费该消息。
而当消费者组中有消费者挂掉之后,其他消费者会接收该消费者的消息,重新达到平衡。
如下图,消费者组A中的C2挂掉,原本由C2消费的P1、P2的消息,将由C1来处理。
offset图例
如图:
该topic分为三个不同的分区,生产者在向三个分区发送消息(一条消息只进一个分区)的同时会在该分区记录这条消息的id,这个id就是消息的offset。
为了避免消息被同一个消费者组重复消费,在zookeeper上会记录各个消费者组消费分区的offset。
消费者组会各自管理该topic下不同分区的offset,以保证消息不会被同一个消费者组重复消费。由于消费者组各自分开管理自己的offset,不同消费者组不会存在线程安全问题,导致消息消费错序。