Kafka

Kafka + Mongodb 通信协议纪要

Kafka 和 MongoDB 是目前使用比较广泛的消息队列和数据库,在之前的很长时间里对这两个软件系统的理解都停留在概念和使用上,直到最近遇到一个“诡异”的问题,已有的经验和调试方法无法定位时,最终尝试了下抓包分析才最终定位到问题的根源。

问题描述: 使用 sarama 编写了一个 kafka 消费者组,这里不同寻常的地方在于:手动提交 + 批量消费。遇到的问题:某些分区消费进度无法成功提交,但是消息是消费成功的。出现这种情况的分区没有规律,触发 rebalance 后 “故障分区” 有概率会发生变化。

分析/定位:这里很明显的问题在于手动提交 offset 为什么不成功?从实现来说,提交 offset 的逻辑跟分区没有关系是一致,那这种不确定性故障时从哪儿来的?而且还和 rebalance 相关。 梳理下 kafka 客户端消费提交涉及到的操作:Fetch, OffsetCommit, 但是消费是正常的,那么只需要抓包分析 OffsetCommit 就可以知道 offset 提交存在什么问题。

结果: 通过抓包一切都明朗了:出现问题的分区同时有多个 OffsetCommit 请求,且其中有的请求提交的 offset 一致停留在一个 “旧的” 位置,不会更新,这样就缩小了范围:程序提交 offset 逻辑异常。

KAFKA 协议 #

Kafka 协议是基于 TCP/IP 协议的二进制协议。其结构组成如下:

struct RequestOrResponse {
    RequestResponseHeader requestResponseHeader; // uint32 messageLength;
    SpecificRequestOrResponseHeader body; // 格式取决于具体的请求和响应,比如:RequestV1Header
}

struct RequestV1Header {
  int16 apiKey;
  int16 apiVersion;
  int32 correlationId;
  string clientId;
}

协议结构 #

https://kafka.apache.org/protocol.html#protocol_messages

...

近期的一些经验总结

这里不会过多的介绍软件的相关概念和架构,主要是针对实际问题的解决方案和思考。

问题汇总 #

  • CDC 相关

    • CDC kafka-connect mysql sink 侧消费积压问题
    • CDC kafka-connect mysql source 侧删除事件投递了两条事件,导致删除动作数据量被放大
    • CDC kafka-connect mongodb 数据同步任务异常(消息超过 1MB )

    更新于: 2025-02-06

    • CDC Elasticsearch sink 怎么自定义索引名称?
    • 自定义 transform 实现自定义索引名称
  • DMS 数据同步相关

    • 数据迁移完成后,怎么对比源数据和目标数据是否一致?
    • 如果不一致怎么处理?
  • Istio 相关

    • Istio 中多个 gateway 使用相同 host,analyze 是提示错误
    • Istio 中一个服务提供了多个端口的服务,怎么配置 Virtual Service ?
  • APISIX 相关

    • 使用 APISIX 作为网关,怎么进行有条件的响应重写?
    • APISIX 插件的执行顺序是怎么样的?
  • ShardingSphere Proxy

    • HINT策略 在 ShardingSphere Proxy 中的使用
  • Kafka 相关

    • 如何将迁移kafka集群中的数据?
  • Pyroscope 相关

    • 使用 Go Pull 模式采集数据时为什么只有 cpu + gourotines + cpu samples 三个指标?
  • Doris 相关

    ...

访问量 访客数