Apache RocketMQ QuickStart

RocketMQ作為一款分布式的消息中間件(阿里的說法是不遵循任何規(guī)范的,所以不能完全用JMS的那一套東西來看它),經(jīng)歷了Metaq1.x、Metaq2.x的發(fā)展和淘寶雙十一的洗禮,在功能和性能上遠超ActiveMQ。

1.要知道RocketMQ原生就是支持分布式的,而ActiveMQ原生存在單點性。

2.RocketMQ可以保證嚴格的消息順序,而ActiveMQ無法保證!

3.RocketMQ提供億級消息的堆積能力,這不是重點,重點是堆積了億級的消息后,依然保持寫入低延遲!

4.豐富的消息拉取模式(Push or Pull)

Push好理解,比如在消費者端設置Listener回調(diào);而Pull,控制權(quán)在于應用,即應用需要主動的調(diào)用拉消息方法從Broker獲取消息,這里面存在一個消費位置記錄的問題(如果不記錄,會導致消息重復消費)。

5.在Metaq1.x/2.x的版本中,分布式協(xié)調(diào)采用的是Zookeeper,而RocketMQ自己實現(xiàn)了一個NameServer,更加輕量級,性能更好!

6.消息失敗重試機制、高效的訂閱者水平擴展能力、強大的API、事務機制等等(后續(xù)詳細介紹)

初步理解Producer/Consumer Group
ActiveMQ中并沒有Group這個概念,而在RocketMQ中理解Group的機制很重要。

image.png

Group機制
想過沒有,通過Group機制,讓RocketMQ天然的支持消息負載均衡!

比如某個Topic有9條消息,其中一個Consumer Group有3個實例(3個進程 OR 3臺機器),那么每個實例將均攤3條消息!(注意RocketMQ只有一種模式,即發(fā)布訂閱模式。)

http://rocketmq.apache.org/docs/quick-start/

Quick Start

This quick start guide is a detailed instruction of setting up RocketMQ messaging system on your local machine to send and receive messages.

The following softwares are assumed installed:

64bit OS, Linux/Unix/Mac is recommended;
64bit JDK 1.8+;
Maven 3.2.x
Git

Clone & Build

  > git clone -b develop https://github.com/apache/incubator-rocketmq.git
  > cd incubator-rocketmq
  > mvn -Prelease-all -DskipTests clean install -U
  > cd distribution/target/apache-rocketmq

Start Name Server

  > nohup sh bin/mqnamesrv &
  > tail -f ~/logs/rocketmqlogs/namesrv.log
  The Name Server boot success...

Start Broker

  > nohup sh bin/mqbroker -n localhost:9876 &
  > tail -f ~/logs/rocketmqlogs/broker.log 
  The broker[%s, 172.30.30.233:10911] boot success...

Send & Receive Messages

