C# RabbitMQ客户端线程安全

问题描述 投票:12回答:1
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 线程安全吗?我应该为每个请求创建一个连接吗?或者说是一个单一的持久连接?那通道(IModel)?

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

c# multithreading thread-safety rabbitmq
1个回答
35
投票

IConnection是线程安全的,IModel不是。一般来说,你应该努力在你的应用程序的生命周期内保持一个连接的开放。如果你的消费者需要一个开放的连接来接收消息,这一点尤其正确。检测和恢复因网络或Broker故障而中断的连接非常重要。我建议阅读 Videla 和 Williams 所著的 "RabbitMQ in Action",尤其是第 6 章 "编写可避免故障的代码"。

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

© www.soinside.com 2019 - 2024. All rights reserved.