RabbitMQ在同一过程中有多个消费者

时间:2019-05-23 09:23:49

标签: c# rabbitmq

我有一个.NET项目,需要读取给定队列中的消息。 我有几个生产者将相同类型的消息写入队列。 我希望我的消费者应用程序具有多个线程来读取消息并进行处理,以使负载不会在单个线程上。

关于如何实现此目标的任何想法或示例代码? 再次注意: 每个消息应处理一次,而不要处理多次。在工作线程之间应该平衡工作

2 个答案:

答案 0 :(得分:0)

您将需要一些管道来完成该任务。

我有一个名为Shuttle.Esb的开源服务总线,并且您可能希望考虑使用许多其他服务总线选项。

但是,如果您不想走那条路,您仍然可以查看一些代码和实现以获取一些想法。我有一个RabbitMQ实现可能会有所帮助。

答案 1 :(得分:0)

看看masstransit项目:http://masstransit-project.com/MassTransit/usage/message-consumers.html

它具有预取计数和并发限制之类的配置。它使您可以并行使用消息。

而且设置非常简单:

IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    IRabbitMqHost host = cfg.Host(new Uri(RabbitMQConstants.RabbitMQUri),
        hst =>
        {
            hst.Username(RabbitMQConstants.RabbitMQUserName);
            hst.Password(RabbitMQConstants.RabbitMQPassword);
        });

    cfg.ReceiveEndpoint(host,
        RabbitMQConstants.YourQueueName,
        endPointConfigurator => { 
            endPointConfigurator.Consumer<SomeConsumer>();
            endPointConfigurator.UseConcurrencyLimit(4);
        });
});

busControl.Start();

public class SomeConsumer :
    IConsumer<YourMessageClass>
{
    public async Task Consume(ConsumeContext<YourMessageClass> context)
    {
        await Console.Out.WriteLineAsync($"Message consumed: {context.Message.YourValue}");

    }
}