派送策略
派送策略
佇列的派送策略
可外掛的派送策略僅適用於主題。對於佇列,派送更具靜態性,您可以選擇循環式(預設)或嚴格順序。在討論派送策略之前,首先了解 預取值的目的是值得的。
ActiveMQ Classic 的開箱即用配置專為高效能和高吞吐量訊息傳遞而設計,其中有大量訊息需要盡快派送到消費者。因此,預設的預取值相當大,並且預設的派送策略將嘗試盡快填滿預取緩衝區。
然而,訊息傳遞有很多使用案例,有時預設配置對於您的使用案例來說並非理想;當您發送少量訊息時,除非您有很多訊息,否則它們往往會全部發送到一個消費者。如果您有大量消費者和相對較高的預取值,並且您有少量訊息,每個訊息都需要相當長的時間來處理,那麼預設的派送策略可能會導致處理所有訊息所需的時間增加(因為對於少量訊息來說,負載平衡是不公平的)。
對於佇列,您可以定義派送是否以循環方式進行(預設行為),或者是否在派送過程選擇下一個消費者之前,先將一個消費者的預取緩衝區耗盡(strictOrderDispatch)。
後者的行為是透過在 <policyEntry />
元素上設定 strictOrderDispatch
屬性來啟用。例如:
<policyEntry queue=">" strictOrderDispatch="false" />
消費者優先級會被考慮到,因此如果您有幾個具有不同優先級的消費者,則優先級最高的消費者將首先被填滿,直到它無法再接收更多訊息為止,然後依此類推。
從 5.14.0 版本開始,當只有一個消費者時,strictOrderDispatch=true 選項將確保重新派送的訊息嚴格按照順序。
主題的派送策略
主題有更多選項,因為派送策略是可外掛的。任何 org.apache.activemq.broker.region.policy.DispatchPolicy 的實作都可以運作。
預設的 org.apache.activemq.broker.region.policy.SimpleDispatchPolicy
會執行預期的操作,並將訊息傳遞給所有訂閱者。一個更進階的實作範例是 org.apache.activemq.broker.region.policy.PriorityNetworkDispatchPolicy
,它只會派送到最高優先級的網路消費者。這在迴路網路拓撲中很有用,在這種情況下,到消費者的路線不止一條。
這是目的地策略配置的範例。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="FOO.>">
<dispatchPolicy>
<roundRobinDispatchPolicy />
</dispatchPolicy>
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy />
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="ORDERS.>">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<!-- 1 minutes worth -->
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="60000" />
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry topic="PRICES.>">
<!-- lets force old messages to be discarded for slow consumers -->
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="10"/>
</pendingMessageLimitStrategy>
<!-- 10 seconds worth -->
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="10000" />
</subscriptionRecoveryPolicy>
</policyEntry>
<policyEntry tempTopic="true" advisoryForConsumed="true" />
<policyEntry tempQueue="true" advisoryForConsumed="true" />
</policyEntries>
</policyMap>
</destinationPolicy>