Skip to main content

🧣 目的地策略 destinationPolicy

本章節解析 ActiveMQ Broker 中最核心的設定區塊之一:destinationPolicy。它統一管控每個 Queue / Topic 的預取、重送、死信、慢消費者與資源回收行為,是將「概念」落地為「可運行設定」的關鍵。

環境

1. 策略結構 —— 三層對應關係

  • 檔案: /conf/activemq.xml
  • queue=">"topic=">" 中的 > 為萬用字元,代表所有 Queue 或 Topic
  • 更具體的名稱優先匹配,例如 queue="ORDER.>" 優先於 queue=">"

2. 完整設定範例

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<destinationPolicy>
<policyMap>
<policyEntries>
<!-- Queue 策略 -->
<policyEntry queue=">"
prioritizedMessages="true"
maxPageSize="200"
gcInactiveDestinations="true"
inactiveTimoutBeforeGC="600000">
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000"/>
</pendingMessageLimitStrategy>
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ." processExpired="true"/>
</deadLetterStrategy>
<redeliveryPolicy>
<redeliveryPolicy maximumRedeliveries="3"
redeliveryDelay="2000"
useExponentialBackOff="true"/>
</redeliveryPolicy>
</policyEntry>

<!-- Topic 策略 -->
<policyEntry topic=">"
producerFlowControl="true"
advisoryForConsumed="true">
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
</broker>

3. policyEntry 常用屬性

3.1 通用屬性

屬性說明建議
prioritizedMessages啟用訊息優先級排序金融、告警場景設 true
maxPageSize每次從 Store 載入訊息的筆數預設 200,大訊息可調低
producerFlowControl目的地滿時限制 Producer 發送Topic 建議 true
gcInactiveDestinations閒置 Queue 自動回收動態建立 Queue 的場景設 true
inactiveTimoutBeforeGC閒置多久後回收(毫秒)生產環境建議 ≥ 600000(10 分鐘)

3.2 Prefetch 預取策略

Prefetch 決定 Consumer 一次從 Broker 預拉多少則訊息到本地緩衝:

目的地預設 prefetch調校方向
Queue1000慢消費者設為 1,高吞吐可維持預設
Topic32767通常不需調整
<policyEntry queue="ORDER.>" queuePrefetch="10"/>
tip

競爭消費者(Competing Consumers)場景下,將 queuePrefetch 設為 1 可讓訊息更均勻分配給多個 Consumer。

3.3 慢消費者策略

當 Consumer 處理速度跟不上 Producer 時,Broker 需要決定如何處理堆積:

<policyEntry topic=">" slowConsumerStrategy="multicastTopicPrefetch">
<slowConsumerStrategy>
<abortSlowConsumerStrategy abortConnection="false"/>
</slowConsumerStrategy>
</policyEntry>
策略行為
abortSlowConsumerStrategy斷開慢消費者的連線
abortSlowAckConsumerStrategy針對 ACK 遲緩的消費者斷線

4. 巢狀子策略對照

子策略所屬文章功能
redeliveryPolicyackAndRedelivery重送次數與間隔
deadLetterStrategydeadLetterQueue死信佇列行為
pendingMessageLimitStrategysetGCTopic 待處理訊息上限

5. 常見問題與排查

現象相關屬性處理方式
訊息堆積但 Consumer 閒置queuePrefetch 過大調低 prefetch,讓其他 Consumer 有機會取得訊息
Queue 被意外刪除gcInactiveDestinations增大 inactiveTimoutBeforeGC 或關閉 GC
Producer 發送被阻塞producerFlowControl檢查 memoryUsage / storeUsage 是否已滿
優先級訊息未優先處理prioritizedMessages確認設為 true 且 Producer 有設定 priority

6. 與其他文章的關聯