直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_java

云原生时代消息队列和流融合系统,提供统一的消费模型,支持消息队列和流两种场景,既能为队列场景提供企业级读写服务质量和强一致性保障,又能为流场景提供高吞吐、低延迟;采用存储计算分离架构,支持大集群、多租户、百万级 Topic、跨地域数据复制、持久化存储、分层存储、高可扩展性等企业级和金融级功能。 

GitHub 地址:http://github.com/apache/pulsar/

场景关键词

异步解耦 削峰填谷 跨城同步 消息总线 

流存储  批流融合  实时数仓  金融风控

本场直播视频回顾奉上供大家查看(点击下方图片跳转至 Bilibili),具体内容分为以下几个部分:

直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_单元测试_02

1.环境搭建与配置;

2.模块说明;

3.本地调试;

4.代码贡献;

5.Q&A。

环境搭建与配置

基础环境

这一部分的大部分内容对开发人员来说比较简单,包括 Java JDK、Maven 和 GPG(GnuPG) 的配置都算得上“轻车熟路”。难度最大的部分是网络环境,一方面 GitHub 网页可能不容易访问,另一方面 Pulsar 的代码较大,可能存在不易拉取的问题。代码本地编译时,Maven 的一些包也可能存在获取不到的问题。这些问题都要开发人员自己设法解决,确保网络顺畅可用。

代码获取

Pulsar 的 GitHub 主仓库地址为 http://github.com/apache/pulsar/。开发人员一般需要 fork 一个仓库进行本地分支开发,避免 PR 混乱等问题,但本地仓库存在与主仓库代码同步的问题,这里列出同步相关命令:

//添加远程主仓库到 upstream
git remote add upstream git@github.com:apache/pulsar.git

//更新主仓库代码
git fetch upstream

//本地仓库切换到 master,并 merge 最新远程代码
git checkout master
git merge upstream/master
git push origin master

Pulsar 支持两种编译方式,编译相关命令:

//全量编译(所有模块)
mvn install -DskipTests

//最小化编译(仅供生产消费所需模块)
mvn install -Pcore-modules,-main -DskipTests

IDE 配置

这一部分的要点是打开 annotation processing。路径如下: 

直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_python_03

其次要安装 Lombok 插件。IDEA 默认安装此插件,其他 IDE 要手动安装。因为 Pulsar 使用了大量 Lombok 注解。

第三点要设置 Code Style,点击 Settings -> Editor -> Code Style -> Import scheme,样式所在路径:​​${pulsar_dir}/src/idea-code-style.xml​​。设置样式可以避免很多后期合并仓库时的麻烦,避免样式检查不通过。

模块说明

核心模块

Pulsar 有很多模块,但其实核心模块只有以下四个:

  • • 服务端 pulsar-broker,是服务端的总入口;
  • • 客户端数据流 pulsar-client,生产消费消息,与服务端建立长连接的客户端;
  • • 客户端管理流 pulsar-client-admin,调用 admin 相关接口,创建 topic、namespace 等操作;
  • • 存储抽象 ManagedLedger,可插拔的抽象存储层,封装了下层的存储调用实现。

另外 connector 的开发中可以认为 pulsar-io 也属于核心模块。

直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_单元测试_04

上面这些目录中:

  • • bin 目录中包含 Pulsar 的所有脚本、环境 sh 等;
  • • conf 目录包含多个配置文件,对应多种服务如 BookKeeper、ZooKeeper 等;
  • • distribution 文件夹放置本地打包的构建产物;
  • • 带 shaded 后缀的模块用于防止出现引用包的版本冲突;

本地调试

单元测试

模块导入 IDEA 后,由于 Pulsar 项目大、功能多,调试代码时建议从单元测试开始。模块导入后可以在模块下找到对应的单元测试,在编辑器中对应代码左侧点击 Run 或 Debug 即可开始调试。无需在本地拉起 broker 进程。

通过单元测试可以知道 API 的使用方法,且单元测试的切入点较窄,很便于开发人员理解各个模块的功能。此外,单元测试也比较容易查找。

启动入口

启动入口位于 ​​bin/pulsar broker​​​、​​bin/pulsar standalone​​​直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_java_05

服务端入口

服务端入口位于:​​org.apache.pulsar.broker.service.ServerCnx​​​,结构如下:直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_单元测试_06

客户端入口

客户端入口位于:​​org.apache.pulsar.client.impl.ClientCnx​​​,结构与服务端入口对应。 直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_python_07

管控端入口

管控端入口位于 admin 下,如图所示: 

直播回顾|深度解读 Apache Pulsar 源码阅读正确姿势_单元测试_08

代码贡献

为 Pulsar 贡献代码的标准流程如下:

1.clone 自己的仓库;

2.领取任务,创建分支,推荐新手从较简单的 issue (带有 ​​help-wanted​​ 标签)入手,并留言 mark 避免其他人重复劳动;

3.代码开发,本地调试通过,写好单元测试;

4.push 到自己的仓库;

5.创建 PR,确保单元测试通过,如果有的部分没通过可以执行 ​​/pulsarbot run-failure-checks​​ 重试,一直没通过的用例就可能是与已有部分冲突的。

在调试等过程中,对具体模块内部实现不了解的开发人员,推荐购买林琳《深入解析 Apache Pulsar》这本著作(基于 Pulsar 2.9 版本编写),查阅相关章节。

Q&A

Q:是否需要非常熟悉所有模块的原理和流程,才能开始贡献,不然会不会很容易对其他模块产生影响?

  • • A:不需要。贡献者一般都是从单个模块开始,逐步升级到高级特性。不同模块之间也很难出现严重的影响。

Q:建议从哪些模块入手了解 Pulsar,目前 issue 比较多的是哪些模块?

  • • A:目前 issue 较多的是 broker 侧的 pub-sub 模块,且这方面的流程相对简单,建议新手从 pub-sub 开始了解并做贡献。

Q:${pulsar_dir} 环境变量需要手动配置吗?

  • • A:该变量并不需要手动配置。

Q:Pulsar 推荐使用 rebase 还是 merge 进行代码合并?

  • • A:看个人选择,建议使用保留 commit 记录的方式,也就是 merge。

Q:怎样将社区还未合并的 patch 先行合并到自己 fork 的仓库分支里面?

  • • A:可以将主仓库代码拉到自己的主仓里,然后通过 cherry-pick 的方式将对应的 PR 拉到自己的开发分支。

Q:有计划支持最新版本的 Java 么?

  • • A:社区正在推进相关工作,目前默认构建使用 JDK 11。

Q:推荐从 Pulsar 哪个模块或者哪个部分开始阅读呢?《深入解析 Apache Pulsar》这本书会不会和新版有延迟呢?

  • • A:推荐从生产消费部分入门;书籍的确会存在少量内容延迟,但整体框架是一致的,适合读者全面了解各个模块的基本知识。