Отправлять события или получения событий из концентраторов событий Azure с помощью .NET FrameworkSend events to or receive events from Azure Event Hubs using .NET Framework

Центры событий Azure — это платформа потоковой передачи больших данных и служба приема событий, принимающая и обрабатывающая миллионы событий в секунду.Azure Event Hubs is a Big Data streaming platform and event ingestion service, capable of receiving and processing millions of events per second. Центры событий могут обрабатывать и сохранять события, данные и телеметрию, созданные распределенным программным обеспечением и устройствами.Event Hubs can process and store events, data, or telemetry produced by distributed software and devices. Данные, отправляемые в концентратор событий, можно преобразовывать и сохранять с помощью любого поставщика аналитики в реальном времени, а также с помощью адаптеров пакетной обработки или хранения.Data sent to an event hub can be transformed and stored using any real-time analytics provider or batching/storage adapters. Подробный обзор Центров событий см. в статьях Что такое Центры событий Azure? и Обзор функций Центров событий.For detailed overview of Event Hubs, see Event Hubs overview and Event Hubs features.

Этом руководстве показано, как создавать консольные приложения .NET Framework в C# для отправки событий или получать события из концентратора событий.This tutorial shows how to create .NET Framework console applications in C# to send events to or receive events from an eventhub.

Технические условияPrerequisites

Для работы с данным руководством вам потребуется:To complete this tutorial, you need the following prerequisites:

  • Microsoft Visual Studio 2019.Microsoft Visual Studio 2019.
  • Создать пространство имен концентраторов событий и концентратора событий.Create an Event Hubs namespace and an event hub. Первым шагом является использование портала Azure для создания пространства имен типа Центров событий и получение учетных данных управления, необходимых приложению для взаимодействия с концентратором событий.The first step is to use the Azure portal to create a namespace of type Event Hubs, and obtain the management credentials your application needs to communicate with the event hub. Чтобы создать пространство имен и концентратор событий, выполните инструкции из этой статьи.To create a namespace and an event hub, follow the procedure in this article. Затем получите строку подключения для пространства имен концентратора событий , следуя указаниям из статьи: Получение строки подключения на портале.Then, get the connection string for the event hub namespace by following instructions from the article: Get connection string. Строка подключения понадобится нам позже.You use the connection string later in this tutorial.

Отправка событийSend events

В этом разделе показано, как создать консольное приложение .NET Framework, для отправки событий в концентратор событий.This section shows you how to create a .NET Framework console application to send events to an event hub.

Создание консольного приложениеCreate a console application

Создайте в Visual Studio новый проект Visual C# для классических приложений с помощью шаблона проекта Консольное приложение .In Visual Studio, create a new Visual C# Desktop App project using the Console Application project template. Назовите проект Sender.Name the project Sender.

Создание консольного приложения

Добавление пакета NuGet для Центров событийAdd the Event Hubs NuGet package

  1. В обозревателе решений щелкните правой кнопкой мыши проект Sender и выберите пункт Управление пакетами NuGet для решения.In Solution Explorer, right-click the Sender project, and then click Manage NuGet Packages for Solution.

  2. Щелкните вкладку Обзор и выполните поиск WindowsAzure.ServiceBus.Click the Browse tab, then search for WindowsAzure.ServiceBus. Щелкните Установитьи примите условия использования.Click Install, and accept the terms of use.

    Установка пакета NuGet для Служебной шины

    Visual Studio скачает, установит и добавит ссылку на пакет NuGet библиотеки служебной шины Azure.Visual Studio downloads, installs, and adds a reference to the Azure Service Bus library NuGet package.

Написание кода для отправки сообщений в концентратор событийWrite code to send messages to the event hub

  1. Добавьте следующие инструкции using в начало файла Program.cs :Add the following using statements at the top of the Program.cs file:

    using System.Threading;
    using Microsoft.ServiceBus.Messaging;
    
  2. Добавьте в класс Program приведенные ниже поля и укажите в качестве значений имя концентратора событий, созданного в предыдущем разделе, и сохраненную ранее строку подключения уровня пространства имен.Add the following fields to the Program class, substituting the placeholder values with the name of the event hub you created in the previous section, and the namespace-level connection string you saved previously. Вы можете скопировать строку подключения для концентратора событий из поля Строка подключения — первичный ключ в разделе RootManageSharedAccessKey на странице Центра событий на портале Azure.You can copy connection string for your event hub from Connection string-primary key under RootManageSharedAccessKey on the Event Hub page in the Azure portal. Подробные сведения см. в этом разделе.For detailed steps, see Get connection string.

    static string eventHubName = "Your Event Hub name";
    static string connectionString = "namespace connection string";
    
  3. Добавьте следующий метод в класс Program .Add the following method to the Program class:

    static void SendingRandomMessages()
    {
        var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
        while (true)
        {
            try
            {
                var message = Guid.NewGuid().ToString();
                Console.WriteLine("{0} > Sending message: {1}", DateTime.Now, message);
                eventHubClient.Send(new EventData(Encoding.UTF8.GetBytes(message)));
            }
            catch (Exception exception)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("{0} > Exception: {1}", DateTime.Now, exception.Message);
                Console.ResetColor();
            }
    
            Thread.Sleep(200);
        }
    }
    

    Этот метод постоянно отправляет события в концентратор событий с задержкой 200 мс.This method continuously sends events to your event hub with a 200-ms delay.

  4. Наконец, добавьте следующие строки в метод Main :Finally, add the following lines to the Main method:

    Console.WriteLine("Press Ctrl-C to stop the sender process");
    Console.WriteLine("Press Enter to start now");
    Console.ReadLine();
    SendingRandomMessages();
    
  5. Запустите программу и убедитесь в отсутствии ошибок.Run the program, and ensure that there are no errors.

