跳至主要内容

🧣 效能調校實戰

本章節整理 ActiveMQ Classic 的效能調校要點。從 JVM 參數、Prefetch 策略到持久化取捨,幫助你在吞吐量與可靠性之間找到適合業務的平衡點。

環境

1. 調校維度總覽

2. JVM 參數

# bin/activemq.bat 或 wrapper.conf
set ACTIVEMQ_OPTS=-Xms1G -Xmx2G -Djava.util.logging.config.file=logging.properties
參數建議說明
-Xms-Xmx 相同避免 Heap 動態擴展的開銷
-Xmx2G ~ 4G(視流量)過小導致 GC 頻繁,過大影響恢復速度
-XX:+UseG1GCJDK 8u40+ 可考慮降低 Full GC 停頓

memoryUsage 應為 Heap 的 60%~70%,參見 flowControl

3. Prefetch 調校

場景queuePrefetch原因
多 Consumer 競爭1均勻分配
單 Consumer 高吞吐500 ~ 1000減少網路往返
Message Group1確保 Group 正確分配
大型訊息1避免記憶體壓力
<policyEntry queue=">" queuePrefetch="100"/>

4. 持久化取捨

模式吞吐可靠性適用
非持久化最高斷線可能遺失即時股價、感測器
持久化 + KahaDB中高訂單、交易
持久化 + JDBC較低高 + 可 SQL 查詢需 DB HA
// 非持久化發送
producer.send(message, DeliveryMode.NON_PERSISTENT, ...);

5. 客戶端連線池

PooledConnectionFactory pooled = new PooledConnectionFactory();
pooled.setConnectionFactory(factory);
pooled.setMaxConnections(20);
pooled.setMaximumActiveSessionPerConnection(50);

Spring Boot 啟用連線池:

spring.activemq.pool.enabled: true
spring.activemq.pool.max-connections: 20

6. Consumer 並行度

// Spring JMS
factory.setConcurrency("5-20"); // 5~20 個消費執行緒

並行數建議與 CPU 核心數和業務處理時間匹配,過多反而增加上下文切換。

7. 壓測指標

指標觀察方式健康參考
吞吐量(msg/s)JMX EnqueueCount 變化率依業務需求
端到端延遲Producer 打時間戳,Consumer 計算差值< 100ms(即時場景)
GC 停頓JVM GC logFull GC < 1 次/小時
Store 使用率JMX StorePercentUsage< 70%

8. 常見問題與排查

現象可能原因處理方式
吞吐低prefetch=1 且單 Consumer增加 Consumer 或調高 prefetch
GC 頻繁Heap 太小或訊息過大增大 -Xmx 或縮小訊息
延遲飄高持久化 + 磁碟 I/O 瓶頸KahaDB 放 SSD,參見 kahadbTuning
CPU 飆高Consumer 過多或無限重送調整並行數與 redeliveryPolicy

9. 與其他文章的關聯