- 消息: 全称为Message,是指在生产者、服务端和消费者之间传输数据。
- 消息代理:全称为Message Broker,通俗来讲就是指该MQ的服务端或者说服务器。
- 消息生产者:全称为Message Producer,负责产生消息并发送消息到meta服务器。
- 消息消费者:全称为Message Consumer,负责消息的消费。
- 消息的主题:全称为Message Topic,由用户定义并在Broker上配置。producer发送消息到某个topic下,consumer从某个topic下消费消息。
- 主题的分区:也称为partition,可以把一个topic分为多个分区。每个分区是一个有序,不可变的,顺序递增的commit log
- 消费者分组:全称为Consumer Group,由多个消费者组成,共同消费一个topic下的消息,每个消费者消费部分消息。这些消费者就组成一个分组,拥有同一个分组名称,通常也称为消费者集群
- 偏移量:全称为Offset。分区中的消息都有一个递增的id,我们称之为Offset。它唯一标识了分区中的消息。
Kafka中的消息隶属于topic,topic可以简单的理解为分组。在topic内部,消息会划分为分区(partition)。对于partition可能难以理解,至少我读程序的时候一直没有弄明白partition的编号究竟是怎么确定的,这里多说一下。在broker的配置文件server.properties中有配置项num.partitions和topic.partition.count.map。 num.partitions是该broker每一个topic默认的partition数目(设为N);topic.partition.count.map针对每一个topic设置partition数目(设为N)。Broker根据设置的数目在该机器为topic创建[0,1...N-1]N个partition。所以,partition的命名可以理解为由两部分组成,brokerId和partitionNum,其中partitionNum是从0开始的数字。
Broker按照下面的原则组织该机器的消息队列。首先,为每一个topic的每一个partition创建一个目录,命名格式为topic-partition。Broker对于topic-partition的消息进行分段(segment)存储,每一个segment的命名格式每个segment的偏移量(offet)。目录的组织结构具体如下图所示:
Kafka每一条Message的格式:
Length(4byte)
MagicValue(1byte)
Attribute(1byte)
CRC校验码(4byte)
payload(消息的内容)
其中magicvalue=1,Attribute表明消息是否采用压缩以及采用何种压缩方式,crc为payload的crc校验码。消息在kafka的持久化存储文件中新增了一个域:消息的长度,具体的格式如下所示:
其中,ByteBufferMessageSet和FileMessageSet都是采用上面的格式进行存储的。
注意Kafka对消息进行压缩的过程。Kafka对消息进行压缩时是对一组Message进行压缩的,其处理过程如下。首先将每一条Message序列化到一个byte数组,然后将压缩后的byte数组再组成一条新的Message,其具体格式如下:
注意FileMessageSet中的offset是指该messageset在File中的起始位置,是文件中的具体位置。