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ù)選型
一般的業(yè)務(wù)系統(tǒng)要引入MQ,最早大家都用ActiveMQ祖凫,但是現(xiàn)在確實大家用的不多了琼蚯,沒經(jīng)過大規(guī)模吞吐量場景的驗證,社區(qū)也不是很活躍
如果是中小型公司惠况,基礎(chǔ)架構(gòu)研發(fā)能力較弱凌停,采用RabbitMQ是不錯的選擇,雖然erlang語言阻止了大量的java工程師去深入研究和掌控他售滤,但是社區(qū)十分活躍
如果系統(tǒng)有較大吞吐量需求罚拟,同時可能會有大量的topic,基礎(chǔ)架構(gòu)研發(fā)實力較強的大公司完箩,完全可以采用RocketMQ赐俗,即使社區(qū)不再更新,也可以自己去維護
如果是大數(shù)據(jù)領(lǐng)域的實時計算弊知、日志采集等場景阻逮,用Kafka是業(yè)內(nèi)標準的,絕對沒問題秩彤,社區(qū)活躍度很高叔扼,絕對不會黃事哭,何況幾乎是全世界這個領(lǐng)域的事實性規(guī)范
5 相關(guān)信息
- 博文不易,辛苦各位猿友點個關(guān)注和贊瓜富,感謝