ActiveMQ 填坑記

Mysql 持久化
現在大家使用MQ,基本都是會把數據進行持久化,MQ默認存儲持久化數據使用kahaDB,但是鑑於大家對mysql比較熟悉,很多人會選擇mysql進行數據的持久化,因爲mysql查看數據還是比較方便的。如果需要把持久化方式改爲mysql,則需要修改如下配置:

<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false" useDatabaseLock="false"/>
<!-- 下面是默認的kahaDB方式,註釋掉 -->
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
</persistenceAdapter>
這裏的配置有幾個地方大家需要關注下:

配置 說明
dataDirectory 需要配置和broker 的dataDirectory 一致
dataSource 數據源的選擇,關聯數據庫的具體配置,下文會具體說明
useDatabaseLock 是否使用數據庫鎖,主要是在程序啓動的時候會同步查詢數據,導致數據庫鎖
還需要配置數據庫的連接、賬號、密碼等:

<!-- 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,增加

mysql-connector-java-5.1.30.jar
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
三個包,放到lib目錄即可

管理界面無法打開
如果正常啓動了,但是管理界面無法啓動,那麼需要修改下管理界面的數據庫連接。

使用MQ主要原因之一是MQ性能比傳統關係數據庫性能要好,但是把MQ數據存儲的mysql其實不是一個很好的選擇,反其道而行之,雖然這樣用的團隊不少,但是強烈推薦不要這麼做。還是用默認的存儲方式,確保性能爲主。

activeMQ過期配置
前文說過,activemq性能本來就不是最優的,特別是使用了mysql作爲數據庫存儲工具後,性能更加不靠譜,所以性能優化,是個重要的工作,定期清理MQ的過期信息,就顯的非常重要了。

定期清理無效的隊列
配置如下:

<destinationPolicy>
<policyMap>
<policyEntries>

            &lt;policyEntry queue="&gt;" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000"&gt;
            &lt;deadLetterStrategy&gt;
                &lt;sharedDeadLetterStrategy processExpired="true" expiration="30000"/&gt;
            &lt;/deadLetterStrategy&gt;
             &lt;/policyEntry&gt;

            &lt;policyEntry topic="&gt;" gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000" &gt;

              &lt;pendingMessageLimitStrategy&gt;
                &lt;constantPendingMessageLimitStrategy limit="1000"/&gt;
              &lt;/pendingMessageLimitStrategy&gt;
            &lt;/policyEntry&gt;

          &lt;/policyEntries&gt;

        &lt;/policyMap&gt;
    &lt;/destinationPolicy&gt;

定期自動清理無效的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的消費情況,最好能設置過期時間,定期清理消息隊列的數據,避免數據的積累,造成性能的下降。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章