C# RabbitMQ 客户端线程安全

标签 c# multithreading thread-safety 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 线程安全吗?我应该为每个请求创建一个连接吗?或者更确切地说是一个单一的持久连接?那么 channel (IModel) 呢?

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

最佳答案

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

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

关于C# RabbitMQ 客户端线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024241/

相关文章:

java - 标签位置的更改在线程 sleep 之前不会生效

c# - MVVM WPF BackgroundWorker 和 UI 更新

java - 如何使 setContentView() 在线程中正常工作?

c# - 线程同步c#

c# - 获取 3D 模型特定顶点可见时的屏幕空间坐标

ios - NSOperationQueue 的取消在 swift 中不起作用

android - AsyncTask 未在 UI 线程上更新

c# - Selenium C# 断言失败但有效

c# - 编码消息表资源

c# - “The name '来源' does not exist in the current context [Assembly-CSharp]”,