繁体   English   中英

Azure 服务总线的 ServiceBusClient - 重用 tcp 连接,如 HttpClientFactory

[英]ServiceBusClient for Azure Service Bus - reuse tcp connections like with HttpClientFactory

我有许多通过 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 的解决方案是 AddHttpClient 方法,由 .NET 为此提供。

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

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

编辑:

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

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

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

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

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

从这个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 .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM