2012-04-05 1620 views
24

在我們的項目中,我們希望在「任務隊列」模式中使用RabbitMQ來傳遞數據。在生產者方面,我們構建了幾個TCP服務器(在node.js中)來收集高併發數據,並將其發送給MQ,而不做任何事情。通過RabbitMQ最大化吞吐量

在消費者方面,我們使用JAVA客戶端從 MQ獲取任務數據,處理它然後確認。

所以問題是: 爲了獲得最大的消息傳遞吞吐量/性能(例如,400,000 msg /秒),最多有多少個隊列?更多的隊列意味着更好的吞吐量/性能嗎?還有什麼我應該注意的嗎? 在這種情況下使用RabbitMQ的任何已知最佳實踐指南?

任何意見非常感謝!

回答

24

爲了在RabbitMQ中獲得最佳性能,請遵循其創建者的建議。從RabbitMQ blog

的RabbitMQ的隊列是最快的,當他們空。當隊列爲空時,消費者已準備好接收消息,然後 消息被隊列接收,它直接進入 消費者。如果持久消息存在於持久隊列中,是的,它也會轉到磁盤,但是這是以異步方式完成的,並且 被大量緩衝。主要的一點是需要做很少的記錄 ,很少有數據結構被修改,並且很少有額外的內存需要分配。

如果你真的想深入挖掘RabbitMQ隊列的性能,他們的這other blog entry進一步進入數據。

26

據我曾經從RabbitMQ的-討論郵件組了還有其他的東西,你可以嘗試以提高吞吐量和降低延遲的響應:

  • 使用較大的預取計數。小的值會傷害性能。

  • 主題交換比直接交換或扇出交換慢。

  • 確保隊列保持不短。較長的隊列施加更多的處理開銷。

  • 如果您關心延遲和消息速率,那麼請使用較小的消息。 使用有效格式(例如避免XML)或壓縮有效負載。

  • 用HiPE進行實驗,這有助於提高性能。

  • 避免事務和持久性。同時避免立即發佈 或強制模式。避免HA。集羣也會影響性能。

  • 如果您有多個隊列和消費者,您將在多核系統上實現更高的吞吐量。

  • 使用至少v2.8.1,其引入的流量控制。確保 內存和磁盤空間警報永不觸發。

  • 虛擬化可以並處一點點的性能損失。

  • 調整你的操作系統和網絡協議棧。確保你提供了足夠多的RAM。提供快速內核和RAM。

+0

是一個主題交換慢,因爲它需要交換更長的時間來計算到哪個隊列需要發送的消息? – robertjewell 2017-03-13 15:45:14

2

您將增加較大的預取數和同時ACK多個消息(而不是發送ACK的每個消息)從消費者的吞吐量。

但是,當然,帶有多個標誌的ACK(http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.ack)需要額外的消費者應用程序邏輯(http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-August/029600.html)。你將不得不繼續從經紀人提供的消息傳送標籤的列表,它們的狀態(是否您的應用程序已辦理與否)和ACK每隔N個交付標籤(NDTAG)當所有交付的消息-tag小於或等於NDTAG已被處理。