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.
Základní koncepty
Pokud chcete začít se službou Reliable Services, stačí pochopit jen několik základních konceptů:
- Typ služby: Toto je implementace služby. Je definována třídou, kterou napíšete, která rozšiřuje
StatelessService
a všechny ostatní kódy nebo závislosti použité v ní spolu s názvem a číslem verze. - Pojmenovaná instance služby: Chcete-li spustit službu, vytvoříte pojmenované instance typu služby, podobně jako vytváříte instance objektů typu třídy. Instance služby má název ve formě identifikátoru URI pomocí schématu fabric:/, například fabric:/MyApp/MyService.
- Hostitel služby: Pojmenované instance služby, které vytvoříte, musí běžet uvnitř hostitelského procesu. Hostitel služby je jen proces, ve kterém se můžou spouštět 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. Je považován za bezstavovou, protože samotná služba neobsahuje data, která je potřeba spolehlivě uložit nebo zpřístupnit vysoce dostupná. Pokud se instance bezstavové služby vypne, ztratí se veškerý její vnitřní stav. V tomto typu služby musí být stav trvalý v externím úložišti, jako jsou tabulky Azure nebo SQL Database, aby byl 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:
Pak vytvořte bezstavový projekt služby pomocí .NET Core 2.0 s názvem HelloWorldStateless:
Ř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 také řadu skriptů PowerShellu, které vám pomůžou nasadit aplikaci.
- HelloWorldStateless. Toto je projekt služby. Obsahuje bezstavovou implementaci služby.
Implementace služby
Otevřete soubor HelloWorldStateless.cs v projektu služby. Ve službě Service Fabric může služba spouštět jakoukoli 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)
{
...
}
- Vstupní bod komunikace, kde 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 se zásobníkem komunikace, najdete v tématu Komunikace se službou 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í. Pro bezstavovou službu to jednoduše znamená, že když je instance služby otevřena. Token zrušení se poskytuje ke koordinaci, kdy je potřeba uzavřít instanci služby. V Service Fabric může k tomuto otevřenému/zavření instance služby dojít mnohokrát po 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.
- Základní hardware má výpadek.
Tuto orchestraci spravuje systém, aby vaše služba byla vysoce dostupná a správně vyvážená.
RunAsync()
by nemělo být synchronně blokované. Vaše implementace runAsync by měla vrátit úlohu nebo čekat na jakékoli dlouhotrvající nebo blokující operace, aby modul runtime mohl pokračovat. Všimněte si ve while(true)
smyčce v předchozím příkladu, použije se vrácení await Task.Delay()
úkolu. Pokud vaše úloha musí být synchronně blokovaná, měli byste v RunAsync
implementaci naplánovat nový úkolTask.Run()
.
Zrušení úlohy je spolupráce orchestrovaná poskytnutým tokenem zrušení. Systém bude čekat na dokončení úkolu (úspěšným dokončením, zrušením nebo chybou), než se přesune dál. Je důležité respektovat token zrušení, dokončit veškerou 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é. Vzhledem k tomu, že se jedná o bezstavovou službu, existuje hodnota uložená pouze pro aktuální životní cyklus 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 rámci samotné služby společně s kódem, který ji používá. Service Fabric má stav vysoce dostupný, aniž by bylo nutné zachovat 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 kliknete pravým tlačítkem na odkazy na služby v projektu aplikace a vyberete Přidat –> nová služba Service Fabric.
Vyberte .NET Core 2.0 –> Stavová služba a pojmenujte ji HelloWorldStateful. Klikněte na OK.
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í zprostředkovatele stavu s názvem Reliable Collections, která umožňuje vytvářet replikované datové struktury prostřednictvím Správce spolehlivého stavu. Stavová spolehlivá služba ve výchozím nastavení používá tohoto zprostředkovatele 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 provádí další práci vaším jménem před spuštěním RunAsync()
. Tato práce může zahrnovat zajištění připravenosti správce spolehlivého stavu a spolehlivých kolekcí.
Spolehlivé kolekce a Správce spolehlivého stavu
var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");
IReliableDictionary je implementace slovníku, kterou můžete použít k spolehlivému ukládání stavu ve službě. Pomocí Service Fabric a spolehlivých kolekcí můžete data ukládat přímo ve službě bez nutnosti externího trvalého úložiště. Spolehlivé kolekce umožňují vysokou dostupnost dat. Service Fabric toho dosahuje vytvořením a správou více replik vaší služby za vás. 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 .NET, včetně vašich vlastních typů, s několika upozorněními:
Service Fabric zpřístupňuje váš stav tak, že replikuje stav mezi uzly a Reliable Collections ukládá data na místní disk na jednotlivých replikách. To znamená, že vše, co je uloženo ve spolehlivých kolekcích, musí být serializovatelné. Reliable Collections ve výchozím nastavení 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í 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 uchovávají v místní paměti ve vaší službě. To znamená, že máte místní odkaz na objekt.
Je důležité, abyste neztlumily 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ů se nebudou replikovat automaticky. Objekt musíte znovu vložit do slovníku nebo použít některou z aktualizačních metod ve slovníku.
Správce spolehlivého stavu spravuje spolehlivé kolekce za vás. Správce spolehlivého stavu můžete kdykoliv a na libovolném místě ve vaší službě požádat o spolehlivou kolekci. Správce spolehlivého stavu zajišťuje, že získáte odkaz zpět. Nedoporučujeme ukládat odkazy na spolehlivé instance kolekce v proměnných nebo vlastnostech členů třídy. Je třeba věnovat zvláštní pozornost tomu, aby byl odkaz nastaven na instanci vždy v životním cyklu služby. Správce spolehlivého stavu tuto práci zpracovává 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í, které jejich System.Collections.Generic
a System.Collections.Concurrent
protějšky dělají, s výjimkou jazykových integrovaných dotazů (LINQ). 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 pro replikaci a zachování dat na disk.
Spolehlivé operace shromažďování jsou transakční, takže můžete zachovat konzistentní stav napříč několika spolehlivými kolekcemi a operacemi. Můžete například odložit pracovní položku ze spolehlivé fronty, provést operaci s ní a uložit výsledek do Reliable Dictionary, a to vše v rámci jedné transakce. Jedná se o atomické operace a zaručuje, že buď celá operace bude úspěšná, nebo se celá operace vrátí zpět. Pokud dojde k chybě po vyřazení položky z fronty, ale před uložením výsledku se celá transakce vrátí zpět a položka zůstane ve frontě ke zpracování.
Spuštění aplikace
Teď se vrátíme do aplikace HelloWorld . Teď můžete sestavovat a nasazovat služby. Po stisknutí klávesy F5 se vaše aplikace sestaví a nasadí do místního clusteru.
Po spuštění služeb můžete v okně Diagnostických událostí zobrazit vygenerované události trasování událostí pro Windows (ETW). 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 tuto 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.
Další kroky
Ladění aplikace Service Fabric v sadě Visual Studio
Začínáme: Služby webového rozhraní API Service Fabric s využitím samoobslužného hostování OWIN