Проблемы с производительностью у нескольких потребителей RabbitMq - PullRequest
0 голосов
/ 27 мая 2019

Я создаю Службу Windows на C #, которая подключается к RabbitMq и извлекает сообщения для обработки.Он предназначен для многопоточности, и я настроил его так, чтобы с помощью конфигурации вы могли указать свойства соединения RabbitMq, очереди для подключения, сообщения для получения и т. Д.

Пока он работаетотличный.Я запускаю один поток, подключенный к одной очереди, и он обрабатывает 500+ сообщений в секунду.

Сегодня вечером я попытался добавить еще одну очередь для обработки, и я заметил, что скорость обработки сообщений значительно упала (додо 50 сообщений в секунду).

Мое приложение считывает файл конфигурации, в котором указывается, каких рабочих нужно запускать.Каждый работник должен быть в своем собственном потоке и запускаться через Task.Factory.StartNew ().

Каждый работник имеет свои собственные IConnection, IConnectionFactory и Channel, который подключается к RabbitMq.

Нижеэто пример кода от моего работника.У него есть метод для установления соединения.Вы заметите, что он создает соединение с серверами RabbitMq, а затем устанавливает соединение с очередью.

public class Worker
{
    private readonly IConnectionFactory _connectionFactory;
    private IConnection _connection;
    private IModel _channel;

    public void EstablishConnection()
    {
     if (_connection == null)
                    {
                        _connection = _connectionFactory.CreateConnection();
                        _connection.ConnectionBlocked += ConnectionBlocked;
                        _connection.ConnectionUnblocked += ConnectionUnblocked;
                        _connection.ConnectionRecoveryError += ConnectionRecoveryError;
                        _connection.RecoverySucceeded += RecoverySucceeded;
                    }

                    _channel = _connection.CreateModel();
                    _channel.BasicQos((ushort)_configuration.PrefetchSize, (ushort)_configuration.PrefetchCount, false);

                    _consumer = new EventingBasicConsumer(_channel);
                    _consumer.Received += MessageReceived;
    }
}

Когда выполняется только одно из них, он может обрабатывать 500+ сообщений в секунду.Но когда я запускаю двух рабочих, подключенных к разным очередям в разных потоках, он обрабатывает только 50 сообщений в секунду.

Что также интересно, так это то, что в моих тестах вторая очередь, которую я слушаю, пуста.В этом нет ничего.

Я ожидаю, что он будет запускать 500+ сообщений в каждом потоке.Или, по крайней мере, 250 сообщений в каждом потоке.

Насколько я понимаю, каналы не являются поточно-ориентированными, и у нас должен быть отдельный канал в каждом потоке.Но мы должны иметь только одно соединение на приложение?У проблемы есть отдельное соединение для потока?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...