2015-08-14 22 views
3

我有一個生產者發送批處理持久消息到一個利用JMS事務的隊列。遏制將批量持久消息發送到隊列的ActiveMQ生產者的正確方法是什麼?

我已經測試,發現生產者流量控制使用間歇大小時的1.我可以看到我的製作被節流按照內存限制我已配置給隊列被應用。這裏是我的製片人流量控制配置:

<policyEntry queue="foo" optimizedDispatch="true" 
    producerFlowControl="true" memoryLimit="1mb"> 
</policyEntry> 

在隊列中等待消息的數量在控制,我看到作爲生產者流量控制行動的證據。

但是,當批量大小增加到2時,我發現這個內存限制沒有被遵守,並且生產者根本沒有THROTTLEDED。證據是隊列中待處理消息的數量不斷增加,直到達到存儲用例配置的限制。

我理解這可能是因爲消息在異步方式發送時,批量大小超過1儘管我還沒有明確設定useAsyncSend真正

ActiveMQ的Producer Flow Control documentation提到油門異步的出版商,我們需要配置生產者窗口大小中不得強制生產者等待確認一旦達到限制窗口製片人。

但是,當我在生產者中配置生產者窗口大小並試圖批量發送消息時,拋出異常並且沒有發送消息。

這讓我覺得和問這個問題,「是否有可能配置生產者窗口大小而在批次發送持久性消息?」。

如果不是,那麼什麼是正確的方式來遏制批次發送持久性消息的生產者?

+0

我可以知道投票問題的原因嗎? –

+0

我在[Active MQ Mailing List]中詢問了這個問題(http://activemq.2283324.n4.nabble.com/What-is-the-correct-way-to-throttle-ActiveMQ-producers-who-send-persistent -messages-in-batches-to-a-td4701204.html),但尚未收到任何結論性答案。 –

回答

2

有沒有真正的方法來遏制「每秒最大消息」或類似。你要做的是啓用生產者流量控制和虛擬光標,然後在該隊列上設置內存限制(或者如果你願意,可以將所有隊列)設置爲合理的級別。

如果生產者在達到隊列內存限制時應該掛起或拋出異常,您可以在配置中決定。

<policyEntry queue="MY.BATCH.QUEUE" memoryLimit="100mb" producerFlowControl="true"> 
    <pendingQueuePolicy> 
    <vmQueueCursor/> 
    </pendingQueuePolicy> 
</policyEntry> 
+0

嗨,Petter,謝謝你的回答。我知道這個配置。生產者流量控制在同步發送消息時應用。在異步發送時,您需要在製作者中設置「Producer Window Size」。我的問題是在「批處理」中發送消息(例如,使用JMS事務處理一批200個消息),Producer Flow Control如何應用?我親自測試並發現,在「批量」發送消息時,內存限制不受尊重。 –

0

我在v5.8.0中發現此問題,但發現此問題已在v5.9.0及更高版本中解決。 從v5.9.0開始,我發現即使對於異步發送消息的生產者,PFC也是開箱即用的。 由於批量發送(批量大於1)本質上是一個異步操作,因此也適用於此。 但是PFC wiki很混亂,因爲它提到如果要應用PFC,應該爲異步生產者配置ProducerWindowSize。但是,我測試並驗證了這不是必需的。 我基本上配置了1mb的每個目的地限制,並批量發送消息(批量大小爲100)。

我的製片人被掐住開箱即無需任何額外的配置。隊列中待處理消息的數量沒有增加並處於控制之下。我發現使用v5.8.0(我遇到問題時),我可以在36秒內發送100k消息,其有效載荷爲2k。但他們中的大多數最終成爲待處理消息。

但是在v5.9.0中,發送相同的一組消息來證明PFC扮演的角色需要176秒。在我的情況下,未決消息的數量從未超過1000。

我還測試了v5.10.0和v5.12.0(寫作時的最新版本),它按預期工作。

所以,如果你面臨這個問題,很可能你正在運行ActiveMQ v5.8.0或更早的版本。只需升級到最新版本即可解決此問題。

我非常感謝ActiveMQ郵件列表人員提供的所有建議和幫助。

謝謝@Petter的回答。對不起,我沒有提到我在問題中使用的版本,否則我相信你可以馬上發現問題。

相關問題