2013-09-25 37 views
0

您好我目前正在使用spring AMQP api連接到RabbitMQ,基本上在我的客戶代碼中,我正在異步讀取消息並在彈性搜索中進行批量插入。當我做ack = AUTO時,我得到400-500 msg/sec的中等速度(從隊列中讀取)。當我確認= NONE時,讀取速度的增加是巨大的,即它達到5000-6000 msg/sec。配置Spring集成QueueChannel for RabbitMQ

硬件配置與用32GB RAM JVM參數如下 Linux機器 -server -Xms1g -Xmx1g -Xss384k PermSize =256米MaxPermSize參數=256米

現在的問題是,當我做ACK =沒有,雖然我獲得了很好的速度,但是JVM在一段時間後才能獲得OutOfMemory,並且我可以看到很多GC正在發生在這種情況下。

我打算使用Spring集成中的QueueChannel,我可以將通道的大小限制爲它可以包含的消息的數量。

誰能告訴我如何與RabbitMQ的實現,這也就是有沒有其他的方式來實現良好的閱讀速度像4000-5000味精/秒,而沒有崩潰的JVM

所有幫助高度讚賞。

感謝 Shantanooķ

回答

1

嘗試使用ack=AUTO,但設置prefetchtxSize,比方說1000;這樣,一個確認將只發送每1000條消息(您可以根據需要調整該值)。

使用ackmode = NONE會導致消息在偵聽器容器中的無限制阻塞隊列中累積,並且只有在偵聽器可以跟上(OOM意味着您不能)時纔會起作用。

對於ack = NONE,我們有一個open JIRA issue來解決這個問題,但上面的技術通常就足夠了。

您還可以使用容器併發設置來提高吞吐量。

+0

我已經有預取計數爲750,但我沒有使用txSize :(會產生什麼效果?我還可以使用Spring與RabbitMQ集成的QueueChannel,因爲它具有大小限制等。 –

+1

'txSize'控制多久我們發送acks,這不是一個好的屬性名稱 - 它與交易無關,從參考手冊:「當與acknowledgeMode AUTO一起使用時,容器將在發送ack之前嘗試處理多達這些消息(等待對於每一個達到接收超時設置),這也是一個事務通道提交時,如果prefetchCount小於txSize,它將增加以匹配txSize。「。使用SI QueueChannel將無助於這種情況 - 內存使用情況在偵聽器容器內。 –