MQ 主流的MQ的對比與業(yè)務(wù)選型

1 簡介

消息隊列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合、異步消息隙弛、流量削鋒等問題全闷。它可以實現(xiàn)高性能总珠、高可用局服、可伸縮和最終一致性架構(gòu)淫奔,是大型分布式系統(tǒng)不可缺少的中間件唆迁。

消息隊列在電商系統(tǒng)唐责、消息通訊鼠哥、日志收集等應(yīng)用中扮演著關(guān)鍵作用看政,以阿里為例帽衙,其研發(fā)的消息隊列(RocketMQ)在歷次天貓 “雙十一” 活動中支撐了萬億級的數(shù)據(jù)洪峰厉萝,為大規(guī)模交易提供了有力保障榨崩。

作為提升應(yīng)用性能的重要手段母蛛,分布式消息隊列技術(shù)在互聯(lián)網(wǎng)領(lǐng)域得到了越來越廣泛的關(guān)注 彩郊。在之前的博文中秫逝,我們介紹了四種常用的消息中間件:ActiveMQ违帆、RabbitMQ金蜀、RocketMQ 及 Kafka的基礎(chǔ)使用以及配置渊抄,本文將主要介紹這4中消息中間件的對比以及業(yè)務(wù)選型护桦。

2 對比

特性 ActiveMQ RabbitMQ RocketMQ Kafka
客戶端支持語言 JAVA、C抱慌、C++抑进、Python寺渗、PHP信殊、Pert涡拘、net等 官方支持Erlang鳄乏、Java/Ruby等,社區(qū)產(chǎn)出多種語言API朽缴,幾乎支持所有常用語言 JAVA密强、C++(不成熟) 官方支持JAVA,開源社區(qū)有多語言版本或渤,如PHP,Python,GO,C/C++,Ruby成畦,NodeJS等編程語言
單機吞吐量 萬級循帐,吞吐量RocketMQ和Kafka要低了一個數(shù)量級 萬級拄养,吞吐量比RocketMQ和Kafka要低了一個數(shù)量級 10萬級瘪匿,RocketMQ也是可以支撐高吞吐的一種MQ 10萬級別寻馏,這是kafka最大的優(yōu)點,就是吞吐量高顽染。 一般配合大數(shù)據(jù)類的系統(tǒng)來進行實時數(shù)據(jù)計算粉寞、日志采集等場景
topic數(shù)量對吞吐量的影響 topic可以達到幾百唧垦,幾千個的級別业崖,吞吐量會有較小幅度的下降 這是RocketMQ的一大優(yōu)勢双炕,在同等機器下摇锋,可以支撐大量的topic topic從幾十個到幾百個的時候站超,吞吐量會大幅度下降 所以在同等機器下融求,kafka盡量保證topic數(shù)量不要過多算撮。如果要支撐大規(guī)模topic陷舅,需要增加更多的機器資源
時效性 ms級 微秒級莱睁,這是rabbitmq的一大特點仰剿,延遲是最低的 ms級 延遲在ms級以內(nèi)
可用性 高酥馍,基于主從架構(gòu)實現(xiàn)高可用性 高旨袒,基于主從架構(gòu)實現(xiàn)高可用性 非常高砚尽,分布式架構(gòu) 非常高辉词,kafka是分布式的必孤,一個數(shù)據(jù)多個副本,少數(shù)機器宕機,不會丟失數(shù)據(jù)敷搪,不會導(dǎo)致不可用
消息可靠性 有較低的概率丟失數(shù)據(jù) 經(jīng)過參數(shù)優(yōu)化配置兴想,可以做到0丟失 經(jīng)過參數(shù)優(yōu)化配置,消息可以做到0丟失
持久化 內(nèi)存赡勘、文件嫂便、數(shù)據(jù)庫 內(nèi)存、文件闸与,支持數(shù)據(jù)堆積毙替,但數(shù)據(jù)堆積會影響生產(chǎn)速率 磁盤文件 磁盤文件,只要磁盤容量足夠厂画,可以做到無限消息堆積
功能支持 MQ領(lǐng)域的功能極其完備 基于erlang開發(fā)瞭稼,所以并發(fā)能力很強妖枚,性能極其好续誉,延時很低 MQ功能較為完善,還是分布式的,擴展性好 功能較為簡單,主要支持簡單的MQ功能,在大數(shù)據(jù)領(lǐng)域的實時計算以及日志采集被大規(guī)模使用屑埋,是事實上的標準

