Правильно ли создавать EventHubClient для каждого отправляемого сообщения?

Я создаю клиентское приложение 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? Какой сценарий лучше всего с точки зрения производительности? В будущем количество отправок может увеличиться, а также количество сообщений.


person Andrea Cattaneo    schedule 25.09.2015    source источник
comment
В дополнение к приведенным ниже ответам: осознайте, что с точки зрения производительности, как правило, лучше отправлять сообщения пакетом, используя .SendBatch или .SendBatchAsync, а не отправлять сообщения одно за другим. Особенно, когда скорость сообщений становится выше. Это действительно зависит от того, насколько быстро вы хотите, чтобы эти сообщения доставлялись в EventHub.   -  person Peter Bons    schedule 14.11.2016
comment
@PeterBons Я с вами согласен. Использование пакетов сообщений - всегда хороший выбор. В моем случае я ограничиваю пакет до максимально допустимого размера пакета, а затем, когда он заполнен, я отправляю пакет (у меня огромное количество сообщений).   -  person Andrea Cattaneo    schedule 09.02.2017


Ответы (4)


Создание клиента напрямую с помощью EventHubClient.CreateFromConnectionString (...) создаст новое TCP-соединение для каждого клиента. Однако при создании клиента с использованием общей MessagingFactory

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

клиент будет повторно использовать базовое TCP-соединение. Из документов: Создать клиент концентраторов событий

person lindstromhenrik    schedule 11.09.2017

Нет, необходимо создать новый EventHubClient с помощью MessageFactory только в первый раз. Если я создаю клиента для каждого отправляемого сообщения, то создается новое соединение, а старое остается открытым (проверяется с помощью netstat), что приводит к множеству «УСТАНОВЛЕННЫХ» соединений.

Используя одного клиента, созданного для первого сообщения, затем повторно используя клиента для других сообщений, если интернет-соединение потеряно, а затем возвращается, tcp-соединение автоматически создается заново.

person Andrea Cattaneo    schedule 19.10.2015
comment
как вы можете сделать это в веб-API asp.net? Вы можете показать пример кода? - person Kemal Can Kara; 13.11.2016
comment
@KemalCanKara Я добавил пример создания клиента с помощью фабрики - person Andrea Cattaneo; 14.11.2016
comment
@AndreaCattaneo, какова ваша ссылка для вашего ответа? - person Frank Fajardo; 05.02.2017
comment
@FrankFajardo Я просто попробовал и проверил с помощью netstat - person Andrea Cattaneo; 09.02.2017

Вот пример создания клиента с использованием 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);
person Andrea Cattaneo    schedule 14.11.2016

Да, это правильно, вы можете каждый раз создавать новый EventHubClient, это будет нормально.

Внутри он повторно использует одно и то же базовое TCP-соединение, если строка подключения такая же. EventHubClient кэширует результаты используемых MessageFactory.Create(...) методов.

person ken2k    schedule 25.09.2015
comment
К сожалению, это неверно. Если я каждый раз создаю новый EventHubClient, создается новое соединение с новым номером порта. Проверил сегодня после проблем на поле. - person Andrea Cattaneo; 19.10.2015
comment
Приятно знать проблемы с созданием EventHubClient каждый раз, когда мы отправляем сообщение, спасибо. - person Thuy; 03.08.2020