簡體   English   中英

RabbitMQ 多線程多消費者負載均衡

[英]RabbitMQ Load Balancing Across Multiple Consumers with Multiple Threads

我是 RabbitMQ 的新手,我的任務是修復正在發生的負載平衡錯誤。

這是設置:我們使用 RabbitMQ 在 RPC Api 上運行 Protobuf。

對 api 的請求將發布到 rabbit ,然后由 3 個實例之一使用(API 分布在應用程序的 3 個實例中)。

每個實例設置為使用 10 個線程來處理請求並返回響應。 我們通過設置一個帶有 10 個 ConcurrentConsumers 的 SimpleMessageListener 來實現這一點,這會產生 10 個相應的線程來處理每條消息。

這導致:

Instance 1: Consumers 1-10, Instance 2: Consumers 11-20, Instance 3: Consumers 21-30. 

由於 Rabbit 使用循環方法在消費者之間分配負載(相對於在應用程序實例之間分配負載),如果通過 5 條消息,我們最終會看到這樣的負載:

Instance 1: Threads 1-5 in use (6-10 idle), Instance 2: Idle, Instance 3: idle. 

我想要發生的是: 5 條消息:

Instance 1: Threads 1,2 in use, Instance 2: threads 1,2 in use Instance 3: Thread 1 in use. 

換句話說,我想根據實例(例如實例 1(消費者 1)、2(11)、3(21)、1(2)、2(12))而不是消費者(例如. 實例1,消費者1-5)。

這可以使用 Spring AMQP (1.2.1) 和 Spring Rabbit (1.2.1) 庫嗎? 我的第一個想法是將每個實例的並發消費者減少到 1(因此 rabbit 平均分配給應用程序的每個實例),然后使用執行程序為每個請求啟動一個線程(每個實例總共最多 10 個線程)。

我還沒有看到其他人面臨類似的問題,所以我希望有人能給我一些指導! 我主要是想看看我是否可以對我們當前的設置進行配置更改,或者我是否需要手動實現一些東西。

謝謝!

如果你想循環到你的三個服務器,那么我認為你的想法(並發消費者 = 1)是最好的選擇。

但您應該注意,它僅與應用程序連接以偵聽消息的順序一樣公平,例如:

  1. app1 監聽
  2. app2 監聽
  3. 發送到 app1 的消息
  4. app1 監聽
  5. app3 監聽
  6. 發送到 app2 的消息
  7. 消息發送到 app1 *** 這不是循環
  8. 發送到 app3 的消息

如果您的消息中沒有某種目標信息,您的最大努力將與您的流程連接以接收消息一樣有序。

但是,如果您將消費者數量降至 1,並將消息交給執行程序並立即偵聽更多消息,我敢打賭您會得到相當均勻的分布。

我還應該注意,在此設置中,您將使 ACK/NACK 變得更難。 如果您使用的是 Java 8, CompletableFuture API 將非常適合從傳遞的線程中執行一些直接的 ACK/NACK

您可以通過消費者優先級實現這種行為。 只需為每個實例的每個消費者提供 1-10 的優先級。 由於文檔,這應該平均分配工作負載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM