ActiveMQ生產環境調優


ActiveMQ簡介

   MQ是消息中間件,是一種在分布式系統中應用程序借以傳遞消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的開源項目,完全支持JMS1.1和J2EE1.4規范的JMS Provider實現。消息類型包括點對點(queue),一對多(topic),本次生產環境用的是queue。


1、部署環境 

  三個ActiveMQ實例+MySQL數據數據庫持久化,三台ActiveMQ采用failover方式,MQ數據持久化在MySQL數據庫中,MySQL采用主備方式,該架構保證數據高可用性。目前線上壓測TPS為1200,滿足實際生產需求。

 實際TPS到2、3千沒問題。

2、Producer優化

  采用spring+activemq實現,采用PooledConnectionFactory連接池,用於緩存session和producter,在高並發情況下不要采用CachingConnectionFactory,CachingConnectionFactory共享一個connection,TPS上不去。

   對發送TPS有直接影響的參數如下

      1.ActiveMQConnectionFactory調優
     connectionFactory.setUseAsyncSend(activeMqProperties.isAsyncSend());   // 同步\異步發送消息,如果是異步需要設置 connectionFactory.setProducerWindowSize(10240);
     connectionFactory.setMaxThreadPoolSize(activeMqProperties.getMaxThreadPoolSize());   // session線程池

        2.PooledConnectionFactory調優
     pooledConnectionFactory.setMaxConnections(10);  // 最大connection數量,和生產者TPS直接相關
        pooledConnectionFactory.setMaximumActiveSessionPerConnection(5); // 每個connection的最大session數

 

3、consumer優化

  對消費TPS有直接影響的參數如下

  

          asyncSend=true  //設置為true,異步方式,如果是false和生產者有關系,嚴重影響消費TPS
         queuePrefetch=1 // 實際測試為1效率高,設置比較大時,嚴重影響消費TPS

        concurrentConsumers=100 // 消費者線程總量,和消費TPS直接相關

 

4、MQ數據持久化數據庫配置 

      <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://localhost:3306/activemq?characterEncoding=utf-8&amp;relaxAutoCommit=true" />
            <property name="username" value="root" />
            <property name="password" value="123" />
            <property name="initialSize" value="100" />
            <property name="maxTotal" value="500" />
            <property name="maxIdle" value="30" />
            <property name="maxWaitMillis" value="10000" />
            <property name="minIdle" value="1" />
            <property name="poolPreparedStatements" value="true"/>
            <property name="connectionProperties" value="connectTimeout=60000;socketTimeout=60000"/>    // 特別注意,當數據庫發生主從切換時,需要斷開數據庫鏈接,不然會卡死當前主MQ實例
        </bean>

 特別注意:

對於mq在mysql發生主從切換時卡死20分鍾問題的解決方案如下
1.運維寫了個腳本監控,當數據庫主服務宕機后,監控3306端口連接情況,當3306端口沒有連接后在漂移到從數據庫
  經過驗證,大概20s mq恢復正常工作,不丟棄數據;
2.mq配置文件配置jdbc連接時加上connectTimeout=60000;socketTimeout=60000,當數據庫主宕機后,1分鍾左右mq恢復正常工作,不丟棄數據;
PS:當mysql主服務實例掛了,方案1起作用;如果mysql主服務器重啟這種機器故障,方案2起作用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM