Začínáme s Reliable Services

Aplikace Azure Service Fabric obsahuje jednu nebo více služeb, které spouští váš kód. V této příručce se dozvíte, jak vytvářet bezstavové i stavové aplikace Service Fabric pomocí Reliable Services.

Na této stránce najdete školicí video, ve kterém se dozvíte, jak vytvořit bezstavovou službu Reliable.

Základní koncepty

Abyste mohli začít používat Reliable Services, stačí porozumět několika základním konceptům:

  • Typ služby: Toto je implementace vaší služby. Je definována třídou, kterou napíšete, a StatelessService veškerým dalším kódem nebo závislostmi použitými v této třídě spolu s názvem a číslem verze.
  • Pojmenovaná instance služby: Pokud chcete službu spustit, vytvoříte pojmenované instance vašeho typu služby, podobně jako vytváříte instance objektů typu třídy. Instance služby má název ve formě identifikátoru URI pomocí "fabric:/". schéma, například "fabric:/MyApp/MyService".
  • Hostitel služby: Pojmenované instance služby, které vytvoříte, musí běžet v hostitelském procesu. Hostitel služby je jen proces, ve kterém můžou běžet instance vaší služby.
  • Registrace služby: Registrace spojuje všechno dohromady. Typ služby musí být zaregistrovaný v modulu runtime Service Fabric v hostiteli služby, aby služba Service Fabric mohla vytvářet instance, které se mají spustit.

Vytvoření bezstavové služby

Bezstavová služba je typ služby, který je v současné době v cloudových aplikacích normou. Považuje se za bezstavovou, protože samotná služba neobsahuje data, která je třeba spolehlivě uložit nebo zajistit vysokou dostupnost. Pokud se instance bezstavové služby vypne, dojde ke ztrátě veškerého jejího interního stavu. V tomto typu služby musí být stav trvale uložen v externím úložišti, jako jsou tabulky Azure nebo SQL Database, aby byla vysoce dostupná a spolehlivá.

Spusťte Visual Studio 2017 nebo Visual Studio 2019 jako správce a vytvořte nový projekt aplikace Service Fabric s názvem HelloWorld:

Vytvoření nové aplikace Service Fabric pomocí dialogového okna Nový projekt

Pak pomocí .NET Core 2.0 vytvořte projekt bezstavové služby s názvem HelloWorldStateless:

Ve druhém dialogovém okně vytvořte projekt bezstavové služby.

Vaše řešení teď obsahuje dva projekty:

  • HelloWorld. Toto je projekt aplikace , který obsahuje vaše služby. Obsahuje také manifest aplikace, který popisuje aplikaci, a řadu skriptů PowerShellu, které vám pomůžou nasadit aplikaci.
  • HelloWorldStateless. Toto je projekt služby. Obsahuje implementaci bezstavové služby.

Implementace služby

Otevřete soubor HelloWorldStateless.cs v projektu služby. V Service Fabric může služba spouštět libovolnou obchodní logiku. Rozhraní API služby poskytuje dva vstupní body pro váš kód:

  • Metoda otevřeného vstupního bodu s názvem RunAsync, kde můžete začít spouštět všechny úlohy, včetně dlouhotrvajících výpočetních úloh.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
    ...
}
  • Komunikační vstupní bod, kam můžete připojit komunikační zásobník podle svého výběru, například ASP.NET Core. Tady můžete začít přijímat žádosti od uživatelů a dalších služeb.
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    ...
}

V tomto kurzu se zaměříme na metodu vstupního RunAsync() bodu. Tady můžete okamžitě začít spouštět svůj kód. Šablona projektu obsahuje ukázkovou implementaci RunAsync() , která zvýší klouzavý počet.

Poznámka

Podrobnosti o tom, jak pracovat s komunikačním zásobníkem, najdete v tématu Komunikace služby s ASP.NET Core

RunAsync

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following sample code with your own logic
    //       or remove this RunAsync override if it's not needed in your service.

    long iterations = 0;

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations);

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }
}

Platforma volá tuto metodu, když je instance služby umístěna a připravena ke spuštění. U bezstavové služby to jednoduše znamená, že se instance služby otevře. Token zrušení se poskytuje ke koordinaci, když je potřeba zavřít instanci služby. V Service Fabric může k tomuto cyklu otevření/zavření instance služby dojít mnohokrát za celou dobu životnosti služby jako celku. K tomu může dojít z různých důvodů, mezi které patří:

  • Systém přesune instance služby pro vyrovnávání prostředků.
  • V kódu dochází k chybám.
  • Aplikace nebo systém se upgraduje.
  • U základního hardwaru dochází k výpadku.

