該如何選擇消息隊(duì)列键科?

在高并發(fā)業(yè)務(wù)場(chǎng)景下,消息隊(duì)列在流量削峰漩怎、解耦上有不可替代的作用勋颖。當(dāng)前使用較多的消息隊(duì)列有 RabbitMQ、RocketMQ勋锤、ActiveMQ饭玲、Kafka、ZeroMQ叁执、Pulsar 等茄厘。

消息隊(duì)列這么多,到底該選擇哪款消息隊(duì)列呢谈宛?

選擇消息隊(duì)列的基本標(biāo)準(zhǔn)

雖然這些消息隊(duì)列在功能和特性方面各有優(yōu)劣次哈,但我們?cè)谶x擇的時(shí)候要有一個(gè)基本標(biāo)準(zhǔn)。

首先吆录,必須是開(kāi)源的產(chǎn)品窑滞。開(kāi)源意味著,如果有一天你使用的消息隊(duì)列遇到了一個(gè)影響你系統(tǒng)業(yè)務(wù)的 Bug,至少還有機(jī)會(huì)通過(guò)修改源代碼來(lái)迅速修復(fù)或規(guī)避這個(gè) Bug哀卫,解決你的系統(tǒng)的問(wèn)題巨坊,而不是等待開(kāi)發(fā)者發(fā)布的下一個(gè)版本來(lái)解決。

其次聊训,這個(gè)產(chǎn)品必須是近年來(lái)比較流行并且有一定社區(qū)活躍度的產(chǎn)品抱究。流行的好處是恢氯,只要使用場(chǎng)景不太冷門带斑,遇到 Bug 的概率會(huì)非常低,因?yàn)榇蟛糠钟龅降?Bug勋拟,其他人早就遇到并且修復(fù)了勋磕。在使用過(guò)程中遇到的一些問(wèn)題,也比較容易在網(wǎng)上搜索到類似的問(wèn)題敢靡,然后很快的找到解決方案挂滓。還有一個(gè)優(yōu)勢(shì)就是,流行的產(chǎn)品與周邊生態(tài)系統(tǒng)會(huì)有一個(gè)比較好的集成和兼容啸胧。

最后赶站,作為一款及格的消息隊(duì)列,必須具備的幾個(gè)特性包括:

  • 消息的可靠傳遞:確保不丟消息纺念;
  • Cluster:支持集群贝椿,確保不會(huì)因?yàn)槟硞€(gè)節(jié)點(diǎn)宕機(jī)導(dǎo)致服務(wù)不可用,當(dāng)然也不能丟消息陷谱;
  • 性能:具備足夠好的性能烙博,能滿足絕大多數(shù)場(chǎng)景的性能要求。

接下來(lái)看一下有哪些符合上面這些條件烟逊,可供選擇的開(kāi)源消息隊(duì)列渣窜。

RabbitMQ

RabbitMQ

首先,我們來(lái)看下消息隊(duì)列 RabbitMQ宪躯。RabbitMQ 于 2007 年發(fā)布乔宿,是使用 Erlang 編程語(yǔ)言編寫的,最早是為電信行業(yè)系統(tǒng)之間的可靠通信設(shè)計(jì)的访雪,也是少數(shù)幾個(gè)支持 AMQP 協(xié)議的消息隊(duì)列之一详瑞。

RabbitMQ:輕量級(jí)、迅捷冬阳,它的宣傳口號(hào)蛤虐,也很明確地表明了 RabbitMQ 的特點(diǎn):Messaging that just works,開(kāi)箱即用的消息隊(duì)列肝陪。也就是說(shuō)驳庭,RabbitMQ 是一個(gè)相當(dāng)輕量級(jí)的消息隊(duì)列,非常容易部署和使用。

RabbitMQ 一個(gè)比較有特色的功能是支持非常靈活的路由配置饲常,和其他消息隊(duì)列不同的是蹲堂,它在生產(chǎn)者(Producer)和隊(duì)列(Queue)之間增加了一個(gè) Exchange 模塊,可以理解為交換機(jī)贝淤。

Exchange 模塊的作用和交換機(jī)非常相似柒竞,根據(jù)配置的路由規(guī)則將生產(chǎn)者發(fā)出的消息分發(fā)到不同的隊(duì)列中。路由的規(guī)則也非常靈活播聪,甚至可以自己來(lái)實(shí)現(xiàn)路由規(guī)則朽基。如果正好需要這個(gè)功能,RabbitMQ 是個(gè)不錯(cuò)的選擇离陶。

