摘要:ActiveMQ優化 客戶端優化 預取限制
原文:http://fusesource.com/docs/broker/5.4/tuning/GenTuning-Consumer-Prefetch.html
Overview:圖列4.1闡明了Broker在等待之前發送給客戶端消息的反饋的行為
Figure 1.4. Consumer Prefetch Limit
如果客戶端處理很慢的話,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
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
new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");
MessageConsumer consumer = session.createConsumer(queue);