Безопасность С# RabbitMQ

ConnectionFactory factory = new ConnectionFactory {HostName = "localhost"};

using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
    channel.QueueDeclare("hello", false, false, false, null);
    for (int i = 0; i < 100000; i++)
    {
        MemoryStream stream = new MemoryStream();

        var user = new User 
                       {
                           Id = i
                       };

        Serializer.Serialize(stream, user);


        channel.BasicPublish("", "hello", null, stream.ToArray());

    }

}

У меня есть код выше, и мне интересно знать безопасность потоков.

Я не уверен, но я бы предположил, что ConnectionFactory является потокобезопасным. Но тогда я не уверен, что IConnection является потокобезопасным? Должен ли я создавать соединение по запросу? Или, скорее, одно постоянное соединение? А как насчет IChannel?

Кроме того, следует ли хранить соединение как ThreadLocal? Или мне нужно создать соединение для запроса?

Ответ 1

IConnection является потокобезопасным, IModel - нет. Как правило, вы должны стараться поддерживать соединение открытым на всю жизнь своего приложения. Это особенно актуально, если у вас есть потребители, которым требуется открытое соединение для приема сообщений. Важно обнаруживать и восстанавливать прерванные соединения из-за сбоя сети или Брокера. Я бы рекомендовал прочитать "RabbitMQ in Action" Видела и Уильямса, особенно глава 6 "Написание кода, который переживает неудачу".

Теперь для бесстыдной пробки. Я являюсь автором EasyNetQ, высокоуровневого .NET API для RabbitMQ. Он выполняет все управление подключением для вас и автоматически будет подключаться и восстанавливать всех ваших подписчиков, если произойдет сбой сети или брокера. Он также обеспечивает поддержку кластера и отказоустойчивости из коробки. Попробуйте.