Получение событийReceive events

В этом разделе можно написать консольное приложение .NET Framework, которая получает сообщения из концентратора событий с помощью узла обработчика событий.In this section, you write a .NET Framework console application that receives messages from an event hub using the Event Processor Host. Узел обработчика событий представляет собой класс .NET, который упрощает прием событий из концентраторов событий путем управления постоянными контрольными точками и одновременно принимает сообщения от этих концентраторов событий.The Event Processor Host is a .NET class that simplifies receiving events from event hubs by managing persistent checkpoints and parallel receives from those event hubs. С помощью класса EventProcessorHost можно разделить события между несколькими получателями даже в том случае, если они размещены в разных узлах.Using the Event Processor Host, you can split events across multiple receivers, even when hosted in different nodes.

Создание учетной записи хранения для узла обработчика событийCreate a storage account for Event Processor Host

Узел обработчика событий представляет собой интеллектуальный агент, который упрощает прием событий от Центров событий путем управления постоянными контрольными точками и параллельным приемом.The Event Processor Host is an intelligent agent that simplifies receiving events from Event Hubs by managing persistent checkpoints and parallel receives. Для создания контрольных точек узлу обработчика событий требуется учетная запись хранения.For checkpointing, the Event Processor Host requires a storage account. В следующем примере показано, как создать учетную запись хранения и как получить ключи для доступа:The following example shows how to create a storage account and how to get its keys for access:

  1. На портале Azure выберите Создать ресурс в левой верхней части экрана.In the Azure portal, and select Create a resource at the top left of the screen.

  2. Выберите Хранилище, а затем Учетная запись хранения — BLOB-объект, файл, таблица, очередь.Select Storage, then select Storage account - blob, file, table, queue.

    Выбор учетной записи хранения

  3. На странице Создание учетной записи хранения выполните следующие действия:On the Create storage account page, take the following steps:

    1. Введите имя учетной записи хранения.Enter a name for the storage account.

    2. Выберите подписку Azure, содержащую концентратор событий.Choose an Azure subscription that contains the event hub.

    3. Выберите группу ресурсов, содержащую концентратор событий.Select the resource group that has the event hub.

    4. Выберите расположение, в котором будет создан ресурс.Select a location in which to create the resource.

    5. Щелкните Просмотр и создание.Then click Review + create.

      Страница "Создание учетной записи хранения"

  4. На странице Просмотр и создание проверьте значения и выберите Создать.On the Review + create page, review the values, and select Create.

    Проверка параметров и создание учетной записи хранения

  5. Как только вы увидите развертываний завершены успешно сообщение, выберите перейти к ресурсу в верхней части страницы.After you see the Deployments Succeeded message, select Go to resource at the top of the page. Вы также можете открыть страницу учетной записи хранения, выбрав эту запись в списке ресурсов.You can also launch the Storage Account page by selecting your storage account from the resource list.

    Выбор учетной записи хранения из развертывания

  6. В окне Основные компоненты выберите BLOB-объекты.In the Essentials window, select Blobs.

    Выбор службы BLOB-объектов

  7. В верхней части выберите + Контейнер, введите имя для контейнера и нажмите кнопку ОК.Select + Container at the top, enter a name for the container, and select OK.

    Создание контейнера BLOB-объектов

  8. Выберите Ключи доступа в меню слева и скопируйте значение key1.Select Access keys in the left-side menu, and copy the value of key1.

    Сохраните на время указанные ниже значения в Блокноте или любом другом месте.Save the following values to Notepad or some other temporary location.

    • Имя учетной записи храненияName of the storage account
    • Доступ к учетной записи храненияAccess key for the storage account
    • Имя контейнераName of the container

Создание консольного приложениеCreate a console application

Создайте в Visual Studio новый проект Visual C# для классических приложений с помощью шаблона проекта Консольное приложение.In Visual Studio, create a new Visual C# Desktop App project using the Console Application project template. Присвойте проекту имя Получатель.Name the project Receiver.

Создание консольного приложения