3 優(yōu)缺點

3.1 ActiveMQ

ActiveMQ是由Apache出品徊哑,ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實現(xiàn)。它非郴杳快速,支持多種語言的客戶端和協(xié)議,而且可以非常容易的嵌入到企業(yè)的應(yīng)用環(huán)境中储藐,并有許多高級功能肺缕。

3.1.1 優(yōu)點

  • 跨平臺(JAVA編寫與平臺無關(guān)有秕硝,ActiveMQ幾乎可以運行在任何的JVM上)

  • 在阿里大規(guī)模應(yīng)用過,有阿里品牌保障 日處理消息上百億之多,可以做到大規(guī)模吞吐,性能也非常好毡鉴,分布式擴展也很方便

  • 可以支撐大規(guī)模的topic數(shù)量撑螺,支持復(fù)雜MQ業(yè)務(wù)場景

  • Java源碼可閱讀以及定制MQ

  • 可以用JDBC:可以將數(shù)據(jù)持久化到數(shù)據(jù)庫。雖然使用JDBC會降低ActiveMQ的性能游沿,但是數(shù)據(jù)庫一直都是開發(fā)人員最熟悉的存儲介質(zhì)。將消息存到數(shù)據(jù)庫歇拆,看得見摸得著替蛉。而且公司有專門的DBA去對數(shù)據(jù)庫進行調(diào)優(yōu)典唇,主從分離

  • 支持JMS :支持JMS的統(tǒng)一接口

  • 支持自動重連;

  • 有安全機制:支持基于shiro,jaas等多種安全配置機制,可以對Queue/Topic進行認證和授權(quán)勺阐。

  • 監(jiān)控完善:擁有完善的監(jiān)控,包括Web Console帮辟,JMX,Shell命令行默刚,Jolokia的REST API店展;

  • 界面友善:提供的Web Console可以滿足大部分情況轩端,還有很多第三方的組件可以使用,如hawtio根灯;

3.1.2 缺點

  • 社區(qū)活躍度不及RabbitMQ高

  • 可能會出現(xiàn)消息丟失

  • 目前重心放到activemq6.0產(chǎn)品-apollo径缅,對5.x的維護較少

  • 不適合用于上千個隊列的應(yīng)用場景

3.2 RabbitMQ

RabbitMQ是一套開源(MPL)的消息隊列服務(wù)軟件,是由 LShift 提供的一個 Advanced Message Queuing Protocol (AMQP) 的開源實現(xiàn)烙肺,由以高性能纳猪、健壯以及可伸縮性出名的 Erlang 寫成

3.2.1 優(yōu)點

  • erlang語言開發(fā),性能極其好桃笙,延時很低

  • 吞吐量到萬級兆旬,MQ功能比較完備

  • 健壯、穩(wěn)定怎栽、易用丽猬、跨平臺、支持多種語言熏瞄、文檔齊全

  • 有消息確認機制和持久化機制脚祟,可靠性高

  • 高度可定制的路由

  • 管理界面較豐富,在互聯(lián)網(wǎng)公司也有較大規(guī)模的應(yīng)用

  • 社區(qū)活躍度高强饮,幾乎每個月都發(fā)布幾個版本

3.2.2 缺點

  • 實現(xiàn)了代理架構(gòu)由桌,意味著消息在發(fā)送到客戶端之前可以在中央節(jié)點上排隊。此特性使得RabbitMQ易于使用和部署邮丰,但是使得其運行速度較慢行您,因為中央節(jié)點增加了延遲,消息封裝后也比較大剪廉。

  • erlang語言開發(fā)娃循,很難看懂源碼,無法進行源碼級別的研究和定制斗蒋,不利于二次維護和開發(fā)

  • rabbitmq集群動態(tài)擴展比較麻煩

  • 需要學(xué)習比較復(fù)雜的接口和協(xié)議捌斧,學(xué)習和維護成本較高

3.3 RocketMQ

RocketMQ出自 阿里公司的開源產(chǎn)品笛质,用 Java 語言實現(xiàn),在設(shè)計時參考了 Kafka捞蚂,并做出了自己的一些改進妇押,消息可靠性上比 Kafka 更好。RocketMQ在阿里集團被廣泛應(yīng)用在訂單姓迅,交易敲霍,充值,流計算丁存,消息推送色冀,日志流式處理,binglog分發(fā)等場景柱嫌。

3.3.1 優(yōu)點

  • 單機支持 1 萬以上持久化隊列

  • RocketMQ 的所有消息都是持久化的锋恬,先寫入系統(tǒng) PAGECACHE,然后刷盤编丘,可以保證內(nèi)存與磁盤都有一份數(shù)據(jù)与学,訪問時,直接從內(nèi)存讀取

  • 模型簡單嘉抓,接口易用(JMS 的接口很多場合并不太實用)

  • 性能非常好索守,可以大量堆積消息在broker中

  • 支持多種消費,包括集群消費抑片、廣播消費等

  • 各個環(huán)節(jié)分布式擴展設(shè)計卵佛,主從HA

  • 開發(fā)度較活躍,版本更新很快

3.3.2 缺點

  • 支持的客戶端語言不多敞斋,目前是java及c++截汪,其中c++不成熟

  • RocketMQ社區(qū)關(guān)注度及成熟度也不及前兩者

  • 沒有web管理界面,提供了一個CLI(命令行界面)管理工具帶來查詢植捎、管理和診斷各種問題

  • 沒有在 mq 核心中去實現(xiàn)JMS等接口

3.4 Kafka

Apache Kafka是一個分布式消息發(fā)布訂閱系統(tǒng)衙解。它最初由LinkedIn公司基于獨特的設(shè)計實現(xiàn)為一個分布式的提交日志系統(tǒng)( a distributed commit log),焰枢,之后成為Apache項目的一部分蚓峦。Kafka系統(tǒng)快速、可擴展并且可持久化济锄。它的分區(qū)特性暑椰,可復(fù)制和可容錯都是其不錯的特性。

3.4.1 優(yōu)點

  • 客戶端語言豐富荐绝,支持java一汽、.net、php很泊、ruby角虫、python沾谓、go等多種語言委造;

  • 性能卓越戳鹅,單機寫入TPS約在百萬條/秒,消息大小10個字節(jié)昏兆;

  • 提供完全分布式架構(gòu), 并有replica機制, 擁有較高的可用性和可靠性, 理論上支持消息無限堆積枫虏;

  • 支持批量操作;

  • 消費者采用Pull方式獲取消息, 消息有序, 通過控制能夠保證所有消息被消費且僅被消費一次;

  • 有優(yōu)秀的第三方Kafka Web管理界面Kafka-Manager爬虱;

  • 在日志領(lǐng)域比較成熟隶债,被多家公司和多個開源項目使用;

3.4.2 缺點

  • Kafka單機超過64個隊列/分區(qū)跑筝,Load會發(fā)生明顯的飆高現(xiàn)象死讹,隊列越多,load越高曲梗,發(fā)送消息響應(yīng)時間變長

  • 使用短輪詢方式赞警,實時性取決于輪詢間隔時間;

  • 消費失敗不支持重試虏两;

  • 支持消息順序愧旦,但是一臺代理宕機后,就會產(chǎn)生消息亂序定罢;

  • 社區(qū)更新較慢笤虫;

