以下文章转载自:http://blog.csdn.net/jewes/article/details/42744855

Kafka的通讯协议

标签:kafka

Kafka的Producer、Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议。Kafka的这套协议完全是为了Kafka自身的业务需求而定制的,而非要实现一套类似于Protocol Buffer的通用协议。本文将介绍这套协议的相关内容。

基本数据类型

定长数据类型:int8,int16,int32和int64,对应到Java中就是byte, short, int和long。
变长数据类型:bytes和string。变长的数据类型由两部分组成,分别是一个有符号整数N(表示内容的长度)和N个字节的内容。其中,N为-1表示内容为null。bytes的长度由int32表示,string的长度由int16表示。
数组:数组由两部分组成,分别是一个由int32类型的数字表示的数组长度N和N个元素。

Request和Response的基本结构

Kafka中两个角色之间通讯的基本单位是Request/Response,Request和Response的基本结构如下:

RequestOrResponse => MessageSize (RequestMessage | ResponseMessage)

其中各字段的含义为:

这里写图片描述

RequestMessage的结构

RequestMessage的结构如下:

RequestMessage => ApiKey ApiVersion CorrelationId ClientId Request

这里写图片描述

ResponseMessage的结构

ResponseMessage的结构如下:

这里写图片描述

Message

Kafka是一个分布式消息系统,Producer生产消息并推送(Push)给Broker,然后Consumer再从Broker那里取走(Pull)消息。Producer生产的消息就是由Message来表示的,对用户来讲,它就是键-值对,来看看它的结构。

Message => Crc MagicByte Attributes Key Value

这里写图片描述

MessageSet

MessageSet用来组合多条Message,它在每条Message的基础上加上了Offset和MessageSize,其结构是:

MessageSet => [Offset MessageSize Message]

它的含义是MessageSet是个数组,数组的每个元素由三部分组成,分别是Offset,MessageSize和Message,它们的含义分别是:

这里写图片描述

Message的压缩

Kafka支持下面几种压缩方式,

这里写图片描述

因为单条消息中重复内容可能不多,所以通常把多条消息放在一起组成MessageSet,然后再把MessageSet放到一条Message里面去,从而提高压缩比率。

Request/Respone和Message/MessageSet的关系

Request/Response是通讯层的结构,和网络的7层模型对比的话,它类似于TCP层。
Message/MessageSet定义的是业务层的结构,类似于网络7层模型中的HTTP层。Message/MessageSet只是Request/Response的payload中的一种数据结构。

小结

Kafka的通讯协议中不含Schema,格式也比较简单,这样设计的好处是协议自身的Overhead小,再加上把多条Message放在一起做压缩,提高压缩比率,从而在网络上传输的数据量会少一些。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