Before sending/receiving messages, we need to tell clients the location of name servers. RocketMQ provides multiple ways to achieve this. For simplicity, we use environment variable NAMESRV_ADDR

 > export NAMESRV_ADDR=localhost:9876
 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
 SendResult [sendStatus=SEND_OK, msgId= ...
 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
 ConsumeMessageThread_%d Receive New Messages: [MessageExt...

Shutdown Servers

> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK

轉(zhuǎn)自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka

淘寶內(nèi)部的交易系統(tǒng)使用了淘寶自主研發(fā)的Notify消息中間件,使用Mysql作為消息存儲媒介,可完全水平擴容,為了進一步降低成本,我們認為存儲部分可以進一步優(yōu)化,2011年初,Linkin開源了Kafka這個優(yōu)秀的消息中間件,淘寶中間件團隊在對Kafka做過充分Review之后,Kafka無限消息堆積,高效的持久化速度吸引了我們,但是同時發(fā)現(xiàn)這個消息系統(tǒng)主要定位于日志傳輸,對于使用在淘寶交易、訂單、充值等場景下還有諸多特性不滿足,為此我們重新用Java語言編寫了RocketMQ,定位于非日志的可靠消息傳輸(日志場景也OK),目前RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,消息推送,日志流式處理,binglog分發(fā)等場景。

為了方便大家選型,整理一份RocketMQ與Kafka的對比文檔,文中如有錯誤之處,歡迎來函指正。vintage.wang@gmail.com

數(shù)據(jù)可靠性

RocketMQ支持異步實時刷盤,同步刷盤,同步Replication,異步Replication
Kafka使用異步刷盤方式,異步Replication
總結(jié):RocketMQ的同步刷盤在單機可靠性上比Kafka更高,不會因為操作系統(tǒng)Crash,導致數(shù)據(jù)丟失。 同時同步Replication也比Kafka異步Replication更可靠,數(shù)據(jù)完全無單點。另外Kafka的Replication以topic為單位,支持主機宕機,備機自動切換,但是這里有個問題,由于是異步Replication,那么切換后會有數(shù)據(jù)丟失,同時Leader如果重啟后,會與已經(jīng)存在的Leader產(chǎn)生數(shù)據(jù)沖突。開源版本的RocketMQ不支持Master宕機,Slave自動切換為Master,阿里云版本的RocketMQ支持自動切換特性。
性能對比

Kafka單機寫入TPS約在百萬條/秒,消息大小10個字節(jié)
RocketMQ單機寫入TPS單實例約7萬條/秒,單機部署3個Broker,可以跑到最高12萬條/秒,消息大小10個字節(jié)
總結(jié):Kafka的TPS跑到單機百萬,主要是由于Producer端將多個小消息合并,批量發(fā)向Broker。
RocketMQ為什么沒有這么做?

Producer通常使用Java語言,緩存過多消息,GC是個很嚴重的問題
Producer調(diào)用發(fā)送消息接口,消息未發(fā)送到Broker,向業(yè)務返回成功,此時Producer宕機,會導致消息丟失,業(yè)務出錯
Producer通常為分布式系統(tǒng),且每臺機器都是多線程發(fā)送,我們認為線上的系統(tǒng)單個Producer每秒產(chǎn)生的數(shù)據(jù)量有限,不可能上萬。
緩存的功能完全可以由上層業(yè)務完成。
單機支持的隊列數(shù)

Kafka單機超過64個隊列/分區(qū),Load會發(fā)生明顯的飆高現(xiàn)象,隊列越多,load越高,發(fā)送消息響應時間變長
RocketMQ單機支持最高5萬個隊列,Load不會發(fā)生明顯變化
隊列多有什么好處?

單機可以創(chuàng)建更多Topic,因為每個Topic都是由一批隊列組成
Consumer的集群規(guī)模和隊列數(shù)成正比,隊列越多,Consumer集群可以越大
消息投遞實時性

Kafka使用短輪詢方式,實時性取決于輪詢間隔時間
RocketMQ使用長輪詢,同Push方式實時性一致,消息的投遞延時通常在幾個毫秒。
消費失敗重試

Kafka消費失敗不支持重試
RocketMQ消費失敗支持定時重試,每次重試間隔時間順延
總結(jié):例如充值類應用,當前時刻調(diào)用運營商網(wǎng)關,充值失敗,可能是對方壓力過多,稍后在調(diào)用就會成功,如支付寶到銀行扣款也是類似需求。

這里的重試需要可靠的重試,即失敗重試的消息不因為Consumer宕機導致丟失。
嚴格的消息順序

Kafka支持消息順序,但是一臺Broker宕機后,就會產(chǎn)生消息亂序
RocketMQ支持嚴格的消息順序,在順序消息場景下,一臺Broker宕機后,發(fā)送消息會失敗,但是不會亂序
Mysql Binlog分發(fā)需要嚴格的消息順序
定時消息

Kafka不支持定時消息
RocketMQ支持兩類定時消息
開源版本RocketMQ僅支持定時Level
阿里云ONS支持定時Level,以及指定的毫秒級別的延時時間
分布式事務消息

Kafka不支持分布式事務消息
阿里云ONS支持分布式定時消息,未來開源版本的RocketMQ也有計劃支持分布式事務消息
消息查詢

Kafka不支持消息查詢
RocketMQ支持根據(jù)Message Id查詢消息,也支持根據(jù)消息內(nèi)容查詢消息(發(fā)送消息時指定一個Message Key,任意字符串,例如指定為訂單Id)
總結(jié):消息查詢對于定位消息丟失問題非常有幫助,例如某個訂單處理失敗,是消息沒收到還是收到處理出錯了。
消息回溯

Kafka理論上可以按照Offset來回溯消息
RocketMQ支持按照時間來回溯消息,精度毫秒,例如從一天之前的某時某分某秒開始重新消費消息
總結(jié):典型業(yè)務場景如consumer做訂單分析,但是由于程序邏輯或者依賴的系統(tǒng)發(fā)生故障等原因,導致今天消費的消息全部無效,需要重新從昨天零點開始消費,那么以時間為起點的消息重放功能對于業(yè)務非常有幫助。
消費并行度

Kafka的消費并行度依賴Topic配置的分區(qū)數(shù),如分區(qū)數(shù)為10,那么最多10臺機器來并行消費(每臺機器只能開啟一個線程),或者一臺機器消費(10個線程并行消費)。即消費并行度和分區(qū)數(shù)一致。

RocketMQ消費并行度分兩種情況

順序消費方式并行度同Kafka完全一致
亂序方式并行度取決于Consumer的線程數(shù),如Topic配置10個隊列,10臺機器消費,每臺機器100個線程,那么并行度為1000。
消息軌跡

Kafka不支持消息軌跡
阿里云ONS支持消息軌跡
開發(fā)語言友好性

Kafka采用Scala編寫
RocketMQ采用Java語言編寫
Broker端消息過濾

Kafka不支持Broker端的消息過濾
RocketMQ支持兩種Broker端消息過濾方式
根據(jù)Message Tag來過濾,相當于子topic概念
向服務器上傳一段Java代碼,可以對消息做任意形式的過濾,甚至可以做Message Body的過濾拆分。
消息堆積能力

理論上Kafka要比RocketMQ的堆積能力更強,不過RocketMQ單機也可以支持億級的消息堆積能力,我們認為這個堆積能力已經(jīng)完全可以滿足業(yè)務需求。

開源社區(qū)活躍度

Kafka社區(qū)更新較慢
RocketMQ的github社區(qū)有250個 個人、公司用戶登記了聯(lián)系方式,QQ群超過1000人。
商業(yè)支持

Kafka原開發(fā)團隊成立新公司,目前暫沒有相關產(chǎn)品看到
RocketMQ在阿里云上已經(jīng)開放公測近半年,目前以云服務形式免費供大家商用,并向用戶承諾99.99%的可靠性,同時徹底解決了用戶自己搭建MQ產(chǎn)品的運維復雜性問題

成熟度

Kafka在日志領域比較成熟
RocketMQ在阿里集團內(nèi)部有大量的應用在使用,每天都產(chǎn)生海量的消息,并且順利支持了多次天貓雙十一海量消息考驗,是數(shù)據(jù)削峰填谷的利器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容