4 業(yè)務(wù)選型

  1. 一般的業(yè)務(wù)系統(tǒng)要引入MQ,最早大家都用ActiveMQ祖凫,但是現(xiàn)在確實大家用的不多了琼蚯,沒經(jīng)過大規(guī)模吞吐量場景的驗證,社區(qū)也不是很活躍

  2. 如果是中小型公司惠况,基礎(chǔ)架構(gòu)研發(fā)能力較弱凌停,采用RabbitMQ是不錯的選擇,雖然erlang語言阻止了大量的java工程師去深入研究和掌控他售滤,但是社區(qū)十分活躍

  3. 如果系統(tǒng)有較大吞吐量需求罚拟,同時可能會有大量的topic,基礎(chǔ)架構(gòu)研發(fā)實力較強的大公司完箩,完全可以采用RocketMQ赐俗,即使社區(qū)不再更新,也可以自己去維護

  4. 如果是大數(shù)據(jù)領(lǐng)域的實時計算弊知、日志采集等場景阻逮,用Kafka是業(yè)內(nèi)標準的,絕對沒問題秩彤,社區(qū)活躍度很高叔扼,絕對不會黃事哭,何況幾乎是全世界這個領(lǐng)域的事實性規(guī)范

5 相關(guān)信息

  • 博文不易,辛苦各位猿友點個關(guān)注和贊瓜富,感謝
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳍咱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子与柑,更是在濱河造成了極大的恐慌谤辜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件价捧,死亡現(xiàn)場離奇詭異丑念,居然都是意外死亡,警方通過查閱死者的電腦和手機结蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門脯倚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嵌屎,你說我怎么就攤上這事推正。” “怎么了编整?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵舔稀,是天一觀的道長。 經(jīng)常有香客問我掌测,道長内贮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任汞斧,我火速辦了婚禮夜郁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粘勒。我一直安慰自己竞端,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布庙睡。 她就那樣靜靜地躺著事富,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乘陪。 梳的紋絲不亂的頭發(fā)上统台,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音啡邑,去河邊找鬼贱勃。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贵扰。 我是一名探鬼主播仇穗,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戚绕!你這毒婦竟也來了纹坐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤列肢,失蹤者是張志新(化名)和其女友劉穎恰画,沒想到半個月后宾茂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓷马,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年跨晴,在試婚紗的時候發(fā)現(xiàn)自己被綠了欧聘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡端盆,死狀恐怖怀骤,靈堂內(nèi)的尸體忽然破棺而出茸习,到底是詐尸還是另有隱情感挥,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布圣蝎,位于F島的核電站焚鹊,受9級特大地震影響痕届,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜末患,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一研叫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧璧针,春花似錦嚷炉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隧膏,卻和暖如春哗讥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背私植。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工忌栅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓索绪,卻偏偏與公主長得像湖员,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瑞驱,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 目前主流的MQ產(chǎn)品 1.ZeroMQ 號稱最快的消息隊列系統(tǒng)唤反,尤其針對大吞吐量的需求場景凳寺。 擴展性好,開發(fā)比較靈活...
    Java阿七閱讀 357評論 0 2
  • MQ的應(yīng)用場景 異步處理:當注冊成功后彤侍,進行短信和郵箱通知肠缨。可以并行執(zhí)行郵件發(fā)送和端性發(fā)送業(yè)務(wù)盏阶。 應(yīng)用解耦:下單后...
    叫我胖虎大人閱讀 530評論 1 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月晒奕,有人笑有人哭,有人歡樂有人憂愁名斟,有人驚喜有人失落脑慧,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53
  • 信任包括信任自己和信任他人 很多時候,很多事情砰盐,失敗闷袒、遺憾、錯過岩梳,源于不自信囊骤,不信任他人 覺得自己做不成,別人做不...
    吳氵晃閱讀 6,190評論 4 8
  • 怎么對待生活,它也會怎么對你 人都是哭著來到這個美麗的人間池摧。每個人從來到塵寰到升入天堂焦除,整個生命的歷程都是一本書,...
    靜靜在等你閱讀 4,976評論 1 6