activemq和mysql_activeMQ 填坑记
前言
MQ是現(xiàn)在大型系統(tǒng)架構(gòu)中必不可少的一個(gè)重要中間件,之前有偏文章《MQ(消息隊(duì)列)常見的應(yīng)用場(chǎng)景解析》介紹過(guò)MQ的應(yīng)用場(chǎng)景,現(xiàn)在流行的幾個(gè)MQ是rabbitmq,rocketma,kafka,這幾個(gè)MQ比較最容易找到相關(guān)的文章,而也有些系統(tǒng)使用的是activemq,因activemq是相對(duì)比較傳統(tǒng)的MQ,在使用過(guò)程中還是會(huì)遇到很多坑,這里簡(jiǎn)單列舉幾個(gè)大家可能會(huì)遇到的問題,把自己使用acitvemq的經(jīng)驗(yàn)和大家分享一下。
Mysql 持久化
現(xiàn)在大家使用MQ,基本都是會(huì)把數(shù)據(jù)進(jìn)行持久化,MQ默認(rèn)存儲(chǔ)持久化數(shù)據(jù)使用kahaDB,但是鑒于大家對(duì)mysql比較熟悉,很多人會(huì)選擇mysql進(jìn)行數(shù)據(jù)的持久化,因?yàn)閙ysql查看數(shù)據(jù)還是比較方便的。如果需要把持久化方式改為mysql,則需要修改如下配置:
這里的配置有幾個(gè)地方大家需要關(guān)注下:
配置說(shuō)明dataDirectory需要配置和broker 的dataDirectory 一致dataSource數(shù)據(jù)源的選擇,關(guān)聯(lián)數(shù)據(jù)庫(kù)的具體配置,下文會(huì)具體說(shuō)明useDatabaseLock是否使用數(shù)據(jù)庫(kù)鎖,主要是在程序啟動(dòng)的時(shí)候會(huì)同步查詢數(shù)據(jù),導(dǎo)致數(shù)據(jù)庫(kù)鎖
還需要配置數(shù)據(jù)庫(kù)的連接、賬號(hào)、密碼等:
其中,id 名和上文提到的datasource應(yīng)該是一樣的。否則,不知道連接哪個(gè)實(shí)例。
數(shù)據(jù)庫(kù)連接池問題
啟動(dòng)activemq如果提示數(shù)據(jù)庫(kù)的連接池有問題,這可能是少了lib,增加mysql-connector-java-5.1.30.jar
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
三個(gè)包,放到lib目錄即可
管理界面無(wú)法打開
如果正常啟動(dòng)了,但是管理界面無(wú)法啟動(dòng),那么需要修改下管理界面的數(shù)據(jù)庫(kù)連接。使用MQ主要原因之一是MQ性能比傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)性能要好,但是把MQ數(shù)據(jù)存儲(chǔ)的mysql其實(shí)不是一個(gè)很好的選擇,反其道而行之,雖然這樣用的團(tuán)隊(duì)不少,但是強(qiáng)烈推薦不要這么做。還是用默認(rèn)的存儲(chǔ)方式,確保性能為主。
activeMQ過(guò)期配置
前文說(shuō)過(guò),activemq性能本來(lái)就不是最優(yōu)的,特別是使用了mysql作為數(shù)據(jù)庫(kù)存儲(chǔ)工具后,性能更加不靠譜,所以性能優(yōu)化,是個(gè)重要的工作,定期清理MQ的過(guò)期信息,就顯的非常重要了。
定期清理無(wú)效的隊(duì)列
配置如下:
定期自動(dòng)清理無(wú)效的Topic和Queue,這個(gè)配置,只會(huì)清除設(shè)置的時(shí)間內(nèi),沒有被訂閱,同時(shí)隊(duì)列沒有遺留數(shù)據(jù)的隊(duì)列。
同時(shí),對(duì)于boker節(jié)點(diǎn),需要設(shè)置schedulePeriodForDestinationPurge 參數(shù),表示多長(zhǎng)之間執(zhí)行一次檢測(cè)。
useJmx="true" schedulePeriodForDestinationPurge="5000">
設(shè)置消息的全局過(guò)期時(shí)間
開發(fā)的時(shí)候,大家應(yīng)該都知道可以設(shè)置消息的過(guò)期時(shí)間,是否有統(tǒng)一設(shè)置消息的過(guò)期時(shí)間呢?
在broker節(jié)點(diǎn)下增加如下的配置:
zeroExpirationOverride="10000" />
為了便于測(cè)試,我設(shè)置的是10s,當(dāng)然,生產(chǎn)環(huán)境根據(jù)自己的是實(shí)際設(shè)置的會(huì)比較長(zhǎng)。過(guò)期的時(shí)間會(huì)進(jìn)入死信,死信也會(huì)沿用此時(shí)間,到期后,系統(tǒng)就會(huì)自動(dòng)刪除信息了。
經(jīng)過(guò)我個(gè)人的實(shí)踐經(jīng)驗(yàn),MQ積累的數(shù)據(jù)達(dá)千萬(wàn)級(jí)別后,性能下降的比較厲害,定期清理MQ的消息,是優(yōu)化性能非常重要的一個(gè)操作。
總結(jié)
現(xiàn)如今,MQ的選擇很多,建議還是優(yōu)先選擇rabbitmq、rocketmq或者是kafka,如果已經(jīng)選擇activemq,需要持續(xù)關(guān)注MQ的消費(fèi)情況,最好能設(shè)置過(guò)期時(shí)間,定期清理消息隊(duì)列的數(shù)據(jù),避免數(shù)據(jù)的積累,造成性能的下降。
微信號(hào):itmifen
總結(jié)
以上是生活随笔為你收集整理的activemq和mysql_activeMQ 填坑记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现网页保存_详解Java两种方
- 下一篇: c++向mysql通信_C++连接MyS