Добавление пакета NuGet для Центров событийAdd the Event Hubs NuGet package

  1. В обозревателе решений щелкните правой кнопкой мыши проект Получатель и выберите пункт Управление пакетами NuGet для решения.In Solution Explorer, right-click the Receiver project, and then click Manage NuGet Packages for Solution.

  2. Щелкните вкладку Обзор и выполните поиск Microsoft Azure Service Bus Event Hub - EventProcessorHost.Click the Browse tab, then search for Microsoft Azure Service Bus Event Hub - EventProcessorHost. Щелкните Установитьи примите условия использования.Click Install, and accept the terms of use.

    Поиск пакета NuGet для узла обработчика событий

    Visual Studio скачает, установит и добавит ссылку на пакет концентратора событий служебной шины Azure EventProcessorHost NuGetсо всеми его зависимостями.Visual Studio downloads, installs, and adds a reference to the Azure Service Bus Event Hub - EventProcessorHost NuGet package, with all its dependencies.

Реализация интерфейса IEventProcessorImplement the IEventProcessor interface

  1. Щелкните правой кнопкой мыши проект Получатель, а затем выберите пункты Добавить и Класс.Right-click the Receiver project, click Add, and then click Class. Присвойте новому классу имя SimpleEventProcessor, а затем нажмите кнопку Добавить, чтобы создать класс.Name the new class SimpleEventProcessor, and then click Add to create the class.

    Добавление класса SimpleEventProcessor

  2. Добавьте в начало файла SimpleEventProcessor.cs следующие инструкции:Add the following statements at the top of the SimpleEventProcessor.cs file:

    using Microsoft.ServiceBus.Messaging;
    using System.Diagnostics;
    
  3. Замените следующий код текстом класса:Substitute the following code for the body of the class:

    class SimpleEventProcessor : IEventProcessor
    {
      Stopwatch checkpointStopWatch;
    
      async Task IEventProcessor.CloseAsync(PartitionContext context, CloseReason reason)
      {
          Console.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason);
          if (reason == CloseReason.Shutdown)
          {
              await context.CheckpointAsync();
          }
      }
    
      Task IEventProcessor.OpenAsync(PartitionContext context)
      {
          Console.WriteLine("SimpleEventProcessor initialized.  Partition: '{0}', Offset: '{1}'", context.Lease.PartitionId, context.Lease.Offset);
          this.checkpointStopWatch = new Stopwatch();
          this.checkpointStopWatch.Start();
          return Task.FromResult<object>(null);
      }
    
      async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
      {
          foreach (EventData eventData in messages)
          {
              string data = Encoding.UTF8.GetString(eventData.GetBytes());
    
              Console.WriteLine(string.Format("Message received.  Partition: '{0}', Data: '{1}'",
                  context.Lease.PartitionId, data));
          }
    
          //Call checkpoint every 5 minutes, so that worker can resume processing from 5 minutes back if it restarts.
          if (this.checkpointStopWatch.Elapsed > TimeSpan.FromMinutes(5))
          {
              await context.CheckpointAsync();
              this.checkpointStopWatch.Restart();
          }
      }
    }
    

    Этот класс вызывается из EventProcessorHost для обработки событий, полученных от концентратора событий.This class is called by the EventProcessorHost to process events received from the event hub. В классе SimpleEventProcessor используется контрольный таймер для периодического вызова метода контрольных точек в контексте EventProcessorHost.The SimpleEventProcessor class uses a stopwatch to periodically call the checkpoint method on the EventProcessorHost context. Благодаря этому в случае перезагрузки получателя будет потеряно не более пяти минут обработки.This processing ensures that, if the receiver is restarted, it loses no more than five minutes of processing work.

Обновление метода Main для использования класса SimpleEventProcessorUpdate the Main method to use SimpleEventProcessor

  1. Добавьте в класс Program в начале файла следующую инструкцию using.In the Program class, add the following using statement at the top of the file:

    using Microsoft.ServiceBus.Messaging;
    
  2. Замените метод Main в классе Program следующим кодом. При этом укажите имя концентратора событий и сохраненную ранее строку подключения уровня пространства имен, а также учетную запись хранения и ключ, которые вы скопировали в предыдущих разделах.Replace the Main method in the Program class with the following code, substituting the event hub name and the namespace-level connection string that you saved previously, and the storage account and key that you copied in the previous sections.

    static void Main(string[] args)
    {
      string eventHubConnectionString = "{Event Hubs namespace connection string}";
      string eventHubName = "{Event Hub name}";
      string storageAccountName = "{storage account name}";
      string storageAccountKey = "{storage account key}";
      string storageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", storageAccountName, storageAccountKey);
    
      string eventProcessorHostName = Guid.NewGuid().ToString();
      EventProcessorHost eventProcessorHost = new EventProcessorHost(eventProcessorHostName, eventHubName, EventHubConsumerGroup.DefaultGroupName, eventHubConnectionString, storageConnectionString);
      Console.WriteLine("Registering EventProcessor...");
      var options = new EventProcessorOptions();
      options.ExceptionReceived += (sender, e) => { Console.WriteLine(e.Exception); };
      eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>(options).Wait();
    
      Console.WriteLine("Receiving. Press enter key to stop worker.");
      Console.ReadLine();
      eventProcessorHost.UnregisterEventProcessorAsync().Wait();
    }
    
  3. Запустите программу и убедитесь в отсутствии ошибок.Run the program, and ensure that there are no errors.

Дальнейшие действияNext steps

Ознакомьтесь со следующими статьями:Read the following articles: