Я создаю Службу 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 сообщений в каждом потоке.
Насколько я понимаю, каналы не являются поточно-ориентированными, и у нас должен быть отдельный канал в каждом потоке.Но мы должны иметь только одно соединение на приложение?У проблемы есть отдельное соединение для потока?