2011-10-04 81 views
5

尋找一些關於systemUsage和destinationPolicy配置的幫助,因爲我在完全理解systemUsage,destinationPolicy和流量控制之間的關係時有些困難。ActiveMQ destinationPolicy和systemUsage配置

我們所有的信息都是持久的! producerFlowControl開啓。

所以我們給ActiveMQ說最大512MB的堆空間。

我們systemUsage設置如下:

<systemUsage> 
    <systemUsage> 
     <memoryUsage> 
      <memoryUsage limit="200 mb"/> 
     </memoryUsage> 
     <storeUsage> 
      <storeUsage limit="10 gb"/> 
     </storeUsage> 
     <tempUsage> 
      <tempUsage limit="1000 mb"/> 
     </tempUsage> 
    </systemUsage> 
</systemUsage> 

我們的目的地如下政策:

<destinationPolicy> 
    <policyMap> 
     <policyEntries> 
     <policyEntry topic=">" producerFlowControl="true" memoryLimit="1mb"> 
      <pendingSubscriberPolicy> 
      </pendingSubscriberPolicy> 
     </policyEntry> 
     <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb"> 
     </policyEntry> 
     </policyEntries> 
    </policyMap> 
</destinationPolicy> 

任何人都可以驗證,如果下面是正確的:

這意味着每個人隊列/主題內存限制爲1MB。當這個1MB被擊中時究竟發生了什麼,製作者的隊列塊還是頁面到光盤?

所有隊列和主題允許的內存總量爲200MB。這意味着我們可以有200個頻道以1MB的全部容量運行。我們目前總共有16個隊列和話題,顯然是永遠不會達到的。

我們是否更好地移除內存限制上的單個策略條目並在各個通道之間共享內存?

如果我們這樣做,他們會在什麼時候阻止?

非常感謝任何幫助!可以paypal給你一些啤酒錢!

回答

6

你在這裏觸及很多點,我會按順序回答。

memoryUsage對應於分配給內存存儲的內存量。 storeUsage對應於應該給KahaDB商店多少空間。您可以使用一種或另一種,具體取決於您希望代理持久保留消息的方式。 tempUsage是文件遊標的一種特殊情況(http://activemq.apache.org/message-cursors.html) - 如果超出內存限制,則將內存從內存存儲溢出到磁盤的機制(您必須如果需要,在目標級別配置此行爲)。

policyEntry @ memoryLimit是個別目標的子限制。

超過內存限制時會發生什麼情況取決於生產者流量控制(PFC)是否打開。它在默認情況下處於隊列,關閉主題和異步發送到隊列;所有這些都可以在policyEntry(http://activemq.apache.org/perdestination-policies.html)中配置。

如果您在PFC打開時遇到「內存限制」,您的客戶端將會阻塞,直到有人通過消費商店消息來釋放空間。如果它關閉,發送將拋出一個異常(更好的是客戶比經紀人跌倒)。 「內存限制」是指由所有隊列中的memoryUsage定義的內存限制或特定於隊列的限制(可以在前者之前觸發前者)。

是否需要目標特定的限制取決於您的使用情況。除非你試圖達到特定的結果,否則我會建議忽略它。

+0

需要注意的是,如果達到內存限制,隊列對於事務處理消費者來說也會顯示爲「空」,直到其他人釋放空間爲止。此外 - 遊標僅用於「存儲非持久性消息,如果你用盡memoryLimit」,是嗎? – rogerdpack