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&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生產環境調優