1. 程式人生 > >高吞吐、高可用MQ對比分析

高吞吐、高可用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小時執行。在實踐中,我們需要通過不斷的優化來保證它的高可靠,高吞吐。 本文從高吞吐和高可靠兩個角度來簡單介紹一下

【陌上軒客】技術領域:涉獵JavaGoPythonGroovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體快取與資料庫分散式與微服務容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業規劃:勵志成為一名出色的伺服器端系統架構師。

陌上軒客 技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業...

java高階,併發可用高效能分散式負載均衡

1、億級流量電商網站的商品詳情頁系統架構 面臨難題:對於每天上億流量,擁有上億頁面的大型電商網站來說,能夠支撐高併發訪問,同時能夠秒級讓最新模板生效的商品詳情頁系統的架構是

kubernetes中porttarget portnode 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 joinHash joinNested loop join對比分析

        SQL server 內部實現了三種類型的內連線運算,大多數人從來沒有聽說過這些連線型別,因為它們不是邏輯連線也很少被用於程式碼中。那麼它們什麼時候會被用到呢?答案是要依情況而定。這就意味著要依賴於記錄集和索引。查詢優化器總是智慧的選擇最優的物理連線型別。我

金蝶K/3和U8易飛的對比分析

  序號 對比事項 金蝶K/3 用友U8 神碼易飛 1 公司實力 金蝶總部位於深圳,1993年創辦,主要客戶群體是以深圳為核心的民營企業和外資企業。2000年於香港上市,在中國製造業擁有最大的市場份額,2008年營業額達8.75億,自主研發和技術創新型企業,金蝶核心競爭力體現在

處理併發訪問之Apache優化

前言: 專案100人同時訪問,導致訪問速度變慢,作為一個沒有遇到過這種情況下的轅,在各種查閱資料後,先用刪除日誌更改日誌輸出的方法處理後(處理方法:修改Apache日誌輸出相關配置方法),暫時好緩,後來又出現變慢,在查閱各種部落格後,發現一個處理併發的方法,小

15套java架構師集群可用可擴展性能並發性能優化Spring bootRedisActiveMQNginxMycatNettyJvm大型分布式項目實戰視頻教程

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架構師並發集群可用可擴展性能性能優化RedisActiveMQMycatNettyJvm

高並發 集群 分布式 多線程 項目實戰 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等動態請求 服務器名稱