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

相关推荐
hai405874 分钟前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
海里真的有鱼2 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
工业甲酰苯胺2 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
新知图书2 小时前
Rust编程的作用域与所有权
开发语言·后端·rust
wn5313 小时前
【Go - 类型断言】
服务器·开发语言·后端·golang
希冀1234 小时前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper4 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
爱上语文5 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring