.NET在Web应用程序中在何处启动RabbitMQ客户端连接

我正在.NET Framework Web应用程序中实现RabbitMQ客户端总线类。

该类非常基础,就像这样:

public class RabbitConnection
{
    private readonly IConnection conn;

    public RabbitConnection() {
        try {
         var factory = new ConnectionFactory() {...}
         this.conn = factory.CreateConnection();
        }
        catch {
         ...
        }
    }

    public void Publish<T>(T @event) where T : class {
        using (var channel = conn.CreateModel()) {
            ...
        }
    }
    ...
}

我已经读过,开始和关闭RabbitMQ的连接成本很高,您应该保持连接状态。

我的问题是,在整个应用程序中使用此连接的最佳方法是什么?单身人士班吗?静态的?另一种方式?

谢谢!

zwn_annan 回答:.NET在Web应用程序中在何处启动RabbitMQ客户端连接

您已经注意到:

  

我已阅读到与RabbitMQ的启动和关闭连接是   费用很高,您应该保持连接状态。

RabbitMq使用AMQP协议。通过为所有线程使用一个相同的TCP连接来提高性能,它克服了您提到的困难。 AMQP可以通过使用channels来做到这一点。这些通道是“真实” TCP连接内部的虚拟连接,并且在您发出AMQP命令的通道上。 随着每个线程旋转,它将在现有连接上创建一个通道,并获得其自己的私有通信路径以代理,而不会在操作系统的TCP堆栈上增加任何负载。 (有关更多详细信息,请检查my answer

因此,正确的做法是创建连接的成本很高,这就是为什么您需要一个连接以及在该连接内部创建的每个线程需要多个通道的原因。

  

我的问题是,这是在   整个应用程序?单身人士班吗?静态的?另一种方式?

最好在应用程序的生存期内使用该类的单个实例。只需使用一些DI框架来管理在该生命周期内必须创建的实例数。

我更喜欢添加一种初始化连接的方法。创建该类的实例时必须调用该方法。

为了线程安全,您必须从该连接创建新通道。

也不要忘记实现IDisposable接口并同时处置connection

因此总体设计将如此:

public interface IRabbitMqPublisher
{    
      void Init();
      void Publish();
}

public class RabbitMqPublisher: IDisposable,IRabbitMqPublisher
{
      private readonly IConnection conn;

      public void Init();
      public void Publish();

      public void Dispose();
}

并且从IOC容器(例如Autofac):

builder.RegisterType<IRabbitMqPublisher>()
   .As<RabbitMqPublisher>()
   .OnActivating(e => e.Instance.Init())
   .SingleInstance();

顺便说一句,Autofac(我想还有其他容器)将在每个生存期范围的结尾自动执行Dispose方法。

,

总结其他答案并对此添加一些其他想法:

  1. 创建一个类来包装与RabbitMQ的连接。然后,该类可能会处理诸如连接关闭等问题,并成为应用程序中自动重新连接的单点。

  2. 创建此类的单个实例。我不建议使用单例模式,因为它会导致测试不灵活(请参阅下面的#3)。

  3. 使用依赖项注入框架(.Net Core MVC内置一个)在需要的地方注入连接包装类。这样,与使用单例相比,将更容易支持单元测试。

本文链接:https://www.f2er.com/3142830.html

大家都在问