【发布时间】:2021-06-25 08:24:08
【问题描述】:
我们有一个应用程序需要有多个消费者来处理同一个查询。数据具有这样的性质,“竞争消费者”不是问题,因为消息可以按任何顺序独立处理。我的问题是,由于 RabbitMQ 有自己的线程管理等,创建多个消费者选择同一队列的消息的最佳方法是什么?看看这个简单消费者的基本示例:
var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
我认为需要创建多个 channel.BasicConsume(...) 实例,但最好的方法是什么?使用TaskScheduler 或多线程还是什么?
我可以引入服务层并整理一切,但只需要知道最安全的方法是什么。
到目前为止,我发现的所有方法都不是创建多个消费者,而是在我们的案例中这是一个要求。
【问题讨论】:
-
为什么不为每个消费者创建一个队列?每个队列可以绑定到一个交换器。
-
RMQ 消息基于连接以循环方式传递,我更愿意同时运行多个消费者实例,以便生成多个连接。我认为'channel.BasicConsume(...)'的多个实例将继续进行单个连接。