[英]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,並將消息交給執行程序並立即偵聽更多消息,我敢打賭您會得到相當均勻的分布。
我還應該注意,在此設置中,您將使 ACK/NACK 變得更難。 如果您使用的是 Java 8, CompletableFuture
API 將非常適合從傳遞的線程中執行一些直接的 ACK/NACK
您可以通過消費者優先級實現這種行為。 只需為每個實例的每個消費者提供 1-10 的優先級。 由於文檔,這應該平均分配工作負載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.