作者:李偉
說起消息隊列,ActiveMQ、RabbitMQ、RocketMQ、Kafka、Pulsar 等紛紛涌入我們的腦海中, 在如此眾多的開源消息隊列產品中,作為一名合格的架構師如何給出高性價比的方案呢?商業化的產品暫不納入選項中。
接下來我將從選型要素、RocketMQ 的優勢兩個方面解釋為什么選擇 RocketMQ 。
選型要素
首先從公司、消息隊列服務提供者(一般是中間件團隊)、最終用戶三個角度來簡單總結分析。
一、從公司層面看, 關注如下幾點:
1. 技術成本
技術成本,一般包含服務器成本、二次開發成本、后期維護成本等,言而總之:都是錢。
服務器目前基本都使用雲服務器,不同的雲廠商的相同配置的服務器性能也有一定差異, 服務器成本一般需要了解:雲廠商機器性能、雲廠商優惠、所需服務器配置、服務器台數、單台服務器目前的價格、單台服務器優惠后的價格等。
2. 人力成本
人力成本,一般包含現有技術人員成本、新人招聘成本。
新的技術選型對於目前的技術人員接受程度怎么樣,學習的難易程度怎樣等,都是需要考慮的。如果太難的話,上線周期會變長、業務需求實現速度慢,甚至有人直接離職。
新人招聘成本,一般招聘一個新人有如下幾個過程:簡歷篩選、預約面試、數輪面試、發 offer 、接受 offer 、正式入職、試用期、轉正。這中間涉及到獵頭成本、人力資源溝通成本、面試成本、新人入職后環境適應成本等等。
3. 其他
目前處於不同階段的互聯網公司對於技術成本、人力成本有着不一樣的要求,但是很多有一定規模的公司實際上還是用“買買買”的心態來對待的:只要業務發展快速,買服務器、招人都不是問題,如果成本高了就做技術降成本、裁員。這不僅是員工之痛,也是業務之痛,更是公司之痛。
二、從中間件組層面看, 關注如下幾點:
1. 穩定
公司級的服務首要的一點就是穩定。擁有穩定的組件、穩定的服務,業務才能有條不紊的進行。所以說,無論什么時候, 穩定都是王道。
2. 功能支持
不同的業務場景需要的功能也不盡相同,通常我們會考慮重試、死信機制,位點重置,定時延遲消息、事物消息,主從切換,權限控制等方面。
3. 性能
目前包含寫入延遲和吞吐。
4. 管理平台
首先需要滿足最終用戶接入、查看、排障,管理員管控 topic 、消費者方便等。管理平台有現成的最好,方便二次開發 。
5. 監控、報警
監控報警是否完善、是否方便接入公司內部自研體系,或者行業的事實標准 Prometheus 。
6. 運維 & 支持 & 開源社區
如果產品上線后, 大部分時間,我們都是在做運維&支持。運維包含服務部署、遷移、服務升級、解決系統 Bug 、用戶使用答疑、管理平台和監控報警平台升級等。
7. 其他
我們除了依賴自身以外,也可以借助社區的力量,同一個問題可能別人遇到過並且提交過 PR ,已經得到解決,我們就可以以此作為借鑒。所以社區的活躍情況也是非常重要的考慮。
三、從最終用戶(一般包含業務后端研發以及他們的 Leader )看
1. 穩定性
對於業務的研發和他們的 Leader ,他們的核心任務是實現業務邏輯。如果一個服務三天兩頭總是有問題, 對於他們來說是比較致命的,所以穩定性是比較核心的一部分。
2. 改造現有項目的難度
舊項目改造其實是業務研發接入新中間件實際操作最多的部分。
3. 新項目接入是否便捷
是否便捷接入跟他們的工作量有着直接的關聯。
4. 與目前的 App 微服務框架兼容怎樣
新項目的接入和公司微服務框架兼容都比較容易。一般中間件在提供服務時都會考慮業務研發接入的便利性。
RocketMQ 的優勢
下面將按照選項要素的要求, 分析 RocketMQ 在這方面的優勢。
一、RocketMQ 如何解決和友好面對公司層面的訴求
1. 技術成本
就技術成熟度而言,在經歷阿里雙十一數萬億洪峰、微眾銀行、民生銀行、螞蟻金服、平安、字節跳動、快手、美團、京東、網易等各種行業大廠的考驗后,就不言而喻了。
RocketMQ 對於服務器的配置要求不高, 普通的雲主機都可以。曾經我們驗證 8C 16G 500G SSD 的 2 主 2 從的集群,發送 tps 可以到 4~5w ,消費 tps 峰值 20w +,穩定在 8w~9w 。並且,還能根據業務實際的需求無感的橫向擴展。
綜合而言, 技術成本相對可控且人才多。
2. 人力成本
人力成本主要是現有的技術人員的學習成本、招新人的成本。
RocketMQ 是 java 開發的,代碼也非常穩定、有條理,各個版本之間除了功能有差異之外,Api 、傳輸協議幾乎沒有太多變化,對於升級而言也更加方便。
java 也是目前中間件采用的比較主流的語言,使用的技術人員非常廣泛。RocketMQ 在金融行業比如:微眾銀行、民生銀行、螞蟻金服、平安; 其他行業公司,比如阿里、字節跳動、快手、美團、京東、網易等與大量中小企業都在使用,候選人范圍相對較大。
RocketMQ 社區也比較活躍,釘釘群、微信群、QQ 群眾多,社區文檔非常豐富和完善,原理剖析視頻、文檔也非常多,非常易於學習和入門。
下面是釘釘群,歡迎大家加群留言、答疑。
對於 java 方面的消息隊列方面的人才相比 C/C++、C#、Python、Go 等還是更多的:主流的 Kafka 是 scala + java、pulsar 是 java ,對於招聘也有極大的優勢。
綜合而言,RocketMQ 技術員對於人力成本比較友好。
二、從中間件組層面看,RocketMQ 是如何提供優秀的能力,為業務保駕護航呢?
1. 穩定性
金融級可靠、阿里雙十一穩定支持萬億級消息洪峰,在筆者之前所在公司也有過 2 年+零事故的佳績。
2. 功能豐富,支持的場景眾多
- 重試、死信機制,友好、無感的業務重試機制。
- 順序消息、事物消息
- 萬級 Topic 數量支持
- 消息過濾
- 消息軌跡追蹤
- 主從自動切換
- 原生支持 Prometheus 監控
- 原生支持易用管理平台:RocketMQ Console
- 訪問權限控制(ACL)
3. 性能
- RocketMQ 可以支持 99.9% 的寫入延遲在 2 ms ,其他的開源消息隊列中間件基本都是大於 5 ms ;目前大部分消息隊列中間間都支持橫向擴展,吞吐上橫向擴展幾乎都可以滿足。RocketMQ 的在滴滴做的性能測試: _https://developer.aliyun.com/article/664608 _, 大家參考。
- 發送、消費 tps 和 kafka 一個數量級,Topic 數量劇增對於性能影響較小。
4. 管理平台
RocketMQ Console 原生支持:
https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console
5. 監控、報警
RocketMQ Exporter 原生支持 Prometheus:
https://github.com/apache/rocketmq-exporter
6. 運維 & 支持 & 開源社區
- 無 zk 等第三方依賴,開箱即用
- 社區釘釘群、微信群、QQ 群非常活躍,釘釘群、微信群有問必答。
- 社區最近新來一位小姐姐 Commiter ,團隊也在不斷壯大。
綜合看來,RocketMQ 穩定、可靠、性能好,開箱即用,不依賴 Zookeeper ,系統的穩定性更高,復雜度更小。監控報警等周邊設施完善,場景支持全,社區活躍、文檔豐富,是中間件團隊的不二之選。
三、對於最終用戶:業務研發、業務研發 Leader,他們的核心擔憂是提供的技術是否穩定可靠、是否快速方便的接入
從中間件組層面看這個問題時,RocketMQ 穩定、可靠,那對於接入是否友好呢?
RocketMQ 提供 java 原生客戶端、Spring 客戶端,C++ 客戶端、Python 客戶端、Go 客戶端等多類型、多語言的客戶端,對於各種項目都可以統一接入。
微服務框架中 Spring Cloud 基本已經成為事實標准,RocketMQ 支持 Spring boot Starter 和 Spring Cloud Function 等多種方式融合入微服務框架,對於 Spring 體系支持更加方便快捷。
Kafka vs RocketMQ
實際中,很多人應該面臨過 RocketMQ vs Kafka ,Kafka 適合對於延遲不敏感、批量型、Topic 數量可控、對於消息丟失不敏感的場景。比如大數據場景的 MySQL-2Hive、MySQL-2-Flink 的數據流通道,日志數據流通道等。
RocketMQ 適用於金融轉賬消息、訂單狀態變更消息、手機消息 Push 等業務場景。這些場景 Topic 數量通常過萬,對於消息延遲和丟失極度敏感,數據通常是論條處理。對於海量數據的問題,一般地橫向擴容完全可以解決。
合適的場景選擇合適的產品,萬能的產品是不存在的,都是折中,都是取舍。
作者介紹
李偉,Apache RocketMQ 社區 Commiter ,Python 客戶端項目負責人, Apache RocketMQ 北京社區聯合發起人,Apache Doris Contributor 。目前就職於騰訊,主要負責 OLAP 數據庫開發,對分布式存儲系統設計和研發有豐富經驗,也熱衷於知識分享和社區活動。
RocketMQ 學習資料
阿里雲知行實驗室提供一系列的 RocketMQ 在線實操環境,包含操作文檔、ubuntu 實驗環境,大家隨時嘗試玩玩:
- Apache RocketMQ 開源入門最佳實踐:
https://start.aliyun.com/course?spm=a2ck6.17690074.0.0.53c52e7dSi19ML&id=eAz6VTK5
-
《RocketMQ 分布式消息中間件:核心原理與最佳實踐》隨書實戰:https://start.aliyun.com/course?spm=a2ck6.17690074.0.0.7aec2e7dCPMDFG&id=ASeJlmpX
-
在 Spring 生態中玩轉 RocketMQ:
https://start.aliyun.com/course?spm=a2ck6.17690074.0.0.241e2e7d0aEIxJ&id=hzidp9W1
實驗預覽圖如下:
其他資源
- RocketMQ vs. ActiveMQ vs. Kafka:
_ http://rocketmq.apache.org/docs/motivation/_
- RocketMQ 源碼:
_ https://github.com/apache/rocketmq_
- RocketMQ Exporter 源碼:
_ https://github.com/apache/rocketmq-exporter_
- RocketMQ Spring 源碼:
_ https://github.com/apache/rocketmq-spring_
- RocketMQ C++ 客戶端源碼:
_ https://github.com/apache/rocketmq-client-cpp_
- RocketMQ Python 客戶端源碼:
_ https://github.com/apache/rocketmq-client-python_
- RocketMQ Go 客戶端源碼:
_ https://github.com/apache/rocketmq-client-go_
- RocketMQ Console 源碼:
_ https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console_
- RocketMQ Flink Connector 源碼:
_ https://github.com/apache/rocketmq-externals/tree/master/rocketmq-flink_
-
RocketMQ 如何保證消息可靠:
[https://mp.weixin.qq.com/s/imLTVwgm8MOiY1_5s3rdFQ](https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247502152&idx=1&sn=3c356a4b65d50e964f0350a13ba08df3&scene=21#wechat_redirect)
-
大揭秘!RocketMQ 如何管理消費進度:
[https://mp.weixin.qq.com/s/rHs9L1gTuFs05Cs2F4JXOw](https://mp.weixin.qq.com/s?__biz=MjM5NTk0NjMwOQ==&mid=2651114644&idx=1&sn=fa93f0264989b536153dc683a246601a&scene=21#wechat_redirect)