0

我有许多通过 HTTP 调用(.NET 5)相互通信的 CRUD API
为避免打开过多的 tcp 连接,我在所有这些服务中通过 DI使用HttpClientFactory 。这很好用,我没有遇到太多通过 HTTP 打开的连接。

但我的 Azure 应用服务仍然抱怨 SNAT 连接太多:

在此处输入图像描述

我猜原因是 Azure 服务总线。我的 API 的每次调用都会将事件写入总线。
为此,我在每次调用时创建一个新实例:

            await using (ServiceBusClient client = new ServiceBusClient(_serviceBusConnectionString))
                {
                    var messageObject = new { message.Name, message.Body };
                    var messageJson = JsonConvert.SerializeObject(messageObject);
                    ServiceBusSender sender = client.CreateSender(_topicName);
                    await sender.SendMessageAsync(new ServiceBusMessage(messageJson));
                }

许多开发人员都在使用这样的 HttpClient(这是个坏主意,请阅读上面的文章中的原因)。HttpClient 的解决方案是 .NET 为此目的提供的 AddHttpClient 方法。

但是 Azure 服务总线呢?没有什么像 AzureServiceBusFactory 这样的东西,将 AzureServiceBus 添加为 Singleton 并不是一个好主意,因为每次调用的配置都应该不同。

如何确保连接池也可用于 Azure 服务总线连接?有没有我错过的最佳实践?还是您认为连接问题有其他原因?

编辑:

公认的答案是正确的。这工作正常,我的错误消失了。只需使用以下内容添加服务总线客户端:

            services.AddAzureClients(cfg =>
            {
                cfg.AddServiceBusClient("your-connection-string");
            });

在此之后,您可以在所有服务中通过 DI 轻松获取客户端。

4

1 回答 1

4

但是 Azure 服务总线呢?没有什么像 AzureServiceBusFactory 这样的东西,将 AzureServiceBus 添加为 Singleton 并不是一个好主意,因为每次调用的配置都应该不同。

它实际上是相反的。服务总线团队建议您的服务总线连接应注册为仅使用单例ServiceBusClientBuilderExtensions,并且不应在每次操作后关闭或处置。

从此link

与服务交互的服务总线对象,例如 ServiceBusClient、ServiceBusSender、ServiceBusReceiver 和 ServiceBusProcessor,应注册为单例(或实例化一次并共享)以进行依赖注入。可以使用 ServiceBusClientBuilderExtensions 注册 ServiceBusClient 以进行依赖注入。

我们建议您不要在发送或接收每条消息后关闭或处置这些对象。关闭或处置特定于实体的对象(ServiceBusSender/Receiver/Processor)会导致断开与服务总线服务的链接。释放 ServiceBusClient 会导致断开与 Service Bus 服务的连接。

请参阅此链接以获取服务总线团队的完整建议:https ://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk- 2 .

于 2021-05-15T12:48:54.727 回答