【ActiveMQ Tuning】Prefetch Limit


   摘要:ActiveMQ優化 客戶端優化 預取限制

原文:http://fusesource.com/docs/broker/5.4/tuning/GenTuning-Consumer-Prefetch.html

Overview:圖列4.1闡明了Broker在等待之前發送給客戶端消息的反饋的行為

Figure 1.4. Consumer Prefetch Limit

 

 

 general_03

   如果客戶端處理很慢的話,Broker會在之前發送消息的反饋之前,繼續發送新的消息到客戶端。如果客戶端依舊很慢的話,沒有得到確認反饋的消息會持續增長。在這種情況下,Broker有可能會停止發送消息給消費者。當未被反饋的消息達到了prefetch limit設置的數字時,Broker將會停止給消費者發送新的消息。除非消費者開始給與反饋,否則得不到任何消息。

Default Prefetch Limit(默認預取限制):不同的消費者類型有不同的默認設置,具體設置如下:

Queue consumer:默認1000

              如果你使用一組消費者進行分散工作量的話(一個Queue對應多個消費者),典型的你應該把數字設置的小一些。如果一個消費者被允許可以聚集大量的未被確認的消息的話,會導致其它的消費者無事可做。同時,如果這個消費者出錯的話,會導致大量的消息不能被處理,直到消費者恢復之前。

Queue browser:默認500

Topic consumer:默認32766

      默認值32766是數字short的最大值,也是預取限制的最大值。

Durable topic subscriber:默認100

       通常你可以通過增加預取限制來改善性能。

Optimizing prefetch limits(優化預取限制):通常的,優化Queue消費和持久化主題訂閱者(durable topic subscriber)是個好主意。
  • Queue consumers如果你的queue只有一個消費者的話,你可以設置預取限制為一個相當大的值。但,如果一個queue有一組消費者的話,你最好限制到一個比較小的數字上,比如0或者1.
  • Durable topic subscribers通常增大預取限制的數量會提高性能。嘗試一下增加到1000.

How to set prefectch limits(如何設置預取限制):你可以在Broker端或者消費者端設置預取制限。這有三種粒度的設置方式。如下:

Per broker:你可以設置連接Broker的所有消費者的預取限制,通過設置borker的目標策略。設置目標策略需要在broker中增加子條目 destinationPolicy 。參考如下:

 <broker ... >

  ...
   < destinationPolicy >
     < policyMap >
       < policyEntries >
         < policyEntry  queue ="queue.>"  queuePrefetch =”1”/>
        
<policyEntry topic ="topic.>"  topicPrefetch =”1000”/>
      
</policyEntries >
     </ policyMap >
   </ destinationPolicy >
  ...
</ broker >

在前面的例子中,所有開頭以queue命名的queue的預取限制設置為1.(>是一個通配符,用於匹配一個或者多個命名段)。所有開頭以topic命名topic的預取限制設置為1000.

   如下的policyEntry 屬性也被用來設置預取限制:

queuePrefetch:指定queue消費者的預取限制。

queueBrowserPrefetch:指定queue瀏覽者的預取限制。

topicPrefetch:指定topic消費者的預取限制。

durableTopicPrefetch:指定durable topic訂閱者的預取限制。

Per connection factory:在消費者端,你可以通過ActiveMQConnectionFactory 屬性來設置一個Connection factory實例的預取制限,代碼如下所示:

 // Java

ActiveMQConnectionFactory factory =  new ActiveMQConnectionFactory();

Properties props =  new Properties();
props.setProperty("prefetchPolicy.queuePrefetch", "1000");
props.setProperty("prefetchPolicy.queueBrowserPrefetch", "500");
props.setProperty("prefetchPolicy.durableTopicPrefetch", "100");
props.setProperty("prefetchPolicy.topicPrefetch", "32766");

factory.setProperties(props);

Per destination:一個最好的粒度,你可以在創建消費者的時候設置每個目的的預取限制。消費queue,TEST.QUEUE,時指定預取限制為10.創建MessageConsumer 實例的代碼如下:

     // Java

Queue queue = 
   new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");

MessageConsumer consumer = session.createConsumer(queue);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM