MessageSetMessageSet用来组合多条Message,它在每条Message的基础上加上了Offset和MessageSize,其结构是:
MessageSet => [Offset MessageSize Message]它的含义是MessageSet是个数组,数组的每个元素由三部分组成,分别是Offset,MessageSize和Message,它们的含义分别是:
名称类型描述Offsetint64它用来作为log中的序列号,Producer在生产消息的时候还不知道具体的值是什么,可以随便填个数字进去MessageSizeint32表示这条Message的大小Message-表示这条Message的具体内容,其格式见上一小节。Message的压缩Kafka支持下面几种压缩方式,
压缩方式编码不压缩0Gzip1Snappy2LZ43其中编码就是Message的Attribute的最低两位的值。
因为单条消息中重复内容可能不多,所以通常把多条消息放在一起组成MessageSet,然后再把MessageSet放到一条Message里面去,从而提高压缩比率。
Request/Respone和Message/MessageSet的关系- Request/Response是通讯层的结构,和网络的7层模型对比的话,它类似于TCP层。
- Message/MessageSet定义的是业务层的结构,类似于网络7层模型中的HTTP层。Message/MessageSet只是Request/Response的payload中的一种数据结构。
小结Kafka的通讯协议中不含Schema,格式也比较简单,这样设计的好处是协议自身的Overhead小,再加上把多条Message放在一起做压缩,提高压缩比率,从而在网络上传输的数据量会少一些。 |