C#RabbitMQ客户端线程安全

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()); } } 

我有上面的代码,我对线程安全感到好奇。

我不确定,但我认为ConnectionFactory是线程安全的。 但是我不确定IConnection是否是线程安全的? 我应该为每个请求创建连接吗? 或者说是一个持久的连接? 那么IChannel呢?

另外,我应该将连接存储为ThreadLocal吗? 或者我应该为每个请求创建一个连接?

IConnection是线程安全的,IModel不是。 通常,您应该努力在应用程序的生命周期内保持连接打开。 如果您的消费者需要打开连接才能接收消息,则尤其如此。 由于网络或代理故障,检测中断连接并从中恢复非常重要。 我建议阅读Videla和Williams的’RabbitMQ in Action’,特别是第6章’编写能够幸免于难的代码’。

现在是一个无耻的插头。 我是EasyNetQ的作者, EasyNetQ是RabbitMQ的高级.NET API。 它为您完成所有连接管理,并在网络或代理中断时自动重新连接并重建所有订户。 它还提供开箱即用的集群和故障转移支持。 试试看。