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

    } 

} 

Ich habe den obigen Code, und ich bin neugierig auf Thread Sicherheit.C# RabbitMQ Client Thread Sicherheit

Ich bin mir nicht sicher, aber ich würde mir vorstellen ConnectionFactory ist Thread sicher. Aber dann bin ich mir nicht sicher, ob IConnection Thread sicher ist? Sollte ich eine Verbindung pro Anfrage erstellen? Oder eher eine einzige dauerhafte Verbindung? Und was ist mit IChannel?

Soll ich die Verbindung auch als ThreadLocal speichern? Oder sollte ich eine Verbindung pro Anfrage erstellen?

+1

siehe meine Antwort auf diese Frage http://stackoverflow.com/questions/10407760/is-there-a-performance-difference-between-pooling-connections-or-channel-in-rab/10501593#10501593 – robthewolf

Antwort

23

IConnection ist threadsicher, IModel nicht. Generell sollten Sie sich bemühen, eine Verbindung für die Dauer Ihrer Bewerbung offen zu halten. Dies gilt insbesondere, wenn Sie Verbraucher haben, die eine offene Verbindung benötigen, um Nachrichten zu empfangen. Es ist wichtig, unterbrochene Verbindungen entweder aufgrund eines Netzwerk- oder Brokerfehlers zu erkennen und wiederherzustellen. Ich empfehle das Lesen von "RabbitMQ in Action" von Videla und Williams, insbesondere Kapitel 6 "Code schreiben, der Fehler überlebt".

Jetzt für einen schamlosen Stecker. Ich bin der Autor von EasyNetQ, eine High-Level-.NET-API für RabbitMQ. Es übernimmt die gesamte Verbindungsverwaltung für Sie und stellt automatisch alle Ihre Abonnenten wieder her und baut sie neu auf, wenn ein Netzwerk- oder Brokerausfall auftritt. Es bietet auch Cluster- und Failover-Unterstützung. Versuche es.

+11

" Äußerst vorsichtig "? Was für eine vage Bedrohung ist das? EasyNetQ ist hier ein vollkommen geeigneter Vorschlag. Wenn die Leute nicht einverstanden sind, ist das die Schaltfläche für den Downvote. Es ist unwahrscheinlich, dass der Vorschlag einen zweiten Gedanken bekommen hätte, hätte er nicht auch die Höflichkeit getan, seine Urheberschaft abzulehnen. Ich wäre sehr vorsichtig, wenn ich so hoch auf deinem Pferd reiten würde. –