2.3. 日志观察结果
根据观察以上日志得出以下结果:
- 一共初始化两次事务id,从命名上看
- 主线程生产者的:
tx-kafka-0 - 消费者线程的:
tx-kafka-spring-kafka-evo-consumer-004.TRANSACTION-ONE-TOPIC-1.0
- 主线程生产者的:
- Kafka服务端产生的日志,出现了一个关键类:
TransactionCoordinator,可以用于继续断点探索
3. 抓包分析
wireshark 捕获条件:kafka and kafka.api_key and !(kafka.api_key == 1) and !(kafka.api_key == 3)
- kafka协议
- 存在
api_key字段 api_key的值不是1(Fetch请求)api_key的值不是3(Metadata请求)
3.1. 抓包结果概述
3.1.1. 生产者客户端
- 生产者客户端:Client ID:
producer-tx-kafka-0- 确定kafka服务支持的api版本
- 查找事务协调器:
TransactionCoordinator负责分配 PID(生产者id) 和管理事务 - 找到事务协调器后,生产者向事务协调器讨要生产者id
- InitProducerId v0
- 事务id:
tx-kafka-0
- 发送事务消息前,告诉事务协调器,事务涉及到哪些业务主题和分区,允许不同主题不同分区在同一个事务会话中发送,并且统一提交或回滚。
- 发送业务主题消息,可以在同一个事务会话中,多次调用此api发送不同主题分区的消息
- 生产者提交事务,此时对于客户端是事务操作的最后一步,但是对服务端来说,这是提交事务的第一阶段,只是准备提交阶段。
- 事务提交的第二阶段,协调器收到事务提交事件后,马上给所有涉及到的业务主题分区的 leader 节点发送此请求,要求它们写入控制消息(
ControlBatch)用以标记事务结束。当所有业务主题分区成功标记完成后,才会正式更新事务日志状态为已提交,但凡一个标记失败,都将事务内所有提交回滚。
3.1.2. 消费者组客户端
- 消费者客户端:client ID:
producer-tx-kafka-spring-kafka-evo-consumer-004.TRANSACTION-ONE-TOPIC-1.1- 确定kafka服务支持的api版本
- 因为消费者也开启了事务,需要根据消费者id以及所消费主题和分区,注册一个消费者专属事务id并且讨要一个最新epoch的生产者id。
- InitProducerId v0
- 事务id:
tx-kafka-spring-kafka-evo-consumer-004.TRANSACTION-ONE-TOPIC-1.1,注意消费者注册的事务id是固定由消费者id主题分区拼接成的,没有随机后缀编号,因为消费者事务需要保证幂等性,保证同一时间只有一个消费者能在消费期间发送事务消息。
- 事务id:
- InitProducerId v0
- 添加消费者偏移量到事务日志,事务协调器会根据
Consumer Group推导该消费者在主题__consumer_offsets中的分区,并将该分区保存到主题__transaction_state,实现消费者与新建事务关联(注意此事务跟上面1.生产者客户端提到的tx-kafka-0事务没有关系,请不要混淆)。 - 查找消费者组协调器:同样的请求,和查找事务协调器的区别是参数
Corrdinator Type不一样,1代表事务协调器,0代表消费者组协调器。 - 提交事务消费者消费偏移量,消费者组协调器会将提交的 消费位移量 offsets 存储到主题
__consumer_offsets中。 - 生产者提交事务第一阶段
- 事务提交第二阶段,完成事务标记
3.2. 抓包结果详情
请求
Transmission Control Protocol, Src Port: 64286, Dst Port: 9092, Seq: 1, Ack: 1, Len: 59
Kafka (ApiVersions v3 Request)
Length: 55
API Key: ApiVersions (18)
API Version: 3
Correlation ID: 0
Client ID: producer-tx-kafka-0
Tagged fields
Client Software Name: apache-kafka-java
Client Software Version: 3.1.2
Tagged fields
响应
Transmission Control Protocol, Src Port: 9092, Dst Port: 64286, Seq: 1, Ack: 60, Len: 14
Kafka (ApiVersions v3 Response)
Length: 10
Correlation ID: 0
[Request Frame: 268929]
[API Key: ApiVersions (18)]
[API Version: 3]
Error: Unsupported version (35)
[Malformed Packet: Kafka]
[Expert Info (Error/Malformed): Malformed Packet (Exception occurred)]
[Malformed Packet (Exception occurred)]
[Severity level: Error]
[Group: Malformed]
请求
Transmission Control Protocol, Src Port: 64286, Dst Port: 9092, Seq: 60, Ack: 15, Len: 33
Kafka (ApiVersions v0 Request)
Length: 29
API Key: ApiVersions (18)
API Version: 0
Correlation ID: 1
Client ID: producer-tx-kafka-0
响应
Transmis

本文详细分析了Kafka的日志观察结果和网络抓包数据,涉及生产者和消费者客户端的事务初始化、API版本协商、事务协调器的寻找与交互,以及事务的提交过程。重点讨论了InitProducerId、AddPartitionsToTxn、EndTxn等关键操作。
843

被折叠的 条评论
为什么被折叠?



