Клиент RabbitMQ .NET CreateConnection иногда работает медленно после первого вызова, при этом уже слушая сообщения - PullRequest
0 голосов
/ 20 марта 2019

Я использую пакет NuGet RabbitMQ.Client 5.1.0 в приложении .NET Core 2.1. Он открывает несколько подключений к одному серверу RabbitMQ для прослушивания сообщений в очереди. Я обнаружил, что первый вызов ConnectionFactory.CreateConnection() всегда быстрый (100 мс или около того), но последующие вызовы, сделанные уже во время прослушивания, иногда могут занимать 3-10 секунд.

Простой код для воспроизведения проблемы:

        for (var i = 1; i <= 10; ++i)
        {
            var factory = new ConnectionFactory
            {
                HostName = hostName,
                UserName = userName,
                Password = password
            };

            var stopwatch = Stopwatch.StartNew();
            var connection = factory.CreateConnection();
            Console.WriteLine($"[{i}] CreateConnection took {stopwatch.ElapsedMilliseconds:N0} ms");

            var channel = connection.CreateModel();
            channel.BasicQos(0, 200, false);

            var consumer = new EventingBasicConsumer(channel);

            channel.BasicConsume(queueName, false, consumer);
        }

(Реальное приложение запускает каждое соединение в отдельном потоке, но, похоже, это не имеет значения.)

Типичная мощность:

[1] CreateConnection took 109 ms
[2] CreateConnection took 38 ms
[3] CreateConnection took 61 ms
[4] CreateConnection took 362 ms
[5] CreateConnection took 390 ms
[6] CreateConnection took 1,261 ms
[7] CreateConnection took 3,043 ms
[8] CreateConnection took 1,047 ms
[9] CreateConnection took 381 ms
[10] CreateConnection took 376 ms

Я что-то не так делаю или это похоже на проблему с клиентской библиотекой RabbitMQ?

1 Ответ

0 голосов
/ 20 марта 2019

Обратите внимание, что создание соединения не является бесплатным и может зависеть от нагрузки на ваши серверы, а также в сети. Необходимо установить сокет TCP и завершить квитирование AMQP. Я предлагаю сделать захват пакета, чтобы подтвердить время создания и сопоставить их с настройкой соединения TCP.

Это может не иметь значения, но все примеры класса Stopwatch, которые я вижу, вызывают метод Stop перед чтением свойств из текущего экземпляра.


ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы по StackOverflow.

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