Azure ServiceBusConnection应该是单例吗?

时间:2018-07-24 14:02:34

标签: azure azureservicebus

NuGet中,保留MessagingFactory实例是一种很好的做法。

我们是否应该保留ServiceBusConnection的单个实例(来自 new Nuget)以注入到多个客户端中?

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

  • 更加清楚地表明ServiceBusConnection来自新的NuGet。

2 个答案:

答案 0 :(得分:1)

Azure Service Bus .NET Standard客户端连接无法通过QueueClient或任何工厂(如以前的工厂)进行管理。 QueueClient是在MessageSenderMessageReceiver之上的抽象,可以采用多个发送者/接收者共享的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"));

根据您使用的名称空间层,您必须进行基准测试,看看哪种方法更适合您。我的发现表明,标准层具有多个连接有助于提高吞吐量,而高级层则不能。 This post暗示了这样做的原因。

答案 1 :(得分:0)

不一定是所有人。

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

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

From the documentation

  

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

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

https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements#reusing-factories-and-clients