ActiveMQ 填坑記

Mysql 持久化

如今你們使用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

  • mysql-connector-java-5.1.30.jar
  • commons-dbcp2-2.1.1.jar
  • commons-pool2-2.4.2.jar

三個包,放到lib目錄便可性能優化

管理界面沒法打開

若是正常啓動了,可是管理界面沒法啓動,那麼須要修改下管理界面的數據庫鏈接。ide

使用MQ主要緣由之一是MQ性能比傳統關係數據庫性能要好,可是把MQ數據存儲的mysql其實不是一個很好的選擇,反其道而行之,雖然這樣用的團隊很多,可是強烈推薦不要這麼作。仍是用默認的存儲方式,確保性能爲主。工具

activeMQ過時配置

前文說過,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的消費狀況,最好能設置過時時間,按期清理消息隊列的數據,避免數據的積累,形成性能的降低。

相關文章
相關標籤/搜索