高吞吐、高可用MQ對比分析
基本對比資訊
ActiveMQ | RabbitMQ | RocketMQ | Kafka | ZeroMQ | |
吞吐量 | 比RabbitMQ低 | 2.6w/s(訊息做持久化) | 11.6w/s | 17.3w/s | 29w/s |
開發語言 | Java | Erlang | Java | Scala/Java | C |
主要維護者 | Apache | Mozilla/Spring | Alibaba | Apache | iMatix,創始人已去世 |
成熟度 | 成熟 | 成熟 | 開源版本不夠成熟 | 比較成熟 | 只有C、PHP等版本成熟 |
文件和註釋 | 多 | 多 | 很少 | 較少 | 很少 |
訂閱形式 | 點對點(p2p)、廣播(釋出-訂閱) |
提供了4種:direct, topic ,Headers和fanout。fanout就是廣播模式 |
基於topic/messageTag以及按照訊息型別、屬性進行正則匹配的釋出訂閱模式 | 基於topic以及按照topic進行正則匹配的釋出訂閱模式 | 點對點(p2p) |
持久化 | 支援少量堆積 | 支援少量堆積 | 支援大量堆積 | 支援大量堆積 | 不支援 |
順序訊息 |
不支援 |
不支援 | 支援 | 支援 | 不支援 |
訊息回溯 | 不支援 | 不支援 | 支援指定時間點的回溯 | 支援指定分割槽offset位置的回溯 |
不支援 |
效能穩定性 | 好 | 好 | 一般 | 較差 | 很好 |
負載均衡 | 可以支援 | 可以支援 | 支援較好 | 支援很好 | 不支援 |
叢集方式 | 支援簡單叢集模式,比如'主-備',對高階叢集模式支援不好。 |
支援簡單叢集,'複製'模式,對高階叢集模式支援不好。 |
常用 多對'Master-Slave' 模式,開源版本需手動切換Slave變成Master |
天然的‘Leader-Slave’無狀態叢集,每臺伺服器既是Master也是Slave |
不支援 |
管理介面 | 一般 | 較好 | 一般 | 無 | 無 |
而談到訊息系統的設計,就回避不了兩個問題:
1、訊息的順序問題
2、訊息的重複問題
關於這兩方面,RocketMQ的測試結果如下:
一、訊息順序讀寫
參考文章:http://www.jianshu.com/p/453c6e7ff81c
1、常規的理解是:在同一個佇列(分割槽)的訊息是按順序排列的。但測試結果如下:
單伺服器單個執行緒的Producer非同步生產資料,生產的資料都用同一個字串做hash,資料都分配在同一臺機器的同一個佇列。
單伺服器單Consumer配置1個或者10個執行緒一起消費,每次最多抓取1條或者1014條資料,結果:同一個執行緒同一批次取回來的資料,順序卻不一致。
例如,取回來的資料預期順序是:12、13、14、15、16……但結果卻是:13、14、15、16、12……
同一批次測試,所有環境都一樣,有一定機率(大概15%)會出現該情況。
原因:Producer非同步生產資料會導致資料亂序。即使是單執行緒的Producer。
解決方案:為保證生產的訊息順序一致,Producer需採用同步傳送資料,但是效能會大大下降(實測1851條/秒,同等情況下比kafka慢45%,不過一般情況下這效能也足夠了)。
二、訊息不丟失、不存在重複傳送
根據阿里的測試結論,RocketMQ和Kafka在 訊息不丟失 方面,做得差不多,伺服器基本上不會丟失資料。結論如下:
1、在Broker程序被Kill的場景(在訊息收發過程中,利用Kill -9 命令使Broker程序終止), Kafka和RocketMQ都不丟訊息,可靠性都比較高。
2、在宿主機掉電的場景,在“同步刷盤”策略下,Kafka與RocketMQ均能做到不丟訊息,在“非同步刷盤”策略下,Kafka和RMQ都無法保證掉電後不丟訊息。
參考來源:http://jm.taobao.org/2016/04/28/kafka-vs-rocktemq-4/
在 訊息不重複 方面,RocketMQ和Kafka估計都差不多,在kill或者宕機時,都會存在資料重複,而且RocketMQ官方說明,RocketMQ無法保證資料不重複,建議通過業務手段來保證。
實際應用場景分析(RocketMQ)
1、保證訊息按順序寫入和讀取
1)順序寫入(前提:單機,或者 叢集但是每個節點來源資料不同)
原理:
在同一個佇列(分割槽)的訊息是按順序排列的。(跟Kafka一樣,只不過kafka的分割槽為物理分割槽,rocketMQ的佇列是邏輯分割槽)
故,要保證訊息按順序處理,必須把它們放在同一個佇列中。
實現方式:但producer同步傳送資料,按orderid hash來區分佇列存放資料。
單執行緒版:RocketMQ使用單執行緒同步寫入訊息到topic裡面,topic使用訊息型別區分,appid用tags區分,可以在訊息中新增orderid關鍵字。
例如:
Message(topic->"abc", tags->"appid11111", keys->"M324343ef", content);
Message(topic->"cdb", tags->"appid33333", keys->"M684343ef", content);
多執行緒版:每個執行緒操作不同appId的資料。實測單機普通CPU多執行緒無益於提高producer的效率。(i7-CPU測試結果為:兩執行緒比單執行緒提高36%,三執行緒比兩執行緒提高12%,三執行緒CPU已爆滿)
2)按順序消費
RocketMQ的消費方式有兩種,一種是傳統的自動化的push推模式(對應的DefaultMQPushConsumer),伺服器端主動推送訊息。另一種是pull拉模式(對應的DefaultMQPullConsumer),客戶端從指定位置主動去伺服器拉取資料。
RocketMQ 的 推 模式原理:原始碼分析(略)
問題:Consumer可以設定消費執行緒的數量,但是在順序消費的模式(MessageListenerOrderly)下,多個消費執行緒對於同一佇列的資料,無法並行執行,仍然是序列執行,以達到順序處理資料的目的。對多個不同佇列的資料,消費執行緒可以並行執行。
例如:producer同步傳送資料,按orderid hash來區分佇列存放資料。假設一個topic,有999個orderid分配到999個佇列,
假設consumer端有50個消費執行緒,那麼這50個執行緒就可以並行的消費999個佇列裡面的資料。
3)與kafka對比
順序寫入:kafka producer同步傳送資料,按orderid hash來區分佇列存放資料。假設一個topic,有999個orderid分配到8個分割槽,
順序消費:kafka consumer都訂閱所有topics,但是consumer執行緒受制於partition數量的限制,假設為8,那麼最多8個執行緒並行消費資料,這8個執行緒並行的消費8個partition裡面的資料。
關鍵之處,kafka和rocketMQ的區別在於一個用物理分割槽來存放資料,一個按虛擬佇列的存放資料,都能保證佇列或分割槽裡面資料的有序性。
據阿里中介軟體 官方給出的測試結論,RocketMQ虛擬佇列的效率 高於kafka 物理分割槽的效率,當kafka的分割槽數大於8時,kafka效能快速下降,而rocketMQ支援1萬佇列而不會降低效能。
叢集模式:
假設有4臺master的RocketMQ ,
每臺RocketMQ 的consumer都訂閱所有topic,
假設一個topic,有999個appid分配到999個佇列,
假設每臺RocketMQ consumer端有50個消費執行緒,那麼這4*50=200個執行緒就可以並行的消費999個佇列裡面的資料。
假設有4臺broker的Kafka,
每臺kafka的consumer都訂閱所有topic,
假設一個topic,有999個orderid分配到8個分割槽,
總的consumer執行緒受制於partition數量的限制,假設為8,那麼最多8個執行緒(4*2,每臺broker2個執行緒)並行消費8個partition裡面的資料。
顯然,RocketMQ 更佔優勢,如果kafka要達到RocketMQ 這種效果,需要擴充套件到200個分割槽才能使200個執行緒同時消費。
開源版本RocketMQ存在的問題
1、主從不能自動切換,導致了一系列小問題。
1)普通訊息當主掛了,會拉取從上面的訊息,最後如果主又活過來了,會導致重複消費(之前消費的進度在從上面)。
2)主down,順序訊息不能寫入,不能消費(順序消費不能消費slave上面的訊息)。順序訊息是寫入特定的queue,這個queue所在的機器掛了,就不能寫了,手動寫入其他的queue,在業務來看,也是有問題。
2、rocketmq 對於訊息重複的處理能力是不足且沒有保障的,文件中也明確說明需要業務去重。
3、對於指定位置消費,RocketMQ 的PushAPI比較低階,需要自己實現消費位置的儲存、節點的拉取和維護等。
Github上有300多個issues,坑很多,而且看評論,都沒有及時解決。
相比Kafka,在Apache下,有完善的測試,能看到存在的bug和fix狀態,以及比較詳細的說明。比如:
https://issues.apache.org/jira/browse/KAFKA-4189?jql=project%20%3D%20KAFKA%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20consumer%20ORDER%20BY%20priority%20DESC
推薦一篇關於RocketMQ非常棒的文章:
http://www.jianshu.com/p/453c6e7ff81c#
相關推薦
高吞吐、高可用MQ對比分析
基本對比資訊 ActiveMQ RabbitMQ RocketMQ Kafka ZeroMQ 吞吐量 比RabbitMQ低 2.6w/s(訊息做持久化) 11.6w/s 17.3w/s 29w/s 開發語言 Java Erlang Java
服務端技術進階(四)一篇文讀懂分散式系統本質:高吞吐、高可用、可擴充套件
服務端技術進階( 四)一篇文讀懂分散式系統本質:高吞吐、高可用、可擴充套件 承載量是分散式系統存在的原因 當一個網際網路業務獲得大眾歡迎的時候,最顯著碰到的技術問題,就是伺服器非常繁忙。當每天有1000萬個使用者訪問你的網站時,無論你使用什麼樣的伺服
Spark Streaming高吞吐、高可靠的一些優化
> 分享一些Spark Streaming在使用中關於高吞吐和高可靠的優化。 [toc] 作為Spark的流式處理框架,Spark Streaming基於微批RDDs實現,需要7*24小時執行。在實踐中,我們需要通過不斷的優化來保證它的高可靠,高吞吐。 本文從高吞吐和高可靠兩個角度來簡單介紹一下
【陌上軒客】技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業規劃:勵志成為一名出色的伺服器端系統架構師。
陌上軒客 技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業...
java高階,、高併發、高可用、高效能、分散式、負載均衡
1、億級流量電商網站的商品詳情頁系統架構 面臨難題:對於每天上億流量,擁有上億頁面的大型電商網站來說,能夠支撐高併發訪問,同時能夠秒級讓最新模板生效的商品詳情頁系統的架構是
kubernetes中port、target port、node port的對比分析,以及kube-proxy代理
ans toc contain exp red lec adb service 接口 轉:http://blog.csdn.net/xinghun_4/article/details/50492041 容器網絡實例 服務中的3個端口設置 這幾個port的概念很容易混淆,比
斯坦福大學公開課機器學習: advice for applying machine learning | deciding what to try next(revisited)(針對高偏差、高方差問題的解決方法以及隱藏層數的選擇)
ice 簡單 pos .com img 想要 技術 分割 就是 針對高偏差、高方差問題的解決方法: 1、解決高方差問題的方案:增大訓練樣本量、縮小特征量、增大lambda值 2、解決高偏差問題的方案:增大特征量、增加多項式特征(比如x1*x2,x1的平方等等)、減少la
Merge join、Hash join、Nested loop join對比分析
SQL server 內部實現了三種類型的內連線運算,大多數人從來沒有聽說過這些連線型別,因為它們不是邏輯連線也很少被用於程式碼中。那麼它們什麼時候會被用到呢?答案是要依情況而定。這就意味著要依賴於記錄集和索引。查詢優化器總是智慧的選擇最優的物理連線型別。我
金蝶K/3和U8、易飛的對比分析
序號 對比事項 金蝶K/3 用友U8 神碼易飛 1 公司實力 金蝶總部位於深圳,1993年創辦,主要客戶群體是以深圳為核心的民營企業和外資企業。2000年於香港上市,在中國製造業擁有最大的市場份額,2008年營業額達8.75億,自主研發和技術創新型企業,金蝶核心競爭力體現在
處理高併發、高訪問之Apache優化
前言: 專案100人同時訪問,導致訪問速度變慢,作為一個沒有遇到過這種情況下的轅,在各種查閱資料後,先用刪除日誌更改日誌輸出的方法處理後(處理方法:修改Apache日誌輸出相關配置方法),暫時好緩,後來又出現變慢,在查閱各種部落格後,發現一個處理併發的方法,小
15套java架構師、集群、高可用、高可擴展、高性能、高並發、性能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式項目實戰視頻教程
mycat 擴展 並發解決方案 入門到 -1 高端 資料 src nio * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java
java架構師課程、性能調優、高並發、tomcat負載均衡、大型電商項目實戰、高可用、高可擴展、數據庫架構設計、Solr集群與應用、分布式實戰、主從復制、高可用集群、大數據
慢查詢 主從復制 難題 jms 整合 大數 數據庫設計 企業級 nginx網站 15套Java架構師詳情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color:
15套java互聯網架構師、高並發、集群、負載均衡、高可用、數據庫設計、緩存、性能優化、大型分布式 項目實戰視頻教程
二階 並發 支持 線程並發 important http 系統架構 四十 mongodb入門 * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架構師、集群、高可用、高可擴
【算法設計與分析基礎】16、高斯消元法
ane sys cnblogs 根據 gauss tostring logs junit air package cn.xf.algorithm.ch06ChangeRule; import java.util.ArrayList; import java.util.L
15套java架構師、高並發、集群、高可用、高可擴展、高性能、性能優化Redis、ActiveMQ、Mycat、Netty、Jvm
高並發 集群 分布式 多線程 項目實戰 15套Java架構師詳情15套java架構師、集群、高可用、高可擴展、高性能、高並發、性能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式項目實戰視頻教程 視頻課程包含:高級Java架構
高性能、高可用的分布式架構體系(轉)
基礎上 keepal 第三方應用 備份 用戶 即時通訊 banner 協同辦公 產品 在2B企業服務、雲計算、移動互聯網領域,專業的雲平臺服務裏,分布式技術為支撐平臺正常運作關鍵性技術。從商業利潤和運維成本角度出發,千方百計榨幹服務器的每一分性能很大程度上影響著網站的
強一致、高可用、自動容災能力背後,阿裏X-Paxos的應用實踐
強一致 自動容災 高可用 阿裏x-paxos 能力 axos(分布式一致性算法)作為分布式系統的基石,一直都是計算機系統工程領域的熱門話題。Paxos 號稱是最難理解的算法,其實當真這麽困難麽?X-Paxos 是阿裏巴巴數據庫團隊面向高性能、全球部署以及阿裏業務特征等需求,實現的一個高性能
keepalived通過vrr_script實現高可用性案例分析
keepalived vrr_script實現高可用性案例分析ps -C nginx --no-heading|wc -lps -C java --no-heading|wc -l先確認一下服務器上上面兩個數字cd /etc/keepalivedvi /etc/keepalived/check_ngin
高性能、高可用、高擴展ERP系統架構設計
sqlserve 學習 業務邏輯層 表設計 應用程序 log cnblogs 便在 tab ERP之痛 曾幾何時,我混跡於電商、珠寶行業4年多,為這兩個行業開發過兩套大型業務系統(ERP)。作為一個ERP系統,系統主要功能模塊無非是訂單管理、商品管理、生產采
nginx反向代理tomacat+keepalived實現動靜分離、負載均衡、高可用
時間 超時 error css 權限命令 上傳 轉發 onf ioc 本文的動靜分離主要是通過nginx+tomcat來實現,其中nginx處理圖片、html、JS、CSS等靜態文件,tomcat處理jsp、servlet等動態請求 服務器名稱