Jafka源代码分析——随笔


Kafka是一个分布式的消息中间件,可以粗略的将其划分为三部分:ProducerBrokerConsumer。其中,Producer负责产生消息并负责将消息发送给KafkaBroker可以简单的理解为Kafka集群中的每一台机器,其负责完成消息队列的主要功能(接收消息、消息的持久化存储、为Consumer提供消息、消息清理.....)ConsumerBroker获取消息并进行后续的操作。每个broker会有一个ID标识,该标识由人工在配置文件中配置。

Kafka中的消息隶属于topictopic可以简单的理解为分组。在topic内部,消息会划分为分区(partition)。对于partition可能难以理解,至少我读程序的时候一直没有弄明白partition的编号究竟是怎么确定的,这里多说一下。在broker的配置文件server.properties中有配置项num.partitionstopic.partition.count.map num.partitions是该broker每一个topic默认的partition数目(设为N)topic.partition.count.map针对每一个topic设置partition数目(设为N)Broker根据设置的数目在该机器为topic创建[0,1...N-1]Npartition。所以,partition的命名可以理解为由两部分组成,brokerIdpartitionNum,其中partitionNum是从0开始的数字。

Broker按照下面的原则组织该机器的消息队列。首先,为每一个topic的每一个partition创建一个目录,命名格式为topic-partitionBroker对于topic-partition的消息进行分段(segment)存储,每一个segment的命名格式每个segment的偏移量(offet)。目录的组织结构具体如下图所示:

Kafka每一条Message的格式:

Length(4byte)

MagicValue(1byte)

Attribute(1byte)

CRC校验码(4byte)

payload(消息的内容)


其中magicvalue=1,Attribute表明消息是否采用压缩以及采用何种压缩方式,crcpayloadcrc校验码。消息在kafka的持久化存储文件中新增了一个域:消息的长度,具体的格式如下所示:


其中,ByteBufferMessageSetFileMessageSet都是采用上面的格式进行存储的。

注意Kafka对消息进行压缩的过程。Kafka对消息进行压缩时是对一组Message进行压缩的,其处理过程如下。首先将每一条Message序列化到一个byte数组,然后将压缩后的byte数组再组成一条新的Message,其具体格式如下:



注意FileMessageSet中的offset是指该messagesetFile中的起始位置,是文件中的具体位置。


相关内容