RocketMQ 多語言 SDK 開源貢獻召集令

作者:艾陽坤

目前 Apache RocketMQ 5.0 SDK [ 1] 正在社區開源,開發與迭代也在火熱進行中,歡迎廣大社區的朋友們能夠參與其中。我們歡迎任何形式的貢獻,包括但不限於新 feature、bugfix、代碼優化、生態集成、測試工作、文檔撰寫。更加歡迎能夠認領一個完整的特定語言實現的同學,踏出第一步,你就是 contributor!更有驚喜禮品和成爲 committer 的機會等着你!

寫在前面

Apache RocketMQ 是由阿里巴巴集團捐贈給 Apache 開源基金會的一款低延遲、高併發、高可用、高可靠的分佈式消息中間件,並於 2017 年正式從 Apache 社區畢業,成爲 Apache 頂級項目(TLP)。也是國內首個非 Hadoop 生態體系的互聯網中間件頂級項目。

面向過去,RocketMQ 經過多年淘寶雙十一的洗禮和考驗,贏得了諸多客戶的認可和青睞。面向未來,RocketMQ 歷久彌新,爲了更好地迎接雲原生時代的來臨,基於存算分離架構的 RocketMQ 5.0 應運而生。

1.png

RocketMQ 5.0 中引入了全新的無狀態 Proxy 組件,在水平拓展,故障應急,多協議等方面都進行了諸多支持與改進(關於 RocketMQ 5.0 的詳細介紹,歡迎關注 **Rocketmq 官網 [ 2] **)。同時也爲接下來多語言客戶端的實現打下了良好基礎。

新的多語言SDK

RocketMQ 5.0 客戶端相比較於 4.x 的版本進行了諸多改進,會是未來社區客戶端演進的主流方向。RocketMQ 4.x SDK 的多語言支持並不完美,協議的較高複雜度和語言綁定的實現細節使得多語言的支持與維護都變得棘手,而用戶對多語言的訴求是強烈的。值此契機,RocketMQ 5.0 基於 gRPC 正式推出了全新的多語言 SDK。

2.png

相比較於 RocketMQ 4.x 的 SDK。RocketMQ 5.0 展現出了一副全新的面貌:

  • 採用全新極簡的,immutable 的 API 設計,使得 API 上手更簡單,跨語言的對齊也變得更加簡單;
  • 完善的錯誤處理體系和錯誤碼設計,開發者和用戶對錯誤的處理可以更加得心應手;
  • 在 PushConsumer/PullConsumer 之外新推出無狀態 SimpleConsumer,實現邏輯輕量,用戶可以自行管理消費側消息的接收與應答,同時也對有更多定製化需求的客戶提供了便利。
  • 實現輕量化,代碼量相比較舊有實現縮減 3/4 以上,開發和維護的成本更低;
  • 標準化的 logging/tracing/metrics 輸出,降低實現複雜度的同時,可觀測性的提升會使得生產環境下的問題更容易被捕捉;

gRPC 多語言特性,爲 RocketMQ 5.0 客戶端的多語言實現提供了支撐。RocketMQ 全新的客戶端的協議層被替換,語言無關的 IDL 使得協議的維護和實現都更爲極爲簡單。同時得益於 gRPC 強大的生態體系,使得 RocketMQ 與周邊的集成也變得更爲簡便。

3.png

RocketMQ 5.0 中引入了新的的 pop 消費,創造性地在原生的隊列模型之上支持了這種無狀態的消費模式。不同於原始的更適用於流場景的隊列模型,pop 機制更面向於業務消息的場景,使得開發者和用戶可以只關心消息本身,可以通過「SimpleConsumer」提供單條消息級別的接受/重試/修改不可見時間以及刪除等 API 能力。

Roadmap

目前 5.0 多語言 SDK 的 Java/C++ 已經有了相對比較完整的實現。

Go/C# 已經提供了基礎的 Producer/SimpleConsumer 的實現,其餘的語言實現(PHP/Python/JavaScript/Rust 等)還在社區進行中,歡迎大家廣泛參與。

4.png

對於一個從零開始的特定語言實現,一個大概的步驟如下:

  • 部署 rocketmq-namesrv [ 3] 和 **rocketmq-proxy [ 4] **方便與客戶端進行調試,爲降低部署成本,rocketmq-proxy 可以採用 LOCAL 模式進行部署。
  • 熟悉 rocketmq-apis中的 IDL,適配新的 gRPC/Protobuf 協議:IDL 中描述了 5.0 SDK 中的語言無關的協議描述,通過 gRPC protoc 工具自動生成協議層代碼。
  • 應用新的 API 規範和設計:可以參考 **Java 的 API 設計 [ 5] **,總體指導思想是不可變性且行爲明確。
  • 實現 Producer/SimpleConsumer:Producer 提供最基本的四種不同類型消息的發送功能(普通/順序/定時/事務),SimpleConsumer 提供基於 pop 語義的無狀態消息接受/重試/修改不可見時間等能力。
  • 統一的錯誤處理體系:由服務端產生的異常與錯誤均有完善的異常錯誤碼和異常信息,各個語言實現需要以最適合的方式暴露給客戶。
  • 實現 PushConsumer:RocketMQ 4.x 中最爲常用的消費者類型,用戶側只需要明確訂閱關係和定義消息監聽器行爲即可,客戶端實現中需要自動幫用戶從遠端獲取消息。
  • 客戶端全方位可觀測性:規範的日誌輸出,實現基於 OpenTelemetry/OpenCensus 的客戶端 metrics 體系。

按照以上流程開發者在開發過程中出現的任何問題,都歡迎以 issue/pull request 的形式反饋到社區。

如何參與貢獻

我們歡迎任何形式的貢獻,包括且不限於新 feature、bugfix、代碼優化、生態集成、測試工作、文檔撰寫。更加歡迎能夠認領一個完整的特定語言實現的同學!不要猶豫,歡迎大家以 issue/pull request 的形式將你的想法反饋到社區,一起來建設更好的 RocketMQ!

5.png

相關資料

rocketmq-clients: RocketMQ 5.0 多語言客戶端實現

https://github.com/apache/rocketmq-clients

rocketmq: RocketMQ 主倉庫(內置 5.0 proxy 實現)

https://github.com/apache/rocketmq

rocketmq-apis: RocketMQ 5.0 協議具體定義

https://github.com/apache/rocketmq-apis

《RIP-37: RocketMQ 全新統一 API 設計》

https://shimo.im/docs/m5kv92OeRRU8olqX

《RIP-39: RocketMQ gRPC 協議支持》

https://shimo.im/docs/gXqmeEPYgdUw5bqo

相關鏈接

[1] Apache RocketMQ 5.0 SDK

https://github.com/apache/rocketmq-clients

[2] rocketmq 官網

https://rocketmq.apache.org/docs/

[3] rocketmq-namesrv

https://github.com/apache/rocketmq/tree/develop/namesrv

[4] rocketmq-proxy

https://github.com/apache/rocketmq/tree/develop/proxy

[5] Java 的 API 設計

https://github.com/apache/rocketmq-clients/tree/master/java/client-apis

點擊此處,參考完整的貢獻流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章