只有一个消费者从 RabbitMQ 上的队列接收消息

蒙蒂

我创建了一个小演示来展示 RabbitMQ 基础知识。不幸的是,它没有按预期工作,有两个问题。我正在使用 .NET Core 3.1 和 RabbitMQ.Client 6.2.2

我创建了从任务队列接收消息的 Employee 类。第一个员工工作得很好,但如果我雇用更多员工,他们就无法工作(不接收消息)。我不明白为什么会这样。

如果我在队列中有很多消息(在启动第二个员工之前),我会看到任务队列中的所有消息在第二个启动时都得到确认,然后在很短的时间后它们再次变为未确认。有点奇怪。

但主要是:为什么其他员工不工作?

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading;

namespace DemoTasks.Employee
{

  class Employee
  {
    static void Main(string[] args)
    {

      string clientName = "Employee-" + Guid.NewGuid().ToString();

      Console.Title = clientName;
      Console.WriteLine("Moin moin");

      IConnectionFactory connectionFactory = new ConnectionFactory
      {
        HostName            = "localhost",
        Port                = 5672,
        VirtualHost         = "/",
        UserName            = "user",
        Password            = "password",
        ClientProvidedName  = clientName
      };

      using (IConnection connection = connectionFactory.CreateConnection(clientName))
      {
        using (IModel model = connection.CreateModel())
        {

          model.ExchangeDeclare("jobs", "fanout", false, false, null);
          model.QueueDeclare("tasks", true, false, false);
          model.QueueBind("tasks", "jobs", "", null);

          EventingBasicConsumer consumer = new EventingBasicConsumer(model);
          consumer.Received += OnWorkReceived;

          model.BasicConsume("tasks", false, clientName + ":OnWorkReceived", consumer);

          Console.ReadLine();

          model.Close();
        }
        connection.Close();
      }

      Console.WriteLine("Wochenende ... woooh !!!");
    } 

    private static void OnWorkReceived(object sender, BasicDeliverEventArgs e)
    {

      EventingBasicConsumer consumer = (EventingBasicConsumer)sender;
      IModel model  = consumer.Model;

      string task = Encoding.UTF8.GetString(e.Body.ToArray());

      Console.Write("working on: " + task + " ... ");

      Thread.Sleep(5000);

      Console.WriteLine("done!");
              
      model.BasicAck(e.DeliveryTag, false);
    }

  } 

}
赛义德·埃斯梅里内贾德

我认为你的问题是关于PrefetchCount在你的频道上设置它是关于一个消费者可以从兔子那里获得多少消息并将它们缓存在自己身上以处理它们。

如果不设置,一个消费者可以消费队列中的所有消息,而没有时间获取其他消费者的消息,因此您可以使用channel.basicQos(1)进行设置basicqos(0,1,false)通过这个设置,每个消费者在向兔子发送确认后可以获得一条消息,然后可以得到另一条消息。

当将预取计数设置为较低的数字时,可能会影响性能,因为您的消费者必须更多地询问兔子才能获取消息。

有关详细信息,请参阅:https : //www.rabbitmq.com/consumer-prefetch.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

RabbitMQ / AMQP设计:如何让一个消费者处理一些消息,但观察所有消费者呢?

一个队列上的多个消费者 RabbitMQ - Java

如何确保只有一个消费者实际消费了已发布的消息?

如何在rabbitMQ上向所有订阅主题队列的消费者推送消息,并在所有参与者都收到消息后确认消费

RabbitMQ - 在没有任何消费者的队列上删除了未确认的消息

RabbitMQ要求另一个消费者

当 RabbitMQ 中有其他消费者可用时,消息堆积在消费者身上 - 使用 bunny for rails

有没有办法限制RabbitMQ队列上的消费者数量?

即使消息存在于消费者端的rabbitmq 队列中,也会获得 NULL

Camel-rabbitmq:在单个骆驼消费者中从多个Rabbitmq队列中消费

Kafka - 确保至少有一个消费者会收到消息

rabbitmq:消费者能否在nack之前保持消息更改?

在RabbitMQ中确认消费者的剩余消息

RabbitMQ如何向消费者发送消息?

RabbitMQ向每个消费者发送相同的消息

优先处理RabbitMQ消费者消息的使用

停止RabbitMQ消费者进程当前消息

RabbitMQ 竞争消费者一次按顺序处理 1 条消息

RabbitMQ - 将数据发送给另一个消费者

RabbitMQ:在发布/订阅中,消费者是在队列中轮询新消息还是服务器推送消息?

Kafka是消息消费者以及流拓扑的同一个消费者组

将消息从 RabbitMQ 分发给在 Heroku dynos 上运行的消费者作为“循环”

如何使用 pika 消费来自 RabbitMQ 队列的所有消息

Springboot kafka消费者没有收到消息,另一个已经收到消息

RabbitMQ-如何以编程方式从消息队列接收消息?

一个队列可以将消息传递给多个消费者在扇出交换中吗?

一个队列可以将消息传递给多个消费者在扇出交换中吗?

Celery 在 RabbitMQ 消息队列中创建 3 个队列

尽管队列中有消息,Rabbitmq 队列为空