Apache Kafka

[Kafka] kafka 协议分析 (一) 基础篇

2018-01-07  本文已影响53人  king_wang

Kafka作为分布式消息组件被广泛使用,官方也提供了非常易用的各语言版本的client。由于系统的异构性,我们使用了不同语言的client生产和消费消息。实际使用的过程中,发现有生产了消息却消费不到的情况。由于client屏蔽了很多底层细节,所以通过网络抓包去分析数据才是解决问题的关键。要分析网络数据包就必须了解Kafka通讯协议。(PS:本文是假定你对Kafka的基本概念已经了解,特别是topic,partition,brokerleader

协议基础

要想分析和使用kafka协议,我们必须要事先弄清楚协议的基础理论。本文主要介绍这些基础概念,后面文章会陆续介绍kafka的low level api和hight level api。

TCP
Partition
Batching
Versioning
Protocol Primitive Types

协议中的请求和响应都由下面3种类型的数据组成。

Request & Response

请求和响应的前4个字节都是一个表示请求体或响应体多大的数字:

RequestOrResponse => Size (RequestMessage | ResponseMessage)
  message_size => int32
  RequestMessage | ResponseMessage
Field 长度 含义
message_size 4字节 message_size给出了后续请求或响应消息的字节(bytes)长度。客户端可以先读取4字节的长度N,然后读取并解析后续的N字节请求内容。

注意:后面介绍中将不会再专门列出message_size域,默认在头部包含该域值

Request Header

所有请求都具有相同格式的请求头

RequestMessage => api_key api_version correlation_id client_id
  api_key => int16
  api_version => int16
  correlation_id => int32
  client_id => string
  MetadataRequest | ProduceRequest | FetchRequest | ListOffsetRequest |......
Field 长度 描述
api_key 2字节 API Code
api_version 2字节 API 版本号
correlation_id 4字节 自定义消息id (response中会将该值原样返回)
client_id 2字节+N 自定义ClientId
Response Header

所有响应都具有相同格式的响应头

ResponseMessage => correlation_id
  correlation_id => int32
  MetadataResponse | ProduceResponse | FetchResponse | ListOffsetResponse |......
Field 长度 描述
correlation_id 4字节 自定义消息id(request中的correlation_id)
上一篇下一篇

猜你喜欢

热点阅读