Azure ServiceBusConnection应该是单例的吗?

Azure ServiceBusConnection应该是单例的吗?,azure,azureservicebus,Azure,Azureservicebus,在oldNuGet中,保留MessagingFactory实例是一个很好的实践 我们是否应该保留一个ServiceBusConnection(来自newNuget)的实例以注入多个客户端 编辑2018-07-25 00:22:00 UTC+8: 更清楚地说明ServiceBusConnection来自新的NuGet 不一定是所有人的独生子女 正确的粒度级别是消息传递工厂。您可以连接到应用程序中的多个名称空间,每个名称空间都需要自己的和连接 或者,您可能有本质上不太异步的代码,在这种情况下,多个

oldNuGet中,保留
MessagingFactory
实例是一个很好的实践

我们是否应该保留一个
ServiceBusConnection
(来自newNuget)的实例以注入多个客户端

编辑2018-07-25 00:22:00 UTC+8:

  • 更清楚地说明ServiceBusConnection来自新的NuGet

    • 不一定是所有人的独生子女

      正确的粒度级别是消息传递工厂。您可以连接到应用程序中的多个名称空间,每个名称空间都需要自己的和连接

      或者,您可能有本质上不太异步的代码,在这种情况下,多个连接(工厂)是有意义的。例如,您的代码中有两个进程,一个在循环中执行大量工作以发送消息,另一个接收消息,在这种情况下,两个工厂可能很有用,或者您可以重构以使代码更加异步

      建议您不要关闭消息传递工厂或队列, 主题和订阅客户端发送消息后,然后 在发送下一条消息时重新创建它们。关闭消息传递 工厂删除与服务总线服务的连接

      简言之,您应该重新使用消息工厂,然后这些工厂将保持与服务总线的连接。根据代码的编写方式,您可能希望有多个工厂


      Azure Service Bus.NET标准客户端连接不通过
      QueueClient
      或任何工厂进行管理,就像它的前身一样
      QueueClient
      MessageSender
      MessageReceiver
      之上的一个抽象,它可以接受由多个发送者/接收者共享的
      ServiceBusConnection
      。您可以自由选择是否共享同一连接对象

      var connection = new ServiceBusConnection(connectionString);
      var queueClient1 = new QueueClient(connection, "queue1", ReceiveMode.PeekLock, RetryPolicy.Default);
      var queueClient2 = new QueueClient(connection, "queue2", ReceiveMode.PeekLock, RetryPolicy.Default);
      // Queue clients share the same connection
      var message1 = new Message(Encoding.UTF8.GetBytes("Message1"));
      var message2 = new Message(Encoding.UTF8.GetBytes("Message2"));
      

      根据您正在使用的名称空间层,您必须对其进行基准测试,并查看哪些更适合您。我的发现表明,标准层有多个连接有助于提高吞吐量,而高级层则没有。提示原因。

      谢谢回复。我确实查阅了这个最佳实践文档。但是,MessageFactory是旧库(Microsoft.ServiceBus)的一部分,文档的其余部分也指向旧库。新库(Microsoft.Azure.ServiceBus)中不存在工厂。客户端现在接受连接字符串或ServiceBusConnection实例,这就是我的问题。对于3.0库,它似乎都是通过QueueClient管理的,每个队列一个,因此我将使用该粒度级别作为参考。如果您需要持续发送和/或接收消息,那么我将创建一个客户机,并使用一个防护装置使其保持打开状态,以便在其关闭/失败时重新连接。如果您需要执行一些操作,然后执行一些其他长时间运行的代码,我会创建一个客户机,完成工作,然后关闭它,直到需要下一个“批处理”。