RabbitMQ 的客戶端支持的編程語(yǔ)言大概是所有消息隊(duì)列中最多的稼虎。

接下來(lái)說(shuō)下 RabbitMQ 的幾個(gè)問(wèn)題:

  1. RabbitMQ 對(duì)消息堆積的支持并不好,當(dāng)大量消息積壓的時(shí)候招刨,會(huì)導(dǎo)致 RabbitMQ 的性能急劇下降霎俩。
  2. RabbitMQ 的性能是這幾個(gè)消息隊(duì)列中最差的,大概每秒鐘可以處理幾萬(wàn)到十幾萬(wàn)條消息沉眶。如果應(yīng)用對(duì)消息隊(duì)列的性能要求非常高打却,那不要選擇 RabbitMQ。
  3. RabbitMQ 使用的編程語(yǔ)言 Erlang谎倔,擴(kuò)展和二次開(kāi)發(fā)成本高柳击。

RocketMQ

RocketMQ

RocketMQ 是阿里巴巴在 2012 年開(kāi)源的消息隊(duì)列產(chǎn)品,用 Java 語(yǔ)言實(shí)現(xiàn)传藏,在設(shè)計(jì)時(shí)參考了 Kafka腻暮,并做出了自己的一些改進(jìn),后來(lái)捐贈(zèng)給 Apache 軟件基金會(huì)毯侦,2017 正式畢業(yè)哭靖,成為 Apache 的頂級(jí)項(xiàng)目。RocketMQ 在阿里內(nèi)部被廣泛應(yīng)用在訂單侈离,交易试幽,充值,流計(jì)算卦碾,消息推送铺坞,日志流式處理,Binglog 分發(fā)等場(chǎng)景洲胖。經(jīng)歷過(guò)多次雙十一考驗(yàn)济榨,它的性能、穩(wěn)定性和可靠性都是值得信賴的绿映。

RocketMQ 有著不錯(cuò)的性能擒滑,穩(wěn)定性和可靠性腐晾,具備一個(gè)現(xiàn)代的消息隊(duì)列應(yīng)該有的幾乎全部功能和特性,并且它還在持續(xù)的成長(zhǎng)中丐一。

RocketMQ 有非吃逄牵活躍的中文社區(qū),大多數(shù)問(wèn)題可以找到中文的答案库车。RocketMQ 使用 Java 語(yǔ)言開(kāi)發(fā)巨柒,源代碼相對(duì)比較容易讀懂,容易對(duì) RocketMQ 進(jìn)行擴(kuò)展或者二次開(kāi)發(fā)柠衍。

RocketMQ 對(duì)在線業(yè)務(wù)的響應(yīng)時(shí)延做了很多的優(yōu)化洋满,大多數(shù)情況下可以做到毫秒級(jí)的響應(yīng),如果你的應(yīng)用場(chǎng)景很在意響應(yīng)時(shí)延拧略,那應(yīng)該選擇使用 RocketMQ芦岂。

RocketMQ 的性能比 RabbitMQ 要高一個(gè)數(shù)量級(jí)瘪弓,每秒鐘大概能處理幾十萬(wàn)條消息垫蛆。

RocketMQ 的劣勢(shì)是與周邊生態(tài)系統(tǒng)的集成和兼容程度不夠。

Kafka

Kafka

Apache Kafka 是一個(gè)分布式消息發(fā)布訂閱系統(tǒng)腺怯。它最初由 LinkedIn 公司基于獨(dú)特的設(shè)計(jì)實(shí)現(xiàn)為一個(gè)分布式的日志提交系統(tǒng)袱饭,之后成為 Apache 項(xiàng)目的一部分。

在早期的版本中呛占,為了獲得極致的性能虑乖,在設(shè)計(jì)方面做了很多的犧牲,比如不保證消息的可靠性晾虑,可能會(huì)丟失消息疹味,也不支持集群,功能上也比較簡(jiǎn)陋帜篇,這些犧牲對(duì)于處理海量日志這個(gè)特定的場(chǎng)景都是可以接受的糙捺。

但是,隨后幾年 Kafka 逐步補(bǔ)齊了這些短板笙隙,當(dāng)下的 Kafka 已經(jīng)發(fā)展為一個(gè)非常成熟的消息隊(duì)列產(chǎn)品洪灯,無(wú)論在數(shù)據(jù)可靠性、穩(wěn)定性和功能特性等方面都可以滿足絕大多數(shù)場(chǎng)景的需求竟痰。

