Производительность RabbitMQ с несколькими потребителями

#c# #asp.net #rabbitmq

#c# #asp.net #rabbitmq

Вопрос:

Я разрабатываю метод использования очереди и тестирую производительность с несколькими потребителями.

В исследованиях рекомендуется увеличивать потребителей, чтобы увеличить пропускную способность очереди.

Я выполнил следующие тесты.

Очередь только с 1 потребителем, вот где я видел самую высокую скорость передачи.

В очереди с 1 каналом и более чем 5 потребителями скорость захвата упала.

Очередь с 1 потребителем на канал, тот же результат, что и раньше.

Я работаю только с 1 работником, чтобы создать все экземпляры потребителей, следует ли использовать более одного работника для каждого потребителя, чтобы обеспечить производительность?

Есть ли у вас подходящая конфигурация для повышения производительности нескольких потребителей?

Следуйте моему методу

  public Task ConsumerRabbitMQAsync<T>(string queeue, int consumerNumber)
        {
            var manualResetEvent = new ManualResetEvent(false);
            manualResetEvent.Reset();

            try
            {
                CreateConnection();
               

                for (int i = 0; i < consumerNumber; i  )
                {
                    var channel = _connection.CreateModel();

                    channel.QueueDeclare(queue: queeue,
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);


                    ConsumerQueeueAsync<T>(queeue, channel);
                }

                manualResetEvent.WaitOne();

            }
            catch (Exception)
            {
                throw;
            }

            return Task.CompletedTask;
        }

        private async void ConsumerQueeueAsync<T>(string queeue, IModel channel)
        {
            var consumer = new AsyncEventingBasicConsumer(channel);

            consumer.Received  = async (model, ea) =>
            {
                try
                {
                    var body = ea.Body;

                    var message = Encoding.UTF8.GetString(body.Span);

                    SendMessage<T>(message);

                    channel.BasicAck(ea.DeliveryTag, false);

                    await Task.Yield();

                }
                catch (Exception ex)
                {
                    channel.BasicNack(ea.DeliveryTag, false, true);
                }
            };

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

        }
  

Комментарии:

1. Почему вы объявляете consumerNumber количество одной и той же очереди?

2. Я делаю for с количеством потребителей, о которых сообщается в вызове метода, и создаю их в этом for