2019独角兽企业重金招聘Python工程师标准>>>

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

基本数据类型

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

Request和Response的基本结构

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

RequestOrResponse => MessageSize (RequestMessage | ResponseMessage)

其中各字段的含义为:

名称 类型 描述
MessageSize int32 表示RequestMessage或者ResponseMessage的长度
RequestMessage/ResponseMessage - 表示Request或者Response的内容,在下面将会介绍其具体格式。

这个结构定义了通讯双方交换数据的基本结构。通讯的过程可以简单地表示为:客户端打开与服务器端的Socket,然后往Socket写入一个int32的数字表示这次发送的Request有多少字节,然后继续往Socket中写入对应字节数的数据。服务器端先读出一个int32的整数从而获取这次Request的大小,然后读取对应字节数的数据从而得到Request的具体内容。服务器端处理了请求后,也用同样的方式来发送响应。

RequestMessage的结构

RequestMessage的结构如下:

RequestMessage => ApiKey ApiVersion CorrelationId ClientId Request
名称 类型 描述
ApiKey int16 表示这次请求的API编号
ApiVersion int16 表示请求的API的版本,有了版本后就可以做到后向兼容
CorrelationId int32 由客户端指定的一个数字唯一标示这次请求的id,服务器端在处理完请求后也会把同样的CorrelationId写到Response中,这样客户端就能把某个请求和响应对应起来了。
ClientId string 客户端指定的用来描述客户端的字符串,会被用来记录日志和监控,它唯一标示一个客户端。
Request - Request的具体内容。

ResponseMessage的结构

ResponseMessage的结构如下:

ResponseMessage => CorrelationId Response
名称 类型 描述
CorrelationId int32 对应Request的CorrelationId。
Response - 对应Request的Response,不同的Request的Response的字段是不一样的。

Message

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

Message => Crc MagicByte Attributes Key Value
名称 类型 描述
CRC int32 表示这条消息(不包括CRC字段本身)的校验码
MagicByte int8 表示消息格式的版本,用来做后向兼容,目前值为0
Attributes int8 表示这条消息的元数据,目前最低两位用来表示压缩格式
Key bytes 表示这条消息的Key,可以为null
Value bytes 表示这条消息的Value。Kafka支持消息嵌套,也就是把一条消息作为Value放到另外一条消息里面。

MessageSet

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

MessageSet => [Offset MessageSize Message]

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

名称 类型 描述
Offset int64 它用来作为log中的序列号,Producer在生产消息的时候还不知道具体的值是什么,可以随便填个数字进去
MessageSize int32 表示这条Message的大小
Message - 表示这条Message的具体内容,其格式见上一小节。

Message的压缩

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

压缩方式 编码
不压缩 0
Gzip 1
Snappy 2
LZ4 3

其中编码就是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放在一起做压缩,提高压缩比率,从而在网络上传输的数据量会少一些。

转载于:https://my.oschina.net/u/780876/blog/545897

Kafka的通讯协议相关推荐

  1. xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习

    一.美系厂家Rockwell ABRockwell的PLC主要是包括:PLC2.PLC3.PLC5.SLC500.ControlLogix等型号,PLC2和PLC3是早期型号,现在用的比较多的小型PL ...

  2. 西门子smart200以太网通讯协议

    西门子smart200具体的通讯文档在网上或者官网我都没有找到(哪位大仙有请给我留言发个感激不尽),本人是通过监听控制软件分析出其中的通讯协议. 连接是通过TCP/IP协议,我一般喜欢用Java写测试 ...

  3. ntrip获取源列表_Ntrip通讯协议怎么样?

    1 什么是Ntrip? CORS(Continuously Operating Reference Stations)就是网络基准站,通过网络收发GPS差分数据.用户访问CORS后,不用单独架设GPS ...

  4. AMF3通讯协议实例

    为什么80%的码农都做不了架构师?>>>    服务端: import java.io.BufferedOutputStream; import java.io.BufferedRe ...

  5. 上下位机通讯协议_上位机与下位机的区别通讯

    上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等).下位机是直接 ...

  6. 2017-2018-1 20155327 实验五 通讯协议设计

    2017-2018-1 20155327 实验五 通讯协议设计 实验一: 实验要求: 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中 ...

  7. 2018-2019-1 20165212 实验五 通讯协议设计

    2018-2019-1 20165212 实验五 通讯协议设计 OpenSSL简介 OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及 ...

  8. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  9. php连接plc,PLC 几种常见的连接口和通讯协议

    四.ProfiBus 通讯作为众多现场总线家族的成员之一ProfiBus是在欧洲 工业界得到最普遍应用的一个现场总线规范,也是目前国际上通用的现场总线规范之一.ProfiBus是属 于单元级.现场级的 ...

最新文章

  1. php智能客服,智能客服系统
  2. ReactJS学习笔记——npm、JSX、webpack
  3. 浅谈分布式CAP定理
  4. 并发编程(三)原子操作CAS
  5. 【pmcaff】产品经理必知改善用户体验的基本方法
  6. iOS - EaseMob 环信的使用
  7. DM368 Uboot
  8. 2021牛客暑期多校训练营3 B Black and white 最小生成树 + 思维
  9. [渝粤教育] 四川信息职业技术学院 高频电子技术 参考 资料
  10. iphone中结束电话后返回自己的应用
  11. Hibernate入门案例及增删改查
  12. fw313r手机登录_fw313r路由器设置
  13. 求实数的整数部分和小数部分python_python求实数的整数部分
  14. 论文复现——CE-FPN: Enhancing Channel Information for Object Detection
  15. C++随机生成中文名的实例
  16. @Autowired和@Resource的区别
  17. Netty报错 远程主机强迫关闭了一个现有的连接 异常
  18. (小脚本) (python) 批量修改文件后缀名
  19. Postman做接口测试设置断言
  20. 天梯赛--清点代码库

热门文章

  1. 2019年第一份DApp调查报告出炉
  2. 解决logstash启动过慢的问题
  3. Redis研究-3.7 有序集合中范围以及数学集合运算
  4. 合并表格中同一列中相同的内容
  5. 使用Cobbler安装多版本操作系统
  6. 【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity 1
  7. 《从问题到程序:用Python学编程和计算》——2.4 字符串
  8. python之文件操作read
  9. 微信小程序-仿淘宝(附真机测试图)(持续更新中。。。)
  10. cen7布署mysql数据库