[英]Concurrent message processing in RabbitMQ consumer
我是RabbitMQ的新手,所以如果我的問題聽起來微不足道,請原諒。 我想在RabbitMQ上發布消息,它將由RabbitMQ消費者處理。
我的消費者機器是一個多核機器(最好是天藍色的工人角色)。 但QueueBasicConsumer一次推送一條消息。 如何編程以利用我可以同時處理多個消息的所有核心。
提前致謝
您的第二個選項聽起來更合理 - 在單個通道上使用並生成多個任務來處理消息。 要實現並發控制,您可以使用信號量來控制飛行中的任務數量。 在開始任務之前,您將等待信號量變為可用,並且在任務完成后,它將發信號通知信號量以允許其他任務運行。
您沒有指定您選擇的語言/技術堆棧,但無論您做什么 - 嘗試利用線程池而不是自己創建和管理線程。 在.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.