Tuto orchestraci spravuje systém, aby vaše služba byla vysoce dostupná a správně vyvážená.

RunAsync() by nemělo blokovat synchronně. Vaše implementace RunAsync by měla vrátit úlohu nebo čekat na všechny dlouhotrvající nebo blokující operace, aby modul runtime mohl pokračovat. Všimněte si, že ve smyčce while(true) v předchozím příkladu se používá vrácení await Task.Delay() úlohy. Pokud vaše úloha musí blokovat synchronně, měli byste ve své RunAsync implementaci naplánovat novou úlohu.Task.Run()

Zrušení úlohy je spolupráce, která se orchestruje pomocí poskytnutého tokenu zrušení. Systém počká, až úkol skončí (úspěšným dokončením, zrušením nebo chybou), než se přesune dál. Je důležité dodržovat token zrušení, dokončit jakoukoli práci a co nejrychleji ukončit RunAsync() , když systém požádá o zrušení.

V tomto příkladu bezstavové služby je počet uložený v místní proměnné. Protože se ale jedná o bezstavovou službu, uložená hodnota existuje pouze pro aktuální životní cyklus její instance služby. Když se služba přesune nebo restartuje, hodnota se ztratí.

Vytvoření stavové služby

Service Fabric zavádí nový druh služby, který je stavový. Stavová služba může spolehlivě udržovat stav v samotné službě, a to společně s kódem, který ji používá. Service Fabric zpřístupnil stav s vysokou dostupností, aniž by bylo nutné uchovávat stav v externím úložišti.

Pokud chcete převést hodnotu čítače z bezstavové na vysoce dostupnou a trvalou, i když se služba přesune nebo restartuje, potřebujete stavovou službu.

Ve stejné aplikaci HelloWorld můžete přidat novou službu tak, že v projektu aplikace kliknete pravým tlačítkem na Odkazy na služby a vyberete Přidat –> nová služba Service Fabric.

Přidání služby do aplikace Service Fabric

Vyberte .NET Core 2.0 –> Stavová služba a pojmenujte ji HelloWorldStateful. Klikněte na OK.

Použití dialogového okna Nový projekt k vytvoření nové stavové služby Service Fabric

Vaše aplikace by teď měla mít dvě služby: bezstavovou službu HelloWorldStateless a stavovou službu HelloWorldStateful.

Stavová služba má stejné vstupní body jako bezstavová služba. Hlavním rozdílem je dostupnost poskytovatele stavu , který dokáže spolehlivě ukládat stav. Service Fabric se dodává s implementací poskytovatele stavu s názvem Reliable Collections, která umožňuje vytvářet replikované datové struktury prostřednictvím správce stavu Reliable State Manager. Stavová spolehlivá služba ve výchozím nastavení používá tohoto poskytovatele stavu.

Otevřete HelloWorldStateful.cs v HelloWorldStateful, který obsahuje následující metodu RunAsync:

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    // TODO: Replace the following sample code with your own logic
    //       or remove this RunAsync override if it's not needed in your service.

    var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();

        using (var tx = this.StateManager.CreateTransaction())
        {
            var result = await myDictionary.TryGetValueAsync(tx, "Counter");

            ServiceEventSource.Current.ServiceMessage(this.Context, "Current Counter Value: {0}",
                result.HasValue ? result.Value.ToString() : "Value does not exist.");

            await myDictionary.AddOrUpdateAsync(tx, "Counter", 0, (key, value) => ++value);

            // If an exception is thrown before calling CommitAsync, the transaction aborts, all changes are
            // discarded, and nothing is saved to the secondary replicas.
            await tx.CommitAsync();
        }

        await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
    }

RunAsync

RunAsync() funguje podobně ve stavových a bezstavových službách. Ve stavové službě však platforma před spuštěním RunAsync()provede další práci vaším jménem. Tato práce může zahrnovat zajištění, že správce stavu reliable a spolehlivé kolekce jsou připravené k použití.

Reliable Collections a Reliable State Manager

var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");

IReliableDictionary je implementace slovníku, kterou můžete použít ke spolehlivému uložení stavu ve službě. Pomocí Service Fabric a Reliable Collections můžete ukládat data přímo ve službě bez nutnosti externího trvalého úložiště. Díky spolehlivým kolekci jsou vaše data vysoce dostupná. Service Fabric toho dosáhne tím, že za vás vytvoří a spravuje více replik vaší služby. Poskytuje také rozhraní API, které abstrahuje složitost správy těchto replik a jejich přechodů stavu.