Kafka 與周邊生態(tài)系統(tǒng)的兼容性是最好的沒(méi)有之一签钩,尤其在大數(shù)據(jù)和流計(jì)算領(lǐng)域,幾乎所有的相關(guān)開(kāi)源軟件系統(tǒng)都會(huì)優(yōu)先支持 Kafka坏快。

Kafka 性能高效铅檩、可擴(kuò)展良好并且可持久化。它的分區(qū)特性莽鸿,可復(fù)制和可容錯(cuò)都是不錯(cuò)的特性昧旨。

Kafka 使用 Scala 和 Java 語(yǔ)言開(kāi)發(fā),設(shè)計(jì)上大量使用了批量和異步的思想,使得 Kafka 能做到超高的性能臼予。Kafka 的性能鸣戴,尤其是異步收發(fā)的性能,是三者中最好的粘拾,但與 RocketMQ 并沒(méi)有量級(jí)上的差異窄锅,大約每秒鐘可以處理幾十萬(wàn)條消息。

在有足夠的客戶端并發(fā)進(jìn)行異步批量發(fā)送缰雇,并且開(kāi)啟壓縮的情況下入偷,Kafka 的極限處理能力可以超過(guò)每秒 2000 萬(wàn)條消息。

但是 Kafka 異步批量的設(shè)計(jì)帶來(lái)的問(wèn)題是械哟,它的同步收發(fā)消息的響應(yīng)時(shí)延比較高疏之,因?yàn)楫?dāng)客戶端發(fā)送一條消息的時(shí)候,Kafka 并不會(huì)立即發(fā)送出去暇咆,而是要等一會(huì)兒攢一批再發(fā)送锋爪,在它的 Broker 中,很多地方都會(huì)使用這種先攢一波再一起處理的設(shè)計(jì)爸业。當(dāng)你的業(yè)務(wù)場(chǎng)景中其骄,每秒鐘消息數(shù)量沒(méi)有那么多的時(shí)候,Kafka 的時(shí)延反而會(huì)比較高扯旷。所以拯爽,Kafka 不太適合在線業(yè)務(wù)場(chǎng)景。

消息隊(duì)列對(duì)比

Kafka RocketMQ RabbitMQ
單機(jī)吞吐量 十萬(wàn)級(jí) 十萬(wàn)級(jí) 萬(wàn)級(jí)
開(kāi)發(fā)語(yǔ)言 Java & Scala Java Erlang
消息延遲 毫秒級(jí) 毫秒級(jí) 微秒級(jí)
消息丟失 參數(shù)優(yōu)化配置后可做到0丟失 參數(shù)優(yōu)化配置后可做到0丟失 有較低的概率丟失
消費(fèi)模式 Pull Pull+Push Pull+Push
topic數(shù)量對(duì)吞吐量的影響 topic達(dá)到幾十钧忽,幾百個(gè)時(shí)毯炮,吞吐量會(huì)大幅度下降 topic達(dá)到幾百,幾千個(gè)時(shí)耸黑,吞吐量會(huì)有較小幅度的下降 \
可用性 非常高(分布式) 非常高(主從) 高(主從)
總結(jié) 吞吐量高桃煎,微秒級(jí)延時(shí),分布式高可用崎坊,最好是支持較少topic數(shù)量备禀,會(huì)有消息重復(fù)現(xiàn)象 可支撐大規(guī)模topic數(shù)量,方便二次開(kāi)發(fā)和擴(kuò)展 不支持集群動(dòng)態(tài)擴(kuò)容奈揍,擴(kuò)展和二次開(kāi)發(fā)難

總結(jié)

本文分別介紹了 RabbitMQ曲尸,RocketMQ 和 Kafka 幾種常見(jiàn)的消息隊(duì)列,闡述了各種消息隊(duì)列的主要特點(diǎn)和優(yōu)劣勢(shì)男翰。

