2012-08-19 9 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()); 

    } 

} 

Mam powyższy kod i jestem ciekawy bezpieczeństwa wątków.C# RabbitMQ Client thread safety

Nie jestem pewien, ale wyobrażam sobie, że ConnectionFactory jest bezpieczny dla wątków. Ale nie jestem pewien, czy IConnection jest bezpieczny dla wątków? Czy powinienem utworzyć połączenie na jedno żądanie? A może raczej jedno trwałe połączenie? A co z IChannel?

Czy powinienem przechowywać połączenie jako ThreadLocal? A może powinienem utworzyć połączenie na jedno żądanie?

+1

zobacz moją odpowiedź na to pytanie http://stackoverflow.com/questions/10407760/is-there-a-performance-difference-between-connections-or-channels-in-rab/10501593#10501593 – robthewolf

Odpowiedz

23

Połączenie jest bezpieczne dla wątków, IModel nie jest. Generalnie powinieneś starać się utrzymywać połączenie otwarte przez cały okres użytkowania aplikacji. Jest to szczególnie ważne, jeśli masz konsumentów, którzy potrzebują otwartego połączenia, aby otrzymywać wiadomości. Ważne jest wykrywanie i odzyskiwanie przerwanych połączeń, z powodu awarii sieci lub brokera. Poleciłbym przeczytać "RabbitMQ w akcji" autorstwa Videli i Williamsa, szczególnie rozdział 6 "Pisanie kodu, który przetrwał błąd".

Teraz za bezwstydną wtyczkę. Jestem autorem EasyNetQ, wysokiego poziomu API .NET dla RabbitMQ. Wykonuje on całe zarządzanie połączeniami i automatycznie ponownie łączy się i odbudowuje wszystkich subskrybentów w przypadku awarii sieci lub brokera. Zapewnia także wsparcie dla klastrów i fail-over po wyjęciu z pudełka. Spróbuj.

+11

" Niezwykle ostrożny "? Jakie to niejasne zagrożenie? EasyNetQ jest tutaj idealnie odpowiednią propozycją. Jeśli ludzie się nie zgadzają, właśnie do tego służy przycisk w dół. Jest mało prawdopodobne, że ta sugestia byłaby przedmiotem drugiej myśli, gdyby nie uczynił tego dzięki uprzejmości rezygnacji z autorstwa. Byłbym bardzo ostrożny, gdybyś jechał tak wysoko na swoim koniu. –