Sdílet prostřednictvím


Streamování pomocí Orleans

Orleans v.1.0.0 přidala podporu pro rozšíření streamování do programovacího modelu. Rozšíření streamování poskytují sadu abstrakcí a rozhraní API, která usnadňují a pracují s datovými proudy jednoduššími a robustnějšími. Rozšíření streamování umožňují vývojářům psát reaktivní aplikace, které fungují na posloupnosti událostí strukturovaným způsobem. Model rozšiřitelnosti poskytovatelů datových proudů umožňuje programovací model kompatibilní s a přenositelný napříč širokou škálou existujících technologií řízení front, jako jsou Event Hubs, ServiceBus, Azure Queues a Apache Kafka. Není nutné psát speciální kód nebo spouštět vyhrazené procesy pro interakci s těmito frontami.

Proč bych se měl starat?

Pokud už všechno znáte o zpracování streamů a znáte technologie, jako jsou Event Hubs, Kafka, Azure Stream Analytics, Apache Storm, Streamování Apache Sparku a reaktivní rozšíření (Rx) v .NET, můžete se ptát, proč byste měli mít zájem. Proč potřebujeme ještě další systém zpracování datových proudů a jak se aktéři vztahují k Toky?"Proč Orleans Toky?" má odpovědět na tuto otázku.

Programovací model

Za programovacím modelem Toky Orleans existuje několik principů:

  1. Orlénské proudy jsou virtuální. To znamená, že stream vždy existuje. Není explicitně vytvořen ani zničen a nemůže selhat.
  2. Toky jsou identifikovány ID datových proudů, což jsou jenom logické názvy tvořené identifikátory GUID a řetězci.
  3. Orleans Toky umožňuje oddělit generování dat od jejich zpracování, a to jak v čase, tak v prostoru. To znamená, že producent datových proudů a příjemce datových proudů mohou být na různých serverech nebo v různých časových pásmech a budou vydržet selhání.
  4. Orlénské proudy jsou jednoduché a dynamické. Prostředí Orleans Streaming Runtime je navržené tak, aby zpracovávalo velký počet proudů, které přicházejí a procházejí vysokou rychlostí.
  5. Vazby streamu v Orleans jsou dynamické. Prostředí Orleans Streaming Runtime je navržené tak, aby zpracovávalo případy, kdy se zrna připojují k datovým proudům a odpojí se od datových proudů vysokou rychlostí.
  6. Prostředí Orleans Streaming Runtime transparentně spravuje životní cyklus spotřeby datových proudů. Jakmile se aplikace přihlásí k odběru datového proudu, obdrží události datového proudu, a to i v případě selhání.
  7. Orlénské proudy fungují jednotně napříč zrnami a klienty Orleans.

Programovací rozhraní API

Aplikace komunikují s datovými proudy pomocí Orleans.Streams.IAsyncStream<T>, který implementuje Orleans.Streams.IAsyncObserver<T> rozhraní a Orleans.Streams.IAsyncObservable<T> rozhraní. Tyto APIS jsou podobné dobře známým reaktivním rozšířením (Rx) v .NET.

V typickém příkladu níže vygeneruje zařízení některá data, která se odesílají jako požadavek HTTP do služby spuštěné v cloudu. Klient Orleans spuštěný na front-end serveru obdrží toto volání HTTP a publikuje data do odpovídajícího datového proudu zařízení:

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

V dalším příkladu níže se chatovací uživatel (implementovaný jako Orleans Grain) připojí k chatovací místnosti, získá popisovač streamu chatovacích zpráv vygenerovaných všemi ostatními uživateli v této místnosti a přihlásí se k odběru. Všimněte si, že uživatel chatu nemusí vědět o samotné chatovací místnosti (v našem systému nemusí být takové podrobné informace) ani o jiných uživatelích v této skupině, kteří vytvářejí zprávy. Bez nutnosti publikovat do chatovacího streamu nemusí uživatelé vědět, kdo je aktuálně přihlášený k odběru streamu. To ukazuje, jak mohou být uživatelé chatu zcela odděleni v čase a prostoru.

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

Ukázka rychlého startu

Ukázka rychlého startu je dobrý rychlý přehled celkového pracovního postupu používání datových proudů v aplikaci. Po přečtení byste si měli přečíst Toky programovací rozhraní API, abyste získali hlubší přehled o konceptech.

rozhraní API pro programování Toky

Rozhraní API pro programování Toky poskytuje podrobný popis programovacích rozhraní API.

Poskytovatelé streamu

Toky mohou být prostřednictvím fyzických kanálů různých obrazců a formulářů a mohou mít různé sémantiky. Orleans Streaming je navržen tak, aby podporoval tuto rozmanitost prostřednictvím konceptu poskytovatelů streamů, což je rozšiřitelnost bod v systému. Orleans v současné době má implementace dvou streamových poskytovatelů: poskytovatele jednoduchých streamů založených na protokolu TCP a poskytovatele služby Azure Queue Stream založené na frontě Azure. Další podrobnosti o poskytovatelích streamů najdete na webu Stream Providers.

Sémantika streamu

Sémantika předplatného streamu:

Orleans Toky zaručuje sekvenční konzistenci pro operace předplatného streamu. Konkrétně když se příjemce přihlásí k odběru datového proudu, po Task úspěšném vyřešení operace předplatného se příjemci zobrazí všechny události vygenerované po přihlášení k odběru. Kromě toho rewindable streamy umožňují přihlásit se k odběru libovolného bodu v čase v minulosti pomocí StreamSequenceToken. Další informace najdete v tématu Poskytovatelé streamu Orleans.

Záruky doručení jednotlivých událostí streamu:

Záruky doručení jednotlivých událostí závisí na jednotlivých poskytovatelích datových proudů. Některé poskytují maximálně jedno doručení (například jednoduché Toky zpráv (SMS)), zatímco jiné poskytují aspoň jedno doručení (například Azure Queue Toky). Dokonce je možné vytvořit poskytovatele streamování, který bude zaručit přesně jedno doručení (zatím takový poskytovatel nemáme, ale je možné ho sestavit).

Objednávka doručení událostí:

Pořadí událostí také závisí na konkrétním poskytovateli streamu. V SMS streamech producent explicitně řídí pořadí událostí, které uživatel vidí, tím, že řídí způsob jejich publikování. Streamy front Azure nezaručují objednávku FIFO, protože podkladové fronty Azure nezaručují pořadí v případech selhání. Aplikace mohou také řídit pořadí doručení datových proudů pomocí StreamSequenceToken.

implementace Toky

The Orleans Toky Implementation poskytuje základní přehled interní implementace.

Ukázky kódů

Další příklady použití rozhraní API streamování v rámci zrna najdete tady. V budoucnu plánujeme vytvořit další ukázky.

Viz také