Azure 服务总线的 ServiceBusClient - 像使用 HttpClientFactory 一样重用 tcp 连接
ServiceBusClient for Azure Service Bus - reuse tcp connections like with HttpClientFactory
我有许多 CRUD API,它们通过 HTTP 调用 (.NET 5) 相互通信
为了避免打开太多的 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 获取客户端。
But what about Azure Service Bus? There is nothing like an
AzureServiceBusFactory or so and adding the AzureServiceBus as a
Singleton would not be a good idea, because the configuration should
be different on each call.
其实恰恰相反。服务总线团队建议仅使用 ServiceBusClientBuilderExtensions
将与您的服务总线的连接注册为单例,并且不应在每次操作后关闭或处置。
从这个link
:
The Service Bus objects that interact with the service, such as
ServiceBusClient, ServiceBusSender, ServiceBusReceiver, and
ServiceBusProcessor, should be registered for dependency injection as
singletons (or instantiated once and shared). ServiceBusClient can be
registered for dependency injection with the
ServiceBusClientBuilderExtensions.
We recommend that you don't close or dispose these objects after
sending or receiving each message. Closing or disposing the
entity-specific objects (ServiceBusSender/Receiver/Processor) results
in tearing down the link to the Service Bus service. Disposing the
ServiceBusClient results in tearing down the connection to the Service
Bus service.
请参阅此 link 以获得服务总线团队的完整建议:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk-2。
我有许多 CRUD API,它们通过 HTTP 调用 (.NET 5) 相互通信
为了避免打开太多的 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 获取客户端。
But what about Azure Service Bus? There is nothing like an AzureServiceBusFactory or so and adding the AzureServiceBus as a Singleton would not be a good idea, because the configuration should be different on each call.
其实恰恰相反。服务总线团队建议仅使用 ServiceBusClientBuilderExtensions
将与您的服务总线的连接注册为单例,并且不应在每次操作后关闭或处置。
从这个link
:
The Service Bus objects that interact with the service, such as ServiceBusClient, ServiceBusSender, ServiceBusReceiver, and ServiceBusProcessor, should be registered for dependency injection as singletons (or instantiated once and shared). ServiceBusClient can be registered for dependency injection with the ServiceBusClientBuilderExtensions.
We recommend that you don't close or dispose these objects after sending or receiving each message. Closing or disposing the entity-specific objects (ServiceBusSender/Receiver/Processor) results in tearing down the link to the Service Bus service. Disposing the ServiceBusClient results in tearing down the connection to the Service Bus service.
请参阅此 link 以获得服务总线团队的完整建议:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk-2。