ActiveMQ之消息分發策略

分發策略

queue的分發策略

可插拔的分發策略只適用於topic。queue的分發策略比較固定:輪詢(默認)或按照嚴格順序。同時我們也應該瞭解prefect的意義。

ActiveMQ的prefetch缺省參數是針對處理大量消息時的高性能和高吞吐量而設置的,因此默認的prefect值很大,默認的分發策略會盡快嘗試將預取緩衝區填滿(prefetch buffers)。

然而在有些情況下,例如只有少量的消息而且單個消息的處理時間比較長,那麼在缺省的prefetch和dispatch policies下,這些少量的消息總是傾向於被分發到個別的consumer上。這樣就會因爲負載的不均衡分配而導致處理時間的增加。

對於隊列,你可以選擇使用輪詢或按嚴格順序(strictOrderDispatch)。
strictOrderDispatch表示在直到當前消費者的prefetch緩衝區滿了之後才選擇下一個消費者進行消息的分發。

通過下面的方式來啓用按嚴格順序分發的策略:

<policyEntry queue=">" strictOrderDispatch="false" />

如果你有幾個優先級不同的消費者,消息會先發送給優先級最高的消費者,直到它的prefect緩衝區滿,然後再下一個,等等。

從5.14.0版開始——strictOrderDispatch=true選項將確保只有一個消費者時重新發送消息的順序是嚴格的。

topic的分發策略

所有實現了org.apache.activemq.broker.region.policy.DispatchPolicy的都可以。默認實現是org.apache.activemq.broker.region.policy.SimpleDispatchPolicy,它將消息傳遞給所有的訂閱者。一個更高級的實現示例是org.apache.activemq.broker.region.policy.PriorityNetworkDispatchPolicy,它只會分發給擁有最高優先級的網絡消費者。這在循環網絡拓撲結構中非常有用,因爲在這種拓撲結構中,到消費者的路由不止一條。

下面是一個Destination策略配置示例

<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>

參考:http://activemq.apache.org/dispatch-policies.html
參考:https://blog.51cto.com/1754966750/1923299

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章