为我发送的每条消息创建EventHubClient是否正确?
本文关键字:EventHubClient 创建 是否 消息 | 更新日期: 2023-09-27 18:14:29
我正在创建一个EventHub客户端应用程序,它将消息发送到Azure上的事件中心。现在,当我有一个消息要发送(每5-6秒),我创建类EventHubClient的一个新实例,然后我用它来发送数据:
public async static void SendListOfMeasurements(string eventHubName, string connectionString, List<Measurement> measurementsList, int maxMessageSize)
{
// Create EventHubClient
EventHubClient client = EventHubClient.CreateFromConnectionString(
connectionString,
eventHubName);
...
这是一个好的做法吗?或者最好只在启动时创建它,然后只使用。send方法?就性能而言,最佳方案是什么?将来发送的数量可能会增加,消息的数量也会增加
直接使用EventHubClient.CreateFromConnectionString(…)创建客户端将为每个客户端创建一个新的tcp连接。但是,当使用共享MessagingFactory
创建客户端时var factory = MessagingFactory.CreateFromConnectionString("your_connection_string");
var client = factory.CreateEventHubClient("MyEventHub");
客户端将重用底层TCP连接。从文档中:创建Event Hubs客户端
不,只在第一次使用MessageFactory创建一个新的EventHubClient是必要的。如果我为我发送的每条消息创建一个客户端,那么一个新的连接被创建,旧的连接保持打开状态(使用netstat检查),导致很多"established"连接。
使用为第一条消息创建的单个客户端,然后为其他消息回收客户端,如果internet连接丢失然后返回,tcp连接将自动重新创建
下面是一个使用factory创建客户端的示例:
var endpointUri = ServiceBusEnvironment.CreateServiceUri("sb", eventHubNamespace, string.Empty);
MessagingFactory factory = MessagingFactory.Create(endpointUri, new MessagingFactorySettings
{
TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sasToken),
TransportType = TransportType.Amqp
});
factory.RetryPolicy = new RetryExponential(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(30), 3);
client = factory.CreateEventHubClient(eventHubName);
是的,这是正确的,您可以每次创建一个新的EventHubClient
,这将是好的。
在内部,如果连接字符串相同,则重用相同的底层TCP连接。EventHubClient
缓存MessageFactory.Create(...)
方法的结果