如今你們使用MQ,基本都是會把數據進行持久化,MQ默認存儲持久化數據使用kahaDB,可是鑑於你們對mysql比較熟悉,不少人會選擇mysql進行數據的持久化,由於mysql查看數據仍是比較方便的。若是須要把持久化方式改成mysql,則須要修改以下配置:java
<persistenceAdapter> <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false" useDatabaseLock="false"/> <!-- 下面是默認的kahaDB方式,註釋掉 --> <!-- <kahaDB directory="${activemq.data}/kahadb"/> --> </persistenceAdapter>
這裏的配置有幾個地方你們須要關注下:mysql
配置 | 說明 |
---|---|
dataDirectory | 須要配置和broker 的dataDirectory 一致 |
dataSource | 數據源的選擇,關聯數據庫的具體配置,下文會具體說明 |
useDatabaseLock | 是否使用數據庫鎖,主要是在程序啓動的時候會同步查詢數據,致使數據庫鎖 |
還須要配置數據庫的鏈接、帳號、密碼等:sql
<!-- MySql DataSource Setup --> <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://0.0.0.0:3306/activemq?relaxAutoCommit=true"/> <property name="username" value="root"/> <property name="password" value="******"/> <property name="poolPreparedStatements" value="true"/> </bean>
其中,id 名和上文提到的datasource應該是同樣的。不然,不知道鏈接哪一個實例。數據庫
啓動activemq若是提示數據庫的鏈接池有問題,這多是少了lib,增長apache
三個包,放到lib目錄便可性能優化
若是正常啓動了,可是管理界面沒法啓動,那麼須要修改下管理界面的數據庫鏈接。ide
使用MQ主要緣由之一是MQ性能比傳統關係數據庫性能要好,可是把MQ數據存儲的mysql其實不是一個很好的選擇,反其道而行之,雖然這樣用的團隊很多,可是強烈推薦不要這麼作。仍是用默認的存儲方式,確保性能爲主。工具
前文說過,activemq性能原本就不是最優的,特別是使用了mysql做爲數據庫存儲工具後,性能更加不靠譜,因此性能優化,是個重要的工做,按期清理MQ的過時信息,就顯的很是重要了。性能
配置以下:測試
<destinationPolicy> <policyMap> <policyEntries> <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000"> <deadLetterStrategy> <sharedDeadLetterStrategy processExpired="true" expiration="30000"/> </deadLetterStrategy> </policyEntry> <policyEntry topic=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000" > <pendingMessageLimitStrategy> <constantPendingMessageLimitStrategy limit="1000"/> </pendingMessageLimitStrategy> </policyEntry> </policyEntries> </policyMap> </destinationPolicy>
按期自動清理無效的Topic和Queue,這個配置,只會清除設置的時間內,沒有被訂閱,同時隊列沒有遺留數據的隊列。
同時,對於boker節點,須要設置schedulePeriodForDestinationPurge 參數,表示多長之間執行一次檢測。
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost01" dataDirectory="${activemq.data}" useJmx="true" schedulePeriodForDestinationPurge="5000">
開發的時候,你們應該都知道能夠設置消息的過時時間,是否有統一設置消息的過時時間呢?
在broker節點下增長以下的配置:
<plugins> <!-- 86400000 爲一天,設置爲10天過時 --> <timeStampingBrokerPlugin ttlCeiling="10000" zeroExpirationOverride="10000" /> </plugins>
爲了便於測試,我設置的是10s,固然,生產環境根據本身的是實際設置的會比較長。過時的時間會進入死信,死信也會沿用此時間,到期後,系統就會自動刪除信息了。
通過我我的的實踐經驗,MQ積累的數據達千萬級別後,性能降低的比較厲害,按期清理MQ的消息,是優化性能很是重要的一個操做。
現現在,MQ的選擇不少,建議仍是優先選擇rabbitmq、rocketmq或者是kafka,若是已經選擇activemq,須要持續關注MQ的消費狀況,最好能設置過時時間,按期清理消息隊列的數據,避免數據的積累,形成性能的降低。