10

我正在创建一个将消息发送到 Azure 上的事件中心的 EventHub 客户端应用程序。现在,当我有一条消息要发送(每 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 方法更好?就性能而言,最佳方案是什么?未来发送的数量可能会增加,消息的数量也会增加

4

4 回答 4

4

使用 EventHubClient.CreateFromConnectionString(...) 直接创建客户端将为每个客户端创建一个新的 tcp 连接。但是,当使用共享的 MessagingFactory 创建客户端时

var factory = MessagingFactory.CreateFromConnectionString("your_connection_string");
var client = factory.CreateEventHubClient("MyEventHub");

客户端将重用底层 tcp 连接。来自文档:创建事件中心客户端

于 2017-09-11T02:16:39.533 回答
3

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

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

于 2015-10-19T14:38:38.133 回答
1

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

            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);
于 2016-11-14T08:18:02.667 回答
-2

EventHubClient是的,它是正确的,你可以每次都创建一个新的,就可以了。

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

于 2015-09-25T12:51:52.030 回答