1. 程式人生 > >ActiveMQ生產環境調優

ActiveMQ生產環境調優

utf get 部署 odin l數據庫 bcp npr ren stat

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起作用。

ActiveMQ生產環境調優