Dela via


Direktuppspelning med Orleans

Orleans v.1.0.0 har lagt till stöd för direktuppspelningstillägg till programmeringsmodellen. Direktuppspelningstillägg ger en uppsättning abstraktioner och API:er som gör det enklare och mer robust att tänka på och arbeta med strömmar. Med strömningstillägg kan utvecklare skriva reaktiva program som körs på en sekvens av händelser på ett strukturerat sätt. Strömprovidrars utökningsbarhetsmodell gör programmeringsmodellen kompatibel med och portabel i en mängd olika befintliga kötekniker, till exempel Event Hubs, ServiceBus, Azure Queues och Apache Kafka. Du behöver inte skriva särskild kod eller köra dedikerade processer för att interagera med sådana köer.

Varför ska jag bry mig?

Om du redan vet allt om Stream Processing och är bekant med tekniker som Event Hubs, Kafka, Azure Stream Analytics, Apache Storm, Apache Spark Streaming och Reactive Extensions (Rx) i .NET kanske du undrar varför du bör bry dig. Varför behöver vi ännu ett Stream Processing System och hur aktörer är relaterade till Flöden?"Varför Orleans Flöden?" är tänkt att svara på den frågan.

Programmeringsmodell

Det finns flera principer bakom Orleans Flöden Programmeringsmodell:

  1. Orleans strömmar är virtuella. En ström finns alltså alltid. Den skapas eller förstörs inte uttryckligen och kan aldrig misslyckas.
  2. Flöden identifieras av ström-ID:t, som bara är logiska namn som består av GUID:er och strängar.
  3. Med Orleans Flöden kan du frikoppla genereringen av data från bearbetningen, både i tid och rum. Det innebär att strömproducenten och strömkonsumenten kan finnas på olika servrar eller i olika tidszoner och tål fel.
  4. Orleans-strömmar är lätta och dynamiska. Orleans Streaming Runtime är utformat för att hantera ett stort antal strömmar som kommer och går i hög takt.
  5. Orleans strömbindningar är dynamiska. Orleans Streaming Runtime är utformat för att hantera fall där korn ansluter till och kopplar från strömmar med hög hastighet.
  6. Orleans Streaming Runtime hanterar transparent livscykeln för strömförbrukningen. När ett program prenumererar på en dataström får det sedan strömmens händelser, även om det uppstår fel.
  7. Orleans strömmar fungerar enhetligt över korn och Orleans kunder.

Programmerings-API:er

Program interagerar med strömmar med hjälp Orleans.Streams.IAsyncStream<T>av , som implementerar gränssnitten Orleans.Streams.IAsyncObserver<T> och Orleans.Streams.IAsyncObservable<T> . Dessa APIS liknar de välkända reaktiva tilläggen (Rx) i .NET.

I ett typiskt exempel nedan genererar en enhet vissa data, som skickas som en HTTP-begäran till tjänsten som körs i molnet. Orleans-klienten som körs på klientdelsservern tar emot det här HTTP-anropet och publicerar data i en matchande enhetsström:

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

I ett annat exempel nedan ansluter en chattanvändare (implementerad som Orleans Grain) till ett chattrum, får ett handtag till en ström av chattmeddelanden som genereras av alla andra användare i det här rummet och prenumererar på det. Observera att chattanvändaren inte behöver känna till själva chattrumskornet (det kanske inte finns ett sådant korn i vårt system) eller om andra användare i gruppen som producerar meddelanden. Naturligtvis behöver användarna inte veta vem som prenumererar på strömmen för tillfället för att publicera till chattströmmen. Detta visar hur chattanvändare kan vara helt frikopplade i tid och rum.

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

Snabbstartsexempel

Snabbstartsexemplet är en bra snabb översikt över det övergripande arbetsflödet för att använda strömmar i programmet. När du har läst den bör du läsa api:erna för Flöden programmering för att få en djupare förståelse för begreppen.

Flöden programmerings-API:er

En Flöden programmerings-API:er innehåller en detaljerad beskrivning av programmerings-API:erna.

Stream-leverantörer

Flöden kan komma via fysiska kanaler i olika former och former och kan ha olika semantik. Orleans Streaming är utformat för att stödja denna mångfald via begreppet Stream Providers, som är en utökningspunkt i systemet. Orleans har för närvarande implementeringar av tvåströmsleverantörer: TCP-baserad Simple Message Stream-provider och Azure Queue-baserad Azure Queue Stream-provider. Mer information om Stream Providers finns på Stream Providers.

Stream-semantik

Stream-prenumerationssemantik:

Orleans Flöden garantera sekventiell konsekvens för Stream-prenumerationsåtgärder. När en konsument prenumererar på en dataström, när prenumerationsåtgärden Task har lösts, ser konsumenten alla händelser som har genererats när den har prenumererat. Dessutom kan du med bakåtspolningsbara strömmar prenumerera från en godtycklig tidpunkt tidigare med hjälp StreamSequenceTokenav . Mer information finns i Orleans stream providers.

Leveransgarantier för enskilda Stream-händelser:

Garantier för leverans av enskilda händelser beror på enskilda dataströmleverantörer. Vissa tillhandahåller endast bästa möjliga leverans på en gång (till exempel Simple Message Flöden (SMS)), medan andra tillhandahåller leverans minst en gång (till exempel Azure Queue Flöden). Det är till och med möjligt att skapa en streamingleverantör som garanterar leverans exakt en gång (vi har ingen sådan leverantör ännu, men det är möjligt att skapa en).

Leveransorder för händelser:

Händelseordningen är också beroende av en viss dataströmsprovider. I SMS strömmar kontrollerar producenten uttryckligen ordningen på de händelser som konsumenten ser genom att kontrollera hur den publicerar dem. Azure Queue-strömmar garanterar inte FIFO-ordning, eftersom de underliggande Azure-köerna inte garanterar ordningen i felfall. Program kan också styra leveransbeställningen av dataströmmen med hjälp StreamSequenceTokenav .

Flöden implementering

Orleans Flöden Implementation ger en övergripande översikt över den interna implementeringen.

Kodexempel

Fler exempel på hur du använder strömmande API:er inom ett korn kan hittas här. Vi planerar att skapa fler exempel i framtiden.

Se även