Spolehlivé kolekce můžou ukládat libovolný typ rozhraní .NET, včetně vašich vlastních typů, s několika upozorněními:

  • Service Fabric zajišťuje vysokou dostupnost stavu prostřednictvím replikace stavu mezi uzly a spolehlivé kolekce ukládají vaše data na místní disk v každé replice. To znamená, že vše, co je uložené ve spolehlivých kolekcích, musí být serializovatelné. Ve výchozím nastavení reliable collections používají DataContract pro serializaci, takže je důležité zajistit, aby vaše typy byly podporovány serializátorem kontraktu dat při použití výchozího serializátoru.

  • Objekty se replikují pro zajištění vysoké dostupnosti při potvrzení transakcí ve spolehlivých kolekcích. Objekty uložené ve spolehlivých kolekcích se ve vaší službě uchovávají v místní paměti. To znamená, že máte místní odkaz na objekt.

    Je důležité, abyste nemutovat místní instance těchto objektů bez provedení operace aktualizace spolehlivé kolekce v transakci. Důvodem je to, že změny místních instancí objektů nebudou replikovány automaticky. Musíte objekt znovu vložit zpět do slovníku nebo použít některou z metod aktualizace ve slovníku.

Správce spolehlivého stavu spravuje spolehlivé kolekce za vás. Reliable State Manager můžete kdykoli a na libovolném místě ve vaší službě jednoduše požádat o spolehlivou kolekci podle názvu. Reliable State Manager zajistí, že získáte zpět odkaz. Nedoporučujeme ukládat odkazy na spolehlivé instance kolekce do proměnných nebo vlastností členů třídy. Zvláštní pozornost je potřeba věnovat tomu, aby odkaz byl nastaven na instanci vždy v průběhu životního cyklu služby. Reliable State Manager se o tuto práci stará za vás a je optimalizovaný pro opakované návštěvy.

Transakční a asynchronní operace

using (ITransaction tx = this.StateManager.CreateTransaction())
{
    var result = await myDictionary.TryGetValueAsync(tx, "Counter-1");

    await myDictionary.AddOrUpdateAsync(tx, "Counter-1", 0, (k, v) => ++v);

    await tx.CommitAsync();
}

Spolehlivé kolekce mají mnoho stejných operací jako jejich System.Collections.Generic protějšky, System.Collections.Concurrent s výjimkou jazyka LINQ (Language Integrated Query). Operace se spolehlivými kolekcemi jsou asynchronní. Důvodem je to, že operace zápisu se spolehlivými kolekcemi provádějí vstupně-výstupní operace za účelem replikace a uchování dat na disk.

Operace spolehlivého shromažďování jsou transakční, takže můžete udržovat konzistentní stav napříč několika spolehlivými kolekcemi a operacemi. Můžete například vyřadit pracovní položku ze spolehlivé fronty, provést s ní operaci a uložit výsledek do spolehlivého slovníku, a to vše v rámci jedné transakce. Tato operace je považována za atomická operace a zaručuje, že buď bude celá operace úspěšná, nebo se vrátí zpět. Pokud dojde k chybě po vyřazení položky z fronty, ale před uložením výsledku, je celá transakce vrácena zpět a položka zůstane ve frontě pro zpracování.

Spuštění aplikace

Teď se vrátíme k aplikaci HelloWorld . Teď můžete sestavovat a nasazovat služby. Když stisknete klávesu F5, vaše aplikace se sestaví a nasadí do místního clusteru.

Po spuštění služeb můžete zobrazit vygenerované události Trasování událostí pro Windows v okně Diagnostické události . Všimněte si, že zobrazené události pocházejí z bezstavové služby i stavové služby v aplikaci. Stream můžete pozastavit kliknutím na tlačítko Pozastavit . Podrobnosti zprávy pak můžete prozkoumat tak, že zprávu rozbalíte.

Poznámka

Před spuštěním aplikace se ujistěte, že máte spuštěný místní vývojový cluster. Informace o nastavení místního prostředí najdete v příručce Začínáme .

Zobrazení diagnostických událostí v sadě Visual Studio

Další kroky

Ladění aplikace Service Fabric v sadě Visual Studio

Začínáme: Služby webového rozhraní API Service Fabric s samoobslužným hostováním OWIN

Další informace o Reliable Collections

Nasazení aplikace

Upgrade aplikace

Referenční informace pro vývojáře pro Reliable Services