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

时间:2015-09-25 12:39:59

标签: c# azure azure-eventhub

我正在创建一个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方法? 在性能方面最好的情况是什么?将来,发送的数量可能会增加,消息数量也会增加

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分: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);

答案 3 :(得分:-1)

是的,它是正确的,你可以每次创建一个新的EventHubClient,没关系。

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