为我发送的每条消息创建 EventHubClient 是否正确?

Is it correct to create EventHubClient for every message I send?

我正在创建一个 EventHub 客户端应用程序,用于将消息发送到 Azure 上的事件中心。 现在,当我有一条消息要发送(每 5-6 秒)时,我创建了一个 class 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,这样就可以了。

在内部,如果连接字符串相同,它会重用相同的底层 TCP 连接。 EventHubClient 缓存其使用的 MessageFactory.Create(...) 方法的结果。

不,只有第一次需要使用 MessageFactory 创建一个新的 EventHubClient。 如果我为发送的每条消息创建一个客户端,则会创建一个新连接,而旧连接保持打开状态(使用 netstat 检查),从而导致大量 "ESTABILISHED" 个连接。

使用为第一条消息创建的单个客户端,然后为其他消息回收客户端,如果互联网连接丢失然后恢复,则自动重新创建 tcp 连接。

这是使用工厂创建客户端的示例:

            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.CreateFromConnectionString(...) 创建客户端将为每个客户端创建一个新的 tcp 连接。 但是,在使用共享 MessagingFactory

创建客户端时
var factory = MessagingFactory.CreateFromConnectionString("your_connection_string");
var client = factory.CreateEventHubClient("MyEventHub");

客户端将重用底层的 tcp 连接。来自文档:Create an Event Hubs client