Прочитать на английском

Поделиться через


Потоковая передача с Орлеаном

Orleans версии 1.0.0 добавил поддержку расширений потоковой передачи в модель программирования. Модули потоковой передачи предоставляют набор абстракций и API, которые делают мышление и работу с потоками проще и надежнее. Модули потоковой передачи позволяют разработчикам создавать реактивные приложения, которые работают с последовательностью событий структурированным образом. Модель расширяемости поставщиков потоков делает модель программирования совместимой с и переносимой в широком спектре существующих технологий очередей, таких как Центры событий, ServiceBus, Очереди Azure и Apache Kafka. Нет необходимости писать специальный код или запускать выделенные процессы для взаимодействия с такими очередями.

Зачем мне заботиться?

Если вы уже знаете все о потоковой обработке и знакомы с такими технологиями, как Центры событий, Kafka, Azure Stream Analytics, Apache Storm, Потоковая передача Apache Spark и реактивные расширения (Rx) в .NET, может возникнуть вопрос о том, почему следует заботиться. Почему нам нужна еще одна система обработки потока и как субъекты связаны с Потоки?"Почему Орлеан Потоки?" Предназначен для ответа на этот вопрос.

Модель программирования

Существует несколько принципов, лежащих в основе Потоки модели программирования Орлеана:

  1. Потоки Орлеана являются виртуальными. То есть поток всегда существует. Он не создается или уничтожается явным образом, и он никогда не может завершиться ошибкой.
  2. Потоки идентифицируются идентификаторами потоков, которые являются логическими именами, состоящими из GUID и строк.
  3. Орлеан Потоки позволяет отделять создание данных от обработки как во времени, так и в пространстве. Это означает, что производитель потока и потребитель потока могут находиться на разных серверах или в разных часовых поясах и выдержать сбои.
  4. Потоки Орлеана являются упрощенными и динамическими. Среда выполнения потоковой передачи Orleans предназначена для обработки большого количества потоков, которые приходят и проходят с высокой скоростью.
  5. Привязки потока Orleans являются динамическими. Среда выполнения потоковой передачи Orleans предназначена для обработки случаев, когда зерна подключаются к потокам и отключаться от нее с высокой скоростью.
  6. Среда выполнения потоковой передачи Orleans прозрачно управляет жизненным циклом потребления потоков. После того как приложение подписывается на поток, оно будет получать события потока даже при наличии сбоев.
  7. Потоки Орлеана работают равномерно по зернам и клиентам Орлеана.

Программные API

Приложения взаимодействуют с потоками с помощью Orleans.Streams.IAsyncStream<T>, который реализует Orleans.Streams.IAsyncObserver<T> интерфейсы и Orleans.Streams.IAsyncObservable<T> интерфейсы. Эти API похожи на известные реактивные расширения (Rx) в .NET.

В типичном примере ниже устройство создает некоторые данные, которые отправляются в виде HTTP-запроса службе, работающей в облаке. Клиент Orleans, работающий на интерфейсном сервере, получает этот HTTP-вызов и публикует данные в соответствующий поток устройства:

public async Task OnHttpCall(DeviceEvent deviceEvent)
{
     // Post data directly into the device's stream.
     IStreamProvider streamProvider =
        GrainClient.GetStreamProvider("MyStreamProvider");

    IAsyncStream<DeviceEventData> deviceStream =
        streamProvider.GetStream<DeviceEventData>(
            deviceEvent.DeviceId, "MyNamespace");

     await deviceStream.OnNextAsync(deviceEvent.Data);
}

В другом примере ниже пользователь чата (реализованный как Orleans Grain) присоединяется к комнате чата, получает дескриптор потока сообщений чата, созданных всеми другими пользователями в этой комнате, и подписывается на него. Обратите внимание, что пользователю чата не нужно знать о самом элементе комнаты чата (в нашей системе может не быть такого зерна) или о других пользователях в этой группе, которые создают сообщения. Не нужно говорить, чтобы опубликовать в потоке чата, пользователям не нужно знать, кто в настоящее время подписан на поток. В этом примере показано, как пользователи чата могут быть полностью отделены во времени и пространстве.

public class ChatUser: Grain
{
    public async Task JoinChat(Guid chatGroupId)
    {
        IStreamProvider streamProvider =
            base.GetStreamProvider("MyStreamProvider");

        IAsyncStream<string> chatStream =
            streamProvider.GetStream<string>(chatGroupId, "MyNamespace");

        await chatStream.SubscribeAsync(
            async (message, token) => Console.WriteLine(message))
    }
}

Пример быстрого запуска

Пример быстрого запуска — это хороший краткий обзор общего рабочего процесса использования потоков в приложении. Прочитав его, вы должны прочитать Потоки API программирования, чтобы получить более глубокое представление о концепциях.

API программирования Потоки

API-интерфейсы программирования Потоки содержат подробное описание API программирования.

Поставщики потоков

Потоки могут поступать через физические каналы различных форм и форм и могут иметь другую семантику. Потоковая передача Orleans предназначена для поддержки этого разнообразия с помощью концепции поставщиков потоков, которая является точкой расширяемости в системе. В настоящее время Orleans имеет реализации двухпотоковых поставщиков: поставщика простого потока сообщений на основе TCP и поставщика потока очередей Azure на основе очередей Azure. Дополнительные сведения о поставщиках потоков можно найти в разделе "Поставщики потоков".

Семантика потока

Семантика подписки stream:

Orleans Потоки гарантирует последовательную согласованность для операций подписки Stream. В частности, когда потребитель подписывается на поток, после Task успешного разрешения операции подписки потребитель увидит все события, созданные после подписки. Кроме того, перемотка потоков позволяет подписываться с произвольной точки во времени в прошлом с помощью StreamSequenceToken. Дополнительные сведения см. в разделе о поставщиках потоков Orleans.

Гарантии доставки отдельных событий потока:

Гарантии доставки отдельных событий зависят от отдельных поставщиков потоков. Некоторые предоставляют только самые лучшие усилия при максимальной доставке (например, простое сообщение Потоки (SMS)), в то время как другие обеспечивают по крайней мере однократную доставку (например, очередь Azure Потоки). Можно даже создать поставщик потоковой передачи, который гарантирует точно однократную доставку (у нас еще нет такого поставщика, но его можно создать).

Порядок доставки событий:

Порядок событий также зависит от конкретного поставщика потоков. В SMS потоках производитель явно контролирует порядок событий, видимых потребителем, контролируя способ их публикации. Потоки очередей Azure не гарантируют порядок FIFO, так как базовые очереди Azure не гарантируют порядок в случаях сбоя. Приложения также могут управлять порядком доставки потоков с помощью .StreamSequenceToken

реализация Потоки

Реализация Потоки Орлеана предоставляет общий обзор внутренней реализации.

Примеры кода

Дополнительные примеры использования API потоковой передачи в зернах можно найти здесь. Мы планируем создать дополнительные примеры в будущем.

См. также