1. 程式人生 > 其它 >訊息中介軟體:為什麼我們選擇 RocketMQ

訊息中介軟體:為什麼我們選擇 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

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)