摘要:?Activemq構(gòu)建高并發(fā)、高可用的大規(guī)模消息系統(tǒng) 在網(wǎng)上看了很多關(guān)于Activemq的帖子八回,但是大部分的內(nèi)容都只能算是對activemq官網(wǎng)內(nèi)容的翻譯酷愧。很少有相關(guān)的案例分析,本文將分享"如何用Activemq構(gòu)建超大(10萬筆消息/秒以上)規(guī)模消息系統(tǒng)" 在實(shí)時消息系統(tǒng)中缠诅,MQ消息中間件廣泛應(yīng)用于各類消息系統(tǒng)中伟墙,在異步消息處理架構(gòu)中,MQ幾乎是必備的中間件滴铅。
Activemq構(gòu)建高并發(fā)戳葵、高可用的大規(guī)模消息系統(tǒng)
在網(wǎng)上看了很多關(guān)于Activemq的帖子,但是大部分的內(nèi)容都只能算是對activemq官網(wǎng)內(nèi)容的翻譯汉匙。很少有相關(guān)的案例分析拱烁,本文將分享"如何用Activemq構(gòu)建超大(10萬筆消息/秒以上)規(guī)模消息系統(tǒng)"
在實(shí)時消息系統(tǒng)中生蚁,MQ消息中間件廣泛應(yīng)用于各類消息系統(tǒng)中,在異步消息處理架構(gòu)中,MQ幾乎是必備的中間件乖篷。 同時辖所,MQ的處理性能也將直接影響整個系統(tǒng)的性能。如果MQ出現(xiàn)故障志衣,那么整個系統(tǒng)將癱瘓,其后果將是災(zāi)難性的猛们。 所以在一般情況下MQ會中HA念脯,或是failover,但是如果要求消息處理能力在10萬/秒以上時弯淘,簡單的HA或failover將不能滿足要求绿店。
?一、Activemq broker部署方式
1) 單MQ broker 時
整個系統(tǒng)中只有一個Activemq Broker庐橙,在生產(chǎn)系統(tǒng)中幾乎不使用假勿。因為單個MQ存在單點(diǎn)故障。
2) Master - slave 模式
采用Master-slave模式态鳖,同時在鏈接串中增加failover功能转培, 能夠?qū)崿F(xiàn)HA, 避免單點(diǎn)故障。但是浆竭,Master-slave方式一般需要"共享文件系統(tǒng)"堡距,同時必須保證出現(xiàn)問題時,文件鎖能正常切換兆蕉。另外羽戒,slave處于stand by狀態(tài),不對外提供服務(wù)虎韵。 在Master高負(fù)荷的情況下易稠,Slave不能提供能幫助。如果Master在高負(fù)荷情況下掛掉包蓝,那么Slave在同樣的情況下也可能掛掉驶社,只是時間問題。( Replicate Leveldb 方案也存在上述問題)测萎。 另外亡电,activemq 還有network模式,但此模式的應(yīng)用場景不是很明確硅瞧。
? ? 二份乒、多個Activemq broker 同時工作
通過上面的分析, 簡單的采用Activemq官網(wǎng)上提供的方案基本上不能滿足生產(chǎn)系統(tǒng)的性能和高可用要求。因此或辖,必須對上述方案進(jìn)行改進(jìn)瘾英,實(shí)現(xiàn) “高性能”,“高可用”颂暇,“可擴(kuò)展”的MQ集群方案缺谴。
同時部署多個Activemq broker實(shí)例, 多個Activemq broker實(shí)例同時工作。單個broker實(shí)例耳鸯,生產(chǎn)和消費(fèi)消息的速度在1萬條/秒湿蛔,部署N個Broker, 整個消息通道就能拓寬N倍; 多個(4個以上)broker 實(shí)例同時工作县爬,其中1到2個mq實(shí)例出現(xiàn)問題時阳啥,消息可經(jīng)過其他broker處理,整個系統(tǒng)依然可以健康工作捌省,從而實(shí)現(xiàn)高可用苫纤。
a碉钠、消息發(fā)送方的應(yīng)用程序的采用輪循方式給多個broker發(fā)送消息
b纲缓、消息消費(fèi)方的應(yīng)用程序針對每個broker啟用對應(yīng)的consumer來消費(fèi)消息。
按照這樣的部署方案喊废,兩個或兩個以上MQ可以同時工作祝高,可以解決MQ單點(diǎn)問題。MQ做為消息的傳輸管道污筷, 增加MQ數(shù)量就可以拓寬管道的寬度工闺,提高消息傳輸性能。
我們將“多個同時工作的broker"成為 broker組瓣蛀,如果 broker組內(nèi)的broker數(shù)量太多的話陆蟆,那么再開發(fā)或部署時,broker內(nèi)的隊列配置將會是一件非常繁瑣的事惋增。因此叠殷,我們將broker內(nèi)的隊列queue進(jìn)行分組,具有相同前綴名的隊列為一組诈皿,前綴名相同的隊列中的消息的業(yè)務(wù)邏輯是相同的林束。通過隊列前綴名將消息組件與業(yè)務(wù)關(guān)聯(lián)上。 根據(jù)業(yè)務(wù)不同稽亏,配置不同的sender ?和 listener 時壶冒,只要配置不同的隊列前綴名。從而簡化配置與使用截歉,同時也可以防止消息發(fā)錯隊列的錯誤胖腾。
如上圖,有 ChargeQueue 和 QueryQueue連個隊列組,對應(yīng)不同的業(yè)務(wù)功能胸嘁。
在消息消費(fèi)的應(yīng)用程序中瓶摆,針對ChargeQueue 和 QueryQueue 配置Consumer Listener Container, 同時可以正對不同的隊列配置不同數(shù)量的消費(fèi)則數(shù)目性宏。
單個ActiveMQ的接收和消費(fèi)消息的速度在1萬筆/秒(持久化 一般為1-2萬群井, 非持久化 2 萬以上),在生產(chǎn)環(huán)境中部署10個Activemq就能達(dá)到10萬筆/秒以上的性能毫胜,部署越多的activemq broker 在MQ上latency也就越低书斜,系統(tǒng)吞吐量也就越高。
三酵使、Activemq 性能優(yōu)化荐吉。
1、 producer消息發(fā)送端口渔,需要采用 AsyncSend模式样屠, 在 activemq 的連接串中增加jsm.useAsyncSend, 例如 tcp://127.0.0.1:61616?jms.useAsyncSend=true
2、consumer消息消費(fèi)端缺脉,如果有多個不同的應(yīng)用程序去消費(fèi)同一個隊列中的消息痪欲,那么 activemq的 prefetchSize應(yīng)該設(shè)置為1。
以上兩個參數(shù)對性能的影響非常大攻礼。