消息中间件:为什么我们选择 RocketMQ
作者:李偉
說起消息隊列,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)
總結
以上是生活随笔為你收集整理的消息中间件:为什么我们选择 RocketMQ的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进击的云原生,为开发者提供更多可能性
- 下一篇: RocketMQ 千锤百炼--哈啰在分布