派送策略

功能 > 訊息派送功能 > 派送策略

派送策略

佇列的派送策略

可外掛的派送策略僅適用於主題。對於佇列,派送更具靜態性,您可以選擇循環式(預設)或嚴格順序。在討論派送策略之前,首先了解 預取值的目的是值得的。

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>

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 Apache 軟體基金會的商標。版權所有 © 2024,Apache 軟體基金會。根據 Apache 許可證 2.0 授權。