云原生时代消息队列和流融合系统,提供统一的消费模型,支持消息队列和流两种场景,既能为队列场景提供企业级读写服务质量和强一致性保障,又能为流场景提供高吞吐、低延迟;采用存储计算分离架构,支持大集群、多租户、百万级 Topic、跨地域数据复制、持久化存储、分层存储、高可扩展性等企业级和金融级功能。
GitHub 地址:http://github.com/apache/pulsar/
场景关键词:
异步解耦 削峰填谷 跨城同步 消息总线
流存储 批流融合 实时数仓 金融风控
本场直播视频回顾奉上供大家查看(点击下方图片跳转至 Bilibili),具体内容分为以下几个部分:
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。路径如下:
其次要安装 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 也属于核心模块。
上面这些目录中:
- • bin 目录中包含 Pulsar 的所有脚本、环境 sh 等;
- • conf 目录包含多个配置文件,对应多种服务如 BookKeeper、ZooKeeper 等;
- • distribution 文件夹放置本地打包的构建产物;
- • 带 shaded 后缀的模块用于防止出现引用包的版本冲突;
本地调试
单元测试
模块导入 IDEA 后,由于 Pulsar 项目大、功能多,调试代码时建议从单元测试开始。模块导入后可以在模块下找到对应的单元测试,在编辑器中对应代码左侧点击 Run 或 Debug 即可开始调试。无需在本地拉起 broker 进程。
通过单元测试可以知道 API 的使用方法,且单元测试的切入点较窄,很便于开发人员理解各个模块的功能。此外,单元测试也比较容易查找。
启动入口
启动入口位于 bin/pulsar broker
、bin/pulsar standalone
服务端入口
服务端入口位于:org.apache.pulsar.broker.service.ServerCnx
,结构如下:
客户端入口
客户端入口位于:org.apache.pulsar.client.impl.ClientCnx
,结构与服务端入口对应。
管控端入口
管控端入口位于 admin 下,如图所示:
代码贡献
为 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:推荐从生产消费部分入门;书籍的确会存在少量内容延迟,但整体框架是一致的,适合读者全面了解各个模块的基本知识。