「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 等其他成员的工作机制。如有错误请广大掘友指正。

相关推荐
midsummer_woo1 小时前
基于spring boot的医院挂号就诊系统(源码+论文)
java·spring boot·后端
Olrookie2 小时前
若依前后端分离版学习笔记(三)——表结构介绍
笔记·后端·mysql
沸腾_罗强2 小时前
Bugs
后端
一条GO2 小时前
ORM中实现SaaS的数据与库的隔离
后端
京茶吉鹿2 小时前
"if else" 堆成山?这招让你的代码优雅起飞!
java·后端
长安不见2 小时前
从 NPE 到高内聚:Spring 构造器注入的真正价值
后端
你我约定有三2 小时前
RabbitMQ--消息丢失问题及解决
java·开发语言·分布式·后端·rabbitmq·ruby
程序视点2 小时前
望言OCR 2025终极评测:免费版VS专业版全方位对比(含免费下载)
前端·后端·github
rannn_1113 小时前
Java学习|黑马笔记|Day23】网络编程、反射、动态代理
java·笔记·后端·学习
一杯科技拿铁3 小时前
Go 的时间包:理解单调时间与挂钟时间
开发语言·后端·golang