C# - RabbitMQ-Client thread-Sicherheit
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 code oben, und ich bin neugierig, um die thread-Sicherheit.
Ich bin mir nicht sicher, aber ich könnte mir vorstellen ConnectionFactory
ist thread-sicher. Aber dann bin ich nicht sicher, ob IConnection
ist thread-sicher? Sollte ich Verbindung pro Anfrage? Oder eher eine persistent-Verbindung? Und was ist mit IChannel
?
Außerdem Lagere ich die Verbindung als ThreadLocal? Oder sollte ich eine Verbindung pro Anfrage?
- siehe meine Antwort auf diese Frage stackoverflow.com/questions/10407760/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
IConnection ist thread-sicher, IModel nicht. Generell sollten Sie sich bemühen, eine Verbindung zu öffnen für die Lebensdauer der Anwendung. Dies gilt insbesondere, wenn Sie die Verbraucher müssen eine Verbindung öffnen, um Nachrichten zu empfangen. Es ist wichtig zu erkennen und die Wiederherstellung von unterbrochenen verbindungen, die entweder aufgrund eines Netzwerk-oder Broker-Fehler. Ich würde empfehlen zu Lesen "RabbitMQ in Action', die von Videla und Williams, vor allem Kapitel 6', code zu Schreiben, der überlebt, Versagen'.
Nun für eine schamlose. Ich bin der Autor von EasyNetQ, ein high-level .NET-API für RabbitMQ. Es macht die ganze connection-management für Sie und wird automatisch wieder anschließen und alles neu erstellen Sie Ihre Abonnenten, ob es sich um ein Netzwerk-oder broker-Ausfall. Es bietet auch die cluster-und Failover-Unterstützung out of the box. Probieren Sie es aus.