概述
本节将介绍 Apache RocketMQ 5.x 客户端 SDK 的演进历程、选型对比及最佳实践。
历史与选择
自项目诞生以来,Apache RocketMQ 已演进至目前的 5.x 版本。目前,RocketMQ 主要支持基于底层通信协议差异的两个系列客户端 SDK,即 Remoting 协议和 gRPC 协议。
Remoting 协议作为早期组件间的默认通信协议,其内置的客户端 SDK 始终与主仓库版本保持同步演进和迭代。Remoting 协议 SDK 长期与服务端代码版本迭代绑定,主要支持 Java 语言。
gRPC 协议于 5.0 版本中引入,旨在结合主流云原生技术,演进出一套更轻量、标准化且易于扩展的客户端-服务端通信协议。gRPC 协议 SDK 作为独立仓库 RocketMQ Clients 演进,支持 Java/C++/.NET/Go/Rust 等多种语言。客户端与服务端之间的关系相对解耦,遵循 RocketMQ API 协议接口约定。
如何快速区分所使用的 SDK 是 Remoting 协议还是 gRPC 协议?
方法一:检查仓库坐标
- 对于 Java 语言:如果仓库坐标为 rocketmq-client,则为 Remoting 协议;如果为 rocketmq-client-java,则为 gRPC 协议。
- 对于其他语言:其他 gRPC 语言 SDK 的命名格式均为 rocketmq-client-{language}。
方法二:检查关键字
- 如果代码包或类路径(classpath)中包含 'remoting' 关键字,则为 Remoting 协议;否则为 gRPC 协议 SDK。
Remoting 协议 SDK 与 gRPC 协议 SDK 的对比情况,请参考下表:
| 对比项 | Remoting SDK | gRPC SDK |
|---|---|---|
| 多语言支持 | Java/Go | Java/C/C++/.NET/Go/Rust 详情请见 链接 |
| 功能与接口 | 生产者 (Producer) PushConsumer PullConsumer LitePullConsumer Admin | 生产者 (Producer) PushConsumer(仅 Java) SimpleConsumer PullConsumer(开发中) |
| 兼容版本 | 支持 4.x 和 5.x 服务端 | 仅支持 5.0 及以上版本服务端 |
| 演进方向 | Remoting 协议主要用于服务端内部组件间的通信演进 | gRPC 协议是首选的轻量级多语言客户端,后续将逐步完善所有功能 |
Remoting SDK
作为 Apache RocketMQ 最初的 SDK,Remoting 协议 SDK 使用了 RocketMQ 内部组件的 Remoting 通信协议。它既用于服务内部组件的通信,也支持客户端消息发送与管理操作的 API 通信。
SDK 信息
当前支持的编程语言及代码仓库如下:
| 语言 | 版本说明 (ReleaseNote) | SDK 仓库 |
|---|---|---|
| Java | 主仓库发布说明 | 主仓库 |
| Go | 主仓库发布说明 | 主仓库 |
功能特性
等待更新。
gRPC SDK
gRPC 协议 SDK 引入于 Apache RocketMQ 5.0 版本,旨在为 Java、C++、C#、Golang、JavaScript 和 Rust 等主流编程语言提供云原生、健壮的客户端解决方案。gRPC SDK 遵循 rocketmq-apis 约束,并使用 Protocol Buffers 和 gRPC 取代了 4.x 版本中的旧协议。
相较于早期的 Remoting 协议 SDK,gRPC SDK 具有以下优势:
- 接口设计更加简洁,易于理解且不易出错。
- 更好的接口设计,具有清晰的参数和异常类型定义。
- 不可变接口设计,避免了因参数和信息泄漏导致的业务异常。
- 更好的多语言支持。gRPC 协议具备多语言支持优势,能够以更低的成本实现多语言 SDK 在行为上的一致性。
如需了解详细的设计思路和演进方向,请参考 RIP-37: 新的统一 API 和 RIP-39: 支持 gRPC 协议。
SDK 信息
当前支持的编程语言及代码仓库,请参考 rocketmq-clients。
功能特性
等待更新。
常见问题 (FAQ)
以下章节列出了一些针对特定场景的推荐选型策略。
gRPC SDK 可以与 4.x 版本的服务端一起使用吗?
不可以,gRPC SDK 仅支持 5.0 及以上版本的服务端。建议先平滑升级服务端至 5.0 版本,然后再替换 SDK。
从 Remoting SDK 切换到 gRPC SDK 时需要修改代码吗?
是的,需要修改。gRPC SDK 的客户端 API 经过重新设计,与 Remoting SDK API 不兼容,因此必须进行相应的代码修改。
在构建新系统时,使用 RocketMQ 应该如何选择 SDK?
如果新业务系统正在集成 RocketMQ,建议使用 gRPC SDK,因为它提供了更好的用户体验和对多语言环境的支持。