「kafka golang客户端sarama源码分析」--- 1. Consumergroup源码分析开篇

开篇

去年抽出业余时间阅读了sarama源码,近期心血来潮想把之前的阅读笔记整理成文。仅做抛砖引玉,与大家交流分享。本次专题源码分析所使用的sarama版本为v1.41.1。我们先从Consumergroup这部分开始。

架构总览

成员浅析

我们首先对架构图中的每个成员做简要介绍,在后续篇章中,会对它们的工作做详细介绍。

  • ConsumerGroup:sarama消费者组对象,调用它提供的Consumer方法,即可开始拉取消息进行消费

  • ConsumerGroupSession:用于控制消费者组的会话:

    • 它可由用户在调用 ConsumerGroup.Consumer 时传入的 context 结束会话。
    • 初始化完成时会启动一个循环向 Kafka 集群发送心跳消息保证消费者的存活。
    • 在发生消费者组reblance时,结束消费,进行消费者订阅的重新分配。
    • 执行用户层回调函数
  • ConsumerHandler:sarama中提供的一个叫做 ConsumerGroupHandler 的interface,它提供了 Setup(启动),Cleanup(结束)和ConsumeClaim(消费)三种(回调)方法。用户根据自身业务需要编写实现 ConsumerGroupHandler,并传入 ConsumerGroup 中。当 ConsumerGroupSession 初始化完成后,会调用 Setup 和 ConsumeClaim 方法。ConsumerHandler 就是 ConsumerGroupHandler 的实现类型。

  • ConsumerGroupClaim:ConsumerGroupClaim代表对一个 Topic/Partition 的订阅。它可以理解为是底层和 ConsumerHandler 之间的信使,向用户开放消息处理的通道。在 ConsumerHandler的ConsumeClaim 回调方法中调用ConsumerGroupClaim的 Messages 方法,该方法返回一个带有新拉取的消息的 channel ,给用户处理消息。

  • Consumer:sarama消费者实例,在创建 ConsumerGroup 实例时一同创建。它并不参与实际的消费,而是管理着 partitionConsumer 和 brokerConsumer 的对应关系。二者关系可看架构图。

  • partitionConsumer:它是 ConsumerGroupClaim 的下级,同样代表了一个 Topic/Partition 的订阅,它和 brokerConsumer 通过 channel 交互,读取拉取到的消息。ConsumerGroupClaim 中的 Messages 方法就是由其实现的。

  • brokerConsumer:每个 brokerConsumer 实例管理着多个 Topic/Partition 订阅。一个 brokerConsumer 下的所有 Topic/Partition 订阅,它们的分区 leader 位于 Kafka集群的同一个Broker中。

  • Client: Kafka客户端,在创建时需要传入Kafka集群的Broker地址列表。它负责生成并管理多个Broker实例,每个 Broker 实例维护着和制定Kfaka集群的Broker的TCP连接。

  • Broker: sarama的Broker对象,封装了 Kafka API,它负责真正和Kafka服务端交互。每个 Broker 实例维护着和指定Kfaka集群的Broker的TCP连接。

入口

本次源码分析的入口代码就是官方提供的 Consumergroup 模版代码,位于sarama源码根目录下的 examples/consumergroup/main.go

调用 sarama.NewConsumerGroup 生成 ConsumerGroup 的实例

调用 ConsumerGroup 的 Consume 方法开始进行消费(调用该方法时会传入ConsumerGroupHandler interface的实现类型的实例)。

这里会阻塞并监听的 consumer.ready 通道,当通道关闭或者读取到消息时,阻塞结束。

这个 consumer 实例是 ConsumerHandler 实例化后的对象。ConsumerHandler 就是用户对 ConsumerGroupHandler interface 的实现类型。ready channel 会在 ConsumerGroupSession 初始化后(此时代表消费者组的分区订阅分配完成,可以开始进行消费)通过 ConsumerHandler.Setup 方法进行回调。

在完成 consumer.ready 的阻塞监听后,通过一个 for 循环监听 context 取消和操作系统信号。保证消费者程序正常退出。

ConsumerGroupHandler interface 的实现类型 ConsumerHandler 中同样也定义了 ConsumeClaim 方法。这个方法在每次 ConsumerGroupSession 初始化后会调用。持续监听处理消费者消费的消息。

总结

本章作为开篇对sarama的Consumergroup源码进行了架构简介和入口代码的分析。下一篇会沿着入口代码,逐步深入介绍 ConsumerGroupSession 和 ConsumerGroupClaim 等其他成员的工作机制。如有错误请广大掘友指正。

相关推荐
Asthenia04129 分钟前
详细分析:ConcurrentLinkedQueue
后端
uhakadotcom19 分钟前
Ruff:Python 代码分析工具的新选择
后端·面试·github
uhakadotcom23 分钟前
Mypy入门:Python静态类型检查工具
后端·面试·github
喵个咪28 分钟前
开箱即用的GO后台管理系统 Kratos Admin - 定时任务
后端·微服务·消息队列
Asthenia041230 分钟前
ArrayList与LinkedList源码分析及面试应对策略
后端
Asthenia04121 小时前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia04121 小时前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia04121 小时前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端
Apifox1 小时前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端