2012-08-19 4 views
10
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()); 

    } 

} 

У меня есть код, приведенный выше, и мне любопытно узнать о безопасности потоков.C# RabbitMQ Безопасность потока клиентов

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

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

+1

см. Мой ответ на этот вопрос http://stackoverflow.com/questions/10407760/is-there-a-performance-difference-between-pooling-connections-or-channels-in-rab/10501593#10501593 – robthewolf

ответ

23

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

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

+11

" Чрезвычайно осторожно "? Что это за смутная угроза? EasyNetQ - это совершенно подходящее предложение. Если люди не согласны, для этого используется кнопка downvote. Маловероятно, что это предложение было бы дано второй мыслью, если бы он не сделал любезности, отказавшись от своего авторства. Я был бы очень осторожен в том, чтобы ехать так высоко на вашей лошади. –

Смежные вопросы