在了解了上面這些開(kāi)源消息隊(duì)列各自的特點(diǎn)和優(yōu)劣勢(shì)后另患,對(duì)于消息隊(duì)列及相關(guān)技術(shù)選型,相信你會(huì)有更深入的理解和認(rèn)識(shí)蛾绎。以下幾條選擇的建議可以參考:

  • 如果消息隊(duì)列不是將要構(gòu)建系統(tǒng)的重點(diǎn)昆箕,對(duì)消息隊(duì)列功能和性能沒(méi)有很高的要求鸦列,只需要一個(gè)快速上手易于維護(hù)的消息隊(duì)列,建議使用 RabbitMQ鹏倘。
  • 如果系統(tǒng)使用消息隊(duì)列主要場(chǎng)景是處理在線業(yè)務(wù)薯嗤,比如在交易系統(tǒng)中用消息隊(duì)列傳遞訂單,需要低延遲和高穩(wěn)定性纤泵,建議使用 RocketMQ骆姐。
  • 如果需要處理海量的消息,像收集日志捏题、監(jiān)控信息或是埋點(diǎn)這類數(shù)據(jù)玻褪,或是你的應(yīng)用場(chǎng)景大量使用了大數(shù)據(jù)、流計(jì)算相關(guān)的開(kāi)源產(chǎn)品公荧,那 Kafka 是最適合的消息隊(duì)列带射。

每一個(gè)消息隊(duì)列都有自己的優(yōu)劣勢(shì),需要根據(jù)現(xiàn)有系統(tǒng)的情況循狰,選擇最適合的消息隊(duì)列窟社,更多細(xì)節(jié)和原理性的東西,還需在實(shí)踐中見(jiàn)真知晤揣!

參考

http://1t.click/aA3A

歡迎關(guān)注我的公眾號(hào):武培軒桥爽,獲得獨(dú)家整理的學(xué)習(xí)資源和日常干貨推送。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昧识,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盗扒,更是在濱河造成了極大的恐慌跪楞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侣灶,死亡現(xiàn)場(chǎng)離奇詭異甸祭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)褥影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門池户,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凡怎,你說(shuō)我怎么就攤上這事校焦。” “怎么了统倒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵寨典,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我房匆,道長(zhǎng)耸成,這世上最難降的妖魔是什么报亩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮井氢,結(jié)果婚禮上弦追,老公的妹妹穿的比我還像新娘。我一直安慰自己花竞,他們只是感情好骗卜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著左胞,像睡著了一般寇仓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烤宙,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天遍烦,我揣著相機(jī)與錄音,去河邊找鬼躺枕。 笑死服猪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拐云。 我是一名探鬼主播罢猪,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叉瘩!你這毒婦竟也來(lái)了膳帕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤薇缅,失蹤者是張志新(化名)和其女友劉穎危彩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泳桦,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汤徽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灸撰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒府。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浮毯,靈堂內(nèi)的尸體忽然破棺而出完疫,到底是詐尸還是另有隱情,我是刑警寧澤亲轨,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布趋惨,位于F島的核電站,受9級(jí)特大地震影響惦蚊,放射性物質(zhì)發(fā)生泄漏器虾。R本人自食惡果不足惜讯嫂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兆沙。 院中可真熱鬧欧芽,春花似錦、人聲如沸葛圃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)库正。三九已至曲楚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褥符,已是汗流浹背龙誊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喷楣,地道東北人趟大。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铣焊,于是被迫代替她去往敵國(guó)和親逊朽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 前言 在分布式系統(tǒng)中,我們廣泛運(yùn)用消息中間件進(jìn)行系統(tǒng)間的數(shù)據(jù)交換,便于異步解耦≌篱唬現(xiàn)在開(kāi)源的消息中間件有很多,前段時(shí)...
    中v中閱讀 3,072評(píng)論 1 29
  • 前言 在分布式系統(tǒng)中,我們廣泛運(yùn)用消息中間件進(jìn)行系統(tǒng)間的數(shù)據(jù)交換,便于異步解耦“豪現(xiàn)在開(kāi)源的消息中間件有很多,前段時(shí)...
    zwb_jianshu閱讀 2,656評(píng)論 0 0
  • 一、消息隊(duì)列(MQ)概述 消息隊(duì)列(Message Queue)铁坎,是分布式系統(tǒng)中重要的組件蜂奸,其通用的使用場(chǎng)景可以簡(jiǎn)...
    喬治大叔閱讀 450評(píng)論 0 4
  • 其實(shí)我這種人在龐大的人類基數(shù)中應(yīng)該占有很大比重,就是那些間歇性躊躇滿志持續(xù)性混吃等死的人硬萍。這不是我說(shuō)的扩所,只是他們自...
    七夕青鳥(niǎo)閱讀 358評(píng)論 0 0
  • 許多時(shí)候?qū)懽髯嫫粒且欢ㄒ脽岽蜩F的助赞,原本昨天上午就應(yīng)該完成的文字,此時(shí)寫袁勺,早已不是當(dāng)時(shí)的心境了雹食。 周日下午,疲倦涌來(lái)...
    素素老師的語(yǔ)文閱讀 581評(píng)論 1 6