摘要:?Activemq構建高并發(fā)、高可用的大規(guī)模消息系統(tǒng) 在網(wǎng)上看了很多關于Activemq的帖子,但是大部分的內(nèi)容都只能算是對activemq官網(wǎng)內(nèi)容的翻譯。很少有相關的案例分析,本文將分享"如何用Activemq構建超大(10萬筆消息/秒以上)規(guī)模消息系統(tǒng)" 在實時消息系統(tǒng)中,MQ消息中間件廣泛應用于各類消息系統(tǒng)中,在異步消息處理架構中,MQ幾乎是必備的中間件。
Activemq構建高并發(fā)、高可用的大規(guī)模消息系統(tǒng)

在網(wǎng)上看了很多關于Activemq的帖子,但是大部分的內(nèi)容都只能算是對activemq官網(wǎng)內(nèi)容的翻譯。很少有相關的案例分析,本文將分享"如何用Activemq構建超大(10萬筆消息/秒以上)規(guī)模消息系統(tǒng)"
在實時消息系統(tǒng)中,MQ消息中間件廣泛應用于各類消息系統(tǒng)中,在異步消息處理架構中,MQ幾乎是必備的中間件。 同時,MQ的處理性能也將直接影響整個系統(tǒng)的性能。如果MQ出現(xiàn)故障,那么整個系統(tǒng)將癱瘓,其后果將是災難性的。 所以在一般情況下MQ會中HA,或是failover,但是如果要求消息處理能力在10萬/秒以上時,簡單的HA或failover將不能滿足要求。
?一、Activemq broker部署方式
1) 單MQ broker 時

整個系統(tǒng)中只有一個Activemq Broker,在生產(chǎn)系統(tǒng)中幾乎不使用。因為單個MQ存在單點故障。
2) Master - slave 模式

采用Master-slave模式,同時在鏈接串中增加failover功能, 能夠實現(xiàn)HA, 避免單點故障。但是,Master-slave方式一般需要"共享文件系統(tǒng)",同時必須保證出現(xiàn)問題時,文件鎖能正常切換。另外,slave處于stand by狀態(tài),不對外提供服務。 在Master高負荷的情況下,Slave不能提供能幫助。如果Master在高負荷情況下掛掉,那么Slave在同樣的情況下也可能掛掉,只是時間問題。( Replicate Leveldb 方案也存在上述問題)。 另外,activemq 還有network模式,但此模式的應用場景不是很明確。
? ? 二、多個Activemq broker 同時工作
通過上面的分析, 簡單的采用Activemq官網(wǎng)上提供的方案基本上不能滿足生產(chǎn)系統(tǒng)的性能和高可用要求。因此,必須對上述方案進行改進,實現(xiàn) “高性能”,“高可用”,“可擴展”的MQ集群方案。
同時部署多個Activemq broker實例, 多個Activemq broker實例同時工作。單個broker實例,生產(chǎn)和消費消息的速度在1萬條/秒,部署N個Broker, 整個消息通道就能拓寬N倍; 多個(4個以上)broker 實例同時工作,其中1到2個mq實例出現(xiàn)問題時,消息可經(jīng)過其他broker處理,整個系統(tǒng)依然可以健康工作,從而實現(xiàn)高可用。

a、消息發(fā)送方的應用程序的采用輪循方式給多個broker發(fā)送消息
b、消息消費方的應用程序針對每個broker啟用對應的consumer來消費消息。
按照這樣的部署方案,兩個或兩個以上MQ可以同時工作,可以解決MQ單點問題。MQ做為消息的傳輸管道, 增加MQ數(shù)量就可以拓寬管道的寬度,提高消息傳輸性能。
我們將“多個同時工作的broker"成為 broker組,如果 broker組內(nèi)的broker數(shù)量太多的話,那么再開發(fā)或部署時,broker內(nèi)的隊列配置將會是一件非常繁瑣的事。因此,我們將broker內(nèi)的隊列queue進行分組,具有相同前綴名的隊列為一組,前綴名相同的隊列中的消息的業(yè)務邏輯是相同的。通過隊列前綴名將消息組件與業(yè)務關聯(lián)上。 根據(jù)業(yè)務不同,配置不同的sender ?和 listener 時,只要配置不同的隊列前綴名。從而簡化配置與使用,同時也可以防止消息發(fā)錯隊列的錯誤。

如上圖,有 ChargeQueue 和 QueryQueue連個隊列組,對應不同的業(yè)務功能。

在消息消費的應用程序中,針對ChargeQueue 和 QueryQueue 配置Consumer Listener Container, 同時可以正對不同的隊列配置不同數(shù)量的消費則數(shù)目。
單個ActiveMQ的接收和消費消息的速度在1萬筆/秒(持久化 一般為1-2萬, 非持久化 2 萬以上),在生產(chǎn)環(huán)境中部署10個Activemq就能達到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消息消費端,如果有多個不同的應用程序去消費同一個隊列中的消息,那么 activemq的 prefetchSize應該設置為1。
以上兩個參數(shù)對性能的影響非常大。