簡體   English   中英

RabbitMQ使用者中的並發消息處理

[英]Concurrent message processing in RabbitMQ consumer

我是RabbitMQ的新手,所以如果我的問題聽起來微不足道,請原諒。 我想在RabbitMQ上發布消息,它將由RabbitMQ消費者處理。

我的消費者機器是一個多核機器(最好是天藍色的工人角色)。 但QueueBasicConsumer一次推送一條消息。 如何編程以利用我可以同時處理多個消息的所有核心。

  1. 一種解決方案可以是在多個線程中打開多個通道,然后在那里處理消息。 但在這種情況下,我將如何決定線程數。
  2. 另一種方法是在主線程上讀取消息,然后創建任務並將消息傳遞給此任務。 在這種情況下,如果有許多消息(在閾值之后)已經在進行中,我將不得不停止使用消息。 不知道如何實施。

提前致謝

您的第二個選項聽起來更合理 - 在單個通道上使用並生成多個任務來處理消息。 要實現並發控制,您可以使用信號量來控制飛行中的任務數量。 在開始任務之前,您將等待信號量變為可用,並且在任務完成后,它將發信號通知信號量以允許其他任務運行。

您沒有指定您選擇的語言/技術堆棧,但無論您做什么 - 嘗試利用線程池而不是自己創建和管理線程。 在.NET中,這意味着使用Task.Run異步處理消息。

示例C#代碼:

using (var semaphore = new SemaphoreSlim(MaxMessages))
{
    while (true)
    {
        var args = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
        semaphore.Wait();
        Task.Run(() => ProcessMessage(args))
            .ContinueWith(() => semaphore.Release());
    }
}

您可能會發現在通道上啟用顯式ACK控制更容易,並使用RabbitMQ Consumer Prefetch設置未確認消息的最大數量,而不是自己控制並發級別。 這樣,您將永遠不會收到比您想要的更多的消息。

暫無
暫無

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

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