![](/img/trans.png)
[英]Azure Service Bus Listener opening too many TCP connections (exhaustion)
[英]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.