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

    } 

} 

Tengo el código anterior, y tengo curiosidad acerca de la seguridad de los hilos.C# RabbitMQ Client thread safety

No estoy seguro, pero me imagino que ConnectionFactory es seguro para subprocesos. Pero entonces no estoy seguro de si IConnection es seguro para subprocesos? ¿Debo crear conexión por solicitud? ¿O más bien una única conexión persistente? ¿Y qué pasa con IChannel?

Además, ¿debo almacenar la conexión como ThreadLocal? ¿O debería crear una conexión por solicitud?

+1

ver mi respuesta a esta pregunta http://stackoverflow.com/questions/10407760/is-there-a-performance-difference-between-pooling-connections- or-channels-in-rab/10501593#10501593 – robthewolf

Respuesta

23

IConnection es seguro para subprocesos, IModel no lo es. En general, debe esforzarse por mantener una conexión abierta durante toda la vida de su aplicación. Esto es especialmente cierto si tiene consumidores que necesitan una conexión abierta para recibir mensajes. Es importante detectar y recuperar conexiones interrumpidas, ya sea debido a una falla de la red o del intermediario. Recomiendo leer 'RabbitMQ in Action' de Videla y Williams, especialmente el capítulo 6 'Escribir código que sobreviva al fracaso'.

Ahora para un enchufe desvergonzado. Soy el autor de EasyNetQ, una API .NET de alto nivel para RabbitMQ. Hace toda la administración de la conexión por usted y se volverá a conectar y reconstruir automáticamente a todos sus suscriptores si hay un corte en la red o en el intermediario. También proporciona soporte de clúster y fail-over fuera de la caja. Darle una oportunidad.

+11

" Extremadamente cuidadoso "? ¿Qué tipo de amenaza vaga es eso? EasyNetQ es una sugerencia perfectamente apropiada aquí. Si la gente no está de acuerdo, para eso es el botón de abajo. Es poco probable que la sugerencia haya tenido un segundo pensamiento si él no hubiera hecho la cortesía de negar su autoría. Sería extremadamente cuidadoso de montar tan alto en tu caballo. –