Kafka源码调试(三):发送事务消息时的Kafka请求抓包分析

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

2.3. 日志观察结果

根据观察以上日志得出以下结果:

  1. 一共初始化两次事务id,从命名上看
    1. 主线程生产者的:tx-kafka-0
    2. 消费者线程的:tx-kafka-spring-kafka-evo-consumer-004.TRANSACTION-ONE-TOPIC-1.0
  2. 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. 生产者客户端

  1. 生产者客户端:Client ID: producer-tx-kafka-0
    1. 确定kafka服务支持的api版本
      1. ApiVersions v3
      2. ApiVersions v0
    2. 查找事务协调器:TransactionCoordinator 负责分配 PID(生产者id) 和管理事务
      1. FindCoordinator v1
    3. 找到事务协调器后,生产者向事务协调器讨要生产者id
      1. InitProducerId v0
      2. 事务id:tx-kafka-0
    4. 发送事务消息前,告诉事务协调器,事务涉及到哪些业务主题和分区,允许不同主题不同分区在同一个事务会话中发送,并且统一提交或回滚。
      1. AddPartitionsToTxn v0
    5. 发送业务主题消息,可以在同一个事务会话中,多次调用此api发送不同主题分区的消息
      1. Produce v5
    6. 生产者提交事务,此时对于客户端是事务操作的最后一步,但是对服务端来说,这是提交事务的第一阶段,只是准备提交阶段。
      1. EndTxn v0
    7. 事务提交的第二阶段,协调器收到事务提交事件后,马上给所有涉及到的业务主题分区的 leader 节点发送此请求,要求它们写入控制消息(ControlBatch)用以标记事务结束。当所有业务主题分区成功标记完成后,才会正式更新事务日志状态为已提交,但凡一个标记失败,都将事务内所有提交回滚。
      1. WriteTxnMarkers v0

3.1.2. 消费者组客户端

  1. 消费者客户端:client ID: producer-tx-kafka-spring-kafka-evo-consumer-004.TRANSACTION-ONE-TOPIC-1.1
    1. 确定kafka服务支持的api版本
      1. ApiVersions v3
      2. ApiVersions v0
    2. 因为消费者也开启了事务,需要根据消费者id以及所消费主题和分区,注册一个消费者专属事务id并且讨要一个最新epoch的生产者id。
      1. InitProducerId v0
        1. 事务id:tx-kafka-spring-kafka-evo-consumer-004.TRANSACTION-ONE-TOPIC-1.1,注意消费者注册的事务id是固定由消费者id主题分区拼接成的,没有随机后缀编号,因为消费者事务需要保证幂等性,保证同一时间只有一个消费者能在消费期间发送事务消息。
    3. 添加消费者偏移量到事务日志,事务协调器会根据 Consumer Group 推导该消费者在主题 __consumer_offsets 中的分区,并将该分区保存到主题 __transaction_state,实现消费者与新建事务关联(注意此事务跟上面1.生产者客户端提到的tx-kafka-0事务没有关系,请不要混淆)。
      1. AddOffsetsToTxn v0
    4. 查找消费者组协调器:同样的请求,和查找事务协调器的区别是参数 Corrdinator Type 不一样,1代表事务协调器,0代表消费者组协调器。
      1. FindCoordinator v1
    5. 提交事务消费者消费偏移量,消费者组协调器会将提交的 消费位移量 offsets 存储到主题 __consumer_offsets中。
      1. TxnOffsetCommit v0
    6. 生产者提交事务第一阶段
      1. EndTxn v0
    7. 事务提交第二阶段,完成事务标记
      1. WriteTxnMarkers v0

3.2. 抓包结果详情

3.2.1. Kafka ApiVersions v3

请求

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]

3.2.2. Kafka ApiVersions v0

请求

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值