Partilhar via


Streaming com Orleães

Orleans v.1.0.0 acrescentou suporte para extensões de streaming à programação modelo. As extensões de streaming fornecem um conjunto de abstrações e APIs que tornam o pensamento e o trabalho com streams mais simples e robustos. As extensões de streaming permitem que os desenvolvedores escrevam aplicações reativas que operam numa sequência de eventos de forma estruturada. A extensibilidade modelo dos fornecedores de fluxo torna a programação modelo compatível e portátil através de uma vasta gama de tecnologias de fila existentes, tais como Centros de Eventos, ServiceBus, Azure Queues e Apache Kafka. Não há necessidade de escrever código especial ou executar processos dedicados para interagir com tais filas.

Por que me importaria?

Se já sabe tudo sobre processamento de streaming e está familiarizado com tecnologias como Event Hubs, Kafka, Azure Stream Analytics, Apache Storm, Apache Spark Streaming e Reativas (Rx) em .NET, pode estar a perguntar por que se importa. Por que precisamos de mais um Sistema de Processamento de Fluxo e de como os atores estão relacionados com Fluxos?"Por que Orleães Fluxos?" é para responder a esta pergunta.

Modelo de programação

Existem vários princípios por trás de Orleans Fluxos Modelo de Programação:

  1. Os riachos de Orleans são virtuais. Isto é, um riacho sempre existe. Não é explicitamente criado ou destruído, e nunca poderá falhar.
  2. Fluxos são identificados por IDs de fluxo, que são apenas nomes lógicos compostos por GUIDs e cordas.
  3. Orleães Fluxos permitir-lhe dissociar a geração de dados do seu processamento, tanto no tempo como no espaço. Isto significa que o produtor de fluxo e o consumidor de fluxo podem estar em diferentes servidores ou em diferentes fusos horários, e resistirão a falhas.
  4. Os riachos de Orleães são leves e dinâmicos. Orleans Streaming Runtime é projetado para lidar com um grande número de fluxos que vêm e vão a uma taxa elevada.
  5. Orleans as encadernações são dinâmicas. Orleans Streaming Runtime foi concebido para lidar com casos em que os grãos se ligam e desligam-se dos fluxos a uma taxa elevada.
  6. Orleans Streaming Runtime gere de forma transparente o ciclo de vida do consumo de fluxo. Depois de uma aplicação subscrever um stream, receberá então os eventos do stream, mesmo na presença de falhas.
  7. Os riachos de Orleans trabalham uniformemente através de grãos e clientes de Orleães.

APIs de programação

As aplicações interagem com os streams utilizando Orleans.Streams.IAsyncStream<T>, que implementa o Orleans.Streams.IAsyncObserver<T> e Orleans.Streams.IAsyncObservable<T> interfaces. Estes APIS são semelhantes às conhecidas Extensões Reativas (Rx) em .NET.

Num exemplo típico abaixo, um dispositivo gera alguns dados, que são enviados como um pedido HTTP para o serviço em execução na Cloud. O cliente de Orleans que está a funcionar no servidor frontal recebe esta chamada HTTP e publica os dados num fluxo de dispositivo correspondente:

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);
}

Em outro exemplo abaixo, um utilizador de chat (implementado como Orleans Grain) junta-se a uma sala de chat, pega num fluxo de mensagens de chat geradas por todos os outros utilizadores nesta sala, e subscreve-a. Note que o utilizador do chat não precisa de saber sobre o próprio grão da sala de chat (pode não haver um grão no nosso sistema) ou sobre outros utilizadores desse grupo que produzem mensagens. Escusado será dizer que, para publicar no stream de chat, os utilizadores não precisam de saber quem está atualmente subscrito ao stream. Isto demonstra como os utilizadores de chat podem ser completamente dissociados no tempo e no espaço.

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))
    }
}

Amostra de arranque rápido

A Amostra de Início Rápido é uma boa visão geral do fluxo de trabalho global da utilização de fluxos na aplicação. Depois de lê-lo, deve ler as APIs de programação Fluxos para obter uma compreensão mais profunda dos conceitos.

APIs de programação Fluxos

Uma Fluxos APIs de programação fornece uma descrição detalhada das APIs de programação.

Fornecedores de fluxo

Fluxos pode vir através de canais físicos de várias formas e formas e pode ter semântica diferentes. O Orleans Streaming foi concebido para apoiar esta diversidade através do conceito de Stream Providers, que é um ponto de extensibilidade no sistema. A Orleans tem atualmente implementações de fornecedores de dois fluxos: Fornecedor de fluxo de mensagens simples baseado em TCP e Azure Queue Stream Provider. Mais detalhes sobre stream Providers podem ser encontrados em Stream Providers.

Semântica de fluxo

Semântica de subscrição de fluxo:

Orleães Fluxos garantir consistência sequencial para operações de subscrição de fluxo. Especificamente, quando um consumidor subscrever um fluxo, uma vez que a Task operação de subscrição representava com sucesso, o consumidor verá todos os eventos que foram gerados após a sua subscrição. Além disso, os fluxos rebobináveis permitem-lhe subscrever a partir de um ponto arbitrário no passado, utilizando StreamSequenceToken. Para mais informações, consulte os fornecedores de stream de Orleans.

Garantias de entrega de eventos de fluxo individual:

As garantias individuais de entrega de eventos dependem de fornecedores individuais de fluxo. Alguns proporcionam apenas o melhor esforço na entrega mais uma vez (como Fluxos de mensagem simples (SMS)), enquanto outros fornecem entregas pelo menos uma vez (como Azure Queue Fluxos). É até possível construir um fornecedor de streaming que garanta uma entrega exatamente uma vez (ainda não temos tal fornecedor, mas é possível construir um).

Encomenda de Entrega de Eventos:

A ordem de eventos também depende de um determinado fornecedor de fluxo. Em SMS fluxos, o produtor controla explicitamente a ordem dos acontecimentos vistos pelo consumidor, controlando a forma como os publica. Os streams de fila Azure não garantem a encomenda FIFO, uma vez que as filas Azure subjacentes não garantem a encomenda em casos de falha. As aplicações também podem controlar o seu pedido de entrega de fluxo utilizando StreamSequenceToken.

Fluxos implementação

A Implementação Fluxos de Orleães fornece uma visão geral de alto nível da implementação interna.

Exemplos de código

Mais exemplos de como usar APIs de streaming dentro de um grão podem ser encontrados aqui. Planeamos criar mais amostras no futuro.

Ver também