繁体   English   中英

当我有两个消费者线程运行时,为什么只有一个 RabbitMQ 消费者接收所有消息?

[英]Why is only one RabbitMQ consumer receiving all the messages when I have two consumer threads going?

我正在运行测试并试图让两个 RabbitMQ 消费者共享从队列中提取消息。 但是,每次我运行它时,只有一个订阅者/消费者处理所有消息。 为什么?

我有一个单独的进程,将 10 条示例消息放入队列。 我停止它,然后运行它。

class Program
{
    static void Main(string[] args)
    {
        Task task1 = Task.Factory.StartNew(() => RabbitReceiver.PullFromQueue(2000));
        Task task2 = Task.Factory.StartNew(() => RabbitReceiver.PullFromQueue(1000));
        Task.WaitAll(task1, task2);

        Console.WriteLine("Press any key to close.");
        Console.ReadKey();
    }
}

这是每个线程使用的消费者:

public static class RabbitReceiver
{
    public static void PullFromQueue(int sleepTimeInMilliseconds)
    {
        string hostName = "localhost";
        string queueName = "Sandbox.v1";

        var factory = new ConnectionFactory { HostName = hostName, UserName = "guest", Password = "guest", Port = 6003 };

        var connection = factory.CreateConnection();
        var channel = connection.CreateModel();

        var arguments = new Dictionary<string, object>();
        arguments.Add("x-message-ttl", 864000000); // Not sure why I have to specify this. Got an exception if I didn't.

        channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: arguments);

        var consumer = new EventingBasicConsumer(channel);

        consumer.Received += (model, eventArgs) =>
        {
            var body = eventArgs.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            Thread.Sleep(sleepTimeInMilliseconds);

            // This should probably go in a finally block.
            channel.BasicAck(eventArgs.DeliveryTag, false);
        };

        channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
    }
}

如果未设置BasicQos ,则会发生这种情况。 默认情况下,RabbitMQ 在消息进入队列时将所有消息分派给第一个消费者。 它不查看消费者未确认消息的数量。

您可以通过设置BasicQos来更改此行为,这控制了消费者在确认之前可以接收的消息数量。

channel.BasicQos(0, 1, false);

参考: https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM