Share via


Ismerkedés a Reliable Services használatával

Az Azure Service Fabric-alkalmazások egy vagy több kódot futtató szolgáltatást tartalmaznak. Ez az útmutató bemutatja, hogyan hozhat létre állapot nélküli és állapotalapú Service Fabric-alkalmazásokat a Reliable Services használatával.

Ezen az oldalon talál egy oktatóvideót, amely azt is bemutatja, hogyan hozhat létre állapot nélküli Reliable szolgáltatást.

Alapfogalmak

A Reliable Services használatának megkezdéséhez csak néhány alapfogalmat kell ismernie:

  • Szolgáltatás típusa: Ez a szolgáltatás implementációja. A nevet és a verziószámot az ön által írt osztály határozza meg, amely kiterjeszti StatelessService a kódot és az abban használt egyéb kódot vagy függőségeket.
  • Nevesített szolgáltatáspéldány: A szolgáltatás futtatásához a szolgáltatástípus nevesített példányait hozza létre, ugyanúgy, mint egy osztálytípusú objektumpéldányokat. A szolgáltatáspéldányok neve URI-ként jelenik meg a "fabric:/" használatával séma, például "fabric:/MyApp/MyService".
  • Szolgáltatás gazdagépe: A létrehozott nevesített szolgáltatáspéldányoknak egy gazdagépfolyamaton belül kell futniuk. A szolgáltatás gazdagépe csak egy olyan folyamat, amelyben a szolgáltatás példányai futtathatók.
  • Szolgáltatásregisztráció: A regisztráció mindent összehoz. A szolgáltatástípust regisztrálni kell a Service Fabric-futtatókörnyezetben egy szolgáltatásgazdagépen, hogy a Service Fabric létrehozhasson példányokat a futtatásához.

Állapot nélküli szolgáltatás létrehozása

Az állapot nélküli szolgáltatások olyan szolgáltatástípusok, amelyek jelenleg a felhőalkalmazásokban megszokottak. Állapot nélkülinek minősül, mert maga a szolgáltatás nem tartalmaz olyan adatokat, amelyeket megbízhatóan kell tárolni vagy magas rendelkezésre állásúvá tenni. Ha egy állapot nélküli szolgáltatás egy példánya leáll, az összes belső állapota elvész. Ebben a szolgáltatástípusban az állapotot meg kell őrizni egy külső tárolóban, például az Azure Tablesben vagy SQL Database, hogy magas rendelkezésre állásúvá és megbízhatóvá lehessen tenni.

Indítsa el rendszergazdaként a Visual Studio 2017-et vagy a Visual Studio 2019-et, és hozzon létre egy új Service Fabric-alkalmazásprojektet HelloWorld néven:

Új Service Fabric-alkalmazás létrehozása az Új projekt párbeszédpanelen

Ezután hozzon létre egy állapot nélküli szolgáltatási projektet a HelloWorldStateless nevű .NET Core 2.0 használatával:

A második párbeszédpanelen hozzon létre egy állapot nélküli szolgáltatásprojektet

A megoldás most két projektet tartalmaz:

  • HelloWorld. Ez az az alkalmazásprojekt , amely a szolgáltatásokat tartalmazza. Emellett tartalmazza az alkalmazást leíró alkalmazásjegyzéket, valamint számos Olyan PowerShell-szkriptet, amelyek segítenek az alkalmazás üzembe helyezésében.
  • HelloWorldStateless. Ez a szolgáltatásprojekt. Az állapot nélküli szolgáltatás implementációját tartalmazza.

A szolgáltatás implementálása

Nyissa meg a HelloWorldStateless.cs fájlt a szolgáltatásprojektben. A Service Fabricben a szolgáltatás bármilyen üzleti logikát futtathat. A szolgáltatás API két belépési pontot biztosít a kódhoz:

  • Egy RunAsync nevű nyílt végű belépési pont metódus, ahol megkezdheti a számítási feladatok végrehajtását, beleértve a hosszú ideig futó számítási feladatokat is.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
    ...
}
  • Kommunikációs belépési pont, ahol csatlakoztathatja a választott kommunikációs vermet, például ASP.NET Core. Itt kezdheti el a felhasználóktól és más szolgáltatásoktól érkező kérések fogadását.
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    ...
}

Ebben az oktatóanyagban a RunAsync() belépési pont metódusára fogunk összpontosítani. Itt kezdheti el azonnal futtatni a kódot. A projektsablon tartalmaz egy mintaimplementációt, amely növeli a működés közbeni RunAsync() számot.

Megjegyzés

A kommunikációs verem használatáról további információt a Szolgáltatáskommunikáció 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);
    }
}

A platform akkor hívja meg ezt a metódust, ha egy szolgáltatás egy példánya üzembe van helyezve, és készen áll a végrehajtásra. Állapot nélküli szolgáltatás esetén ez egyszerűen azt jelenti, hogy a szolgáltatáspéldány meg van nyitva. A rendszer egy lemondási jogkivonatot biztosít, amely koordinálja, hogy mikor kell bezárni a szolgáltatáspéldányt. A Service Fabricben a szolgáltatáspéldányok nyitott/záró ciklusa a szolgáltatás teljes élettartama során sokszor előfordulhat. Ez számos okból történhet, például:

  • A rendszer áthelyezi a szolgáltatáspéldányokat az erőforrás-kiegyensúlyozáshoz.
  • Hibák történnek a kódban.
  • Az alkalmazás vagy a rendszer frissítve van.
  • A mögöttes hardver szolgáltatáskimaradást tapasztal.

Ezt a vezénylést a rendszer felügyeli, hogy a szolgáltatás magas rendelkezésre állású és megfelelően kiegyensúlyozott maradjon.

RunAsync() nem tilthatja le szinkronban. A RunAsync implementációjának egy feladatot kell visszaadnia, vagy várnia kell a hosszú ideig futó vagy blokkoló műveletekre, hogy a futtatókörnyezet folytatódhasson. Figyelje meg, hogy az előző példában a while(true) ciklusban feladat-visszatérést await Task.Delay() használunk. Ha a számítási feladatnak szinkron módon kell blokkolnia, ütemezzen egy új feladatot Task.Run() az RunAsync implementációban.

A számítási feladat megszakítása a megadott lemondási jogkivonat által vezényelt együttműködési erőfeszítés. A rendszer megvárja, amíg a feladat befejeződik (sikeres befejezéssel, megszakítással vagy hibával), mielőtt továbblép. Fontos, hogy betartsa a lemondási jogkivonatot, fejezze be a munkát, és a lehető leggyorsabban lépjen ki RunAsync() , amikor a rendszer lemondást kér.

Ebben az állapot nélküli szolgáltatás példában a szám egy helyi változóban van tárolva. Mivel azonban ez egy állapot nélküli szolgáltatás, a tárolt érték csak a szolgáltatáspéldány aktuális életciklusára vonatkozik. Amikor a szolgáltatás áthelyeződik vagy újraindul, az érték elveszik.

Állapotalapú szolgáltatás létrehozása

A Service Fabric egy új, állapotalapú szolgáltatást vezet be. Az állapotalapú szolgáltatás képes megbízhatóan fenntartani az állapotot magában a szolgáltatásban, és az azt használó kóddal együtt elhelyezve. Az állapotot a Service Fabric magas rendelkezésre állásúvá tette anélkül, hogy meg kellene őriznie az állapotot egy külső tárolóban.

Ha állapot nélküliről magas rendelkezésre állásúra és állandóra szeretne konvertálni egy számlálóértéket, még akkor is, ha a szolgáltatás átáll vagy újraindul, állapotalapú szolgáltatásra van szükség.

Ugyanabban a HelloWorld alkalmazásban hozzáadhat egy új szolgáltatást, ha a jobb gombbal az alkalmazásprojekt Szolgáltatások hivatkozására kattint, majd a Hozzáadás –> Új Service Fabric-szolgáltatás lehetőséget választja.

Szolgáltatás hozzáadása a Service Fabric-alkalmazáshoz

Válassza a .NET Core 2.0 –> Állapotalapú szolgáltatás lehetőséget, és adja neki a HelloWorldStateful nevet. Kattintson az OK gombra.

Új Állapotalapú Service Fabric-szolgáltatás létrehozása az Új projekt párbeszédpanelen

Az alkalmazásnak most két szolgáltatással kell rendelkeznie: a HelloWorldStateless állapot nélküli szolgáltatással és a HelloWorldStateful állapotalapú szolgáltatással.

Az állapotalapú szolgáltatások ugyanazokat a belépési pontokat biztosítják, mint az állapot nélküli szolgáltatások. A fő különbség egy olyan állapotszolgáltató rendelkezésre állása, amely megbízhatóan képes tárolni az állapotot. A Service Fabric egy Reliable Collections nevű állapotszolgáltatói implementációval rendelkezik, amely lehetővé teszi replikált adatstruktúrák létrehozását a Reliable State Manageren keresztül. Az állapotalapú Reliable Szolgáltatás alapértelmezés szerint ezt az állapotszolgáltatót használja.

Nyissa meg a HelloWorldStateful.cs fájlt a HelloWorldStateful fájlban, amely a következő RunAsync metódust tartalmazza:

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() hasonlóan működik állapotalapú és állapot nélküli szolgáltatásokban. Az állapotalapú szolgáltatásokban azonban a platform további műveleteket végez az Ön nevében, mielőtt végrehajtja a következőt RunAsync(): . Ez a munka magában foglalhatja annak biztosítását, hogy a Reliable State Manager és a Reliable Collections használatra kész legyen.

Reliable Collections és a Reliable State Manager

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

Az IReliableDictionary egy szótár-implementáció, amellyel megbízhatóan tárolhatja az állapotot a szolgáltatásban. A Service Fabric és a Reliable Collections segítségével az adatokat közvetlenül a szolgáltatásban tárolhatja anélkül, hogy külső állandó tárolóra van szükség. A Reliable Collections magas rendelkezésre állásúvá teszi az adatokat. A Service Fabric ezt a szolgáltatás több replikájának létrehozásával és kezelésével éri el. Emellett egy API-t is biztosít, amely elvonja a replikák kezelésének és állapotváltásainak bonyolultságait.

A Reliable Collections bármilyen .NET-típust tárolhat, beleértve az egyéni típusokat is, néhány kikötéssel:

  • A Service Fabric magas rendelkezésre állásúvá teszi az állapotot a csomópontok közötti replikálással , a Reliable Collections pedig minden replikán tárolja az adatokat a helyi lemezen. Ez azt jelenti, hogy a Reliable Collectionsben tárolt összes elemnek szerializálhatónak kell lennie. A Reliable Collections alapértelmezés szerint a DataContractot használja a szerializáláshoz, ezért fontos, hogy az alapértelmezett szerializáló használatakor az Adatszerződés szerializálója támogassa a típusokat.

  • A rendszer replikálja az objektumokat a magas rendelkezésre állás érdekében, amikor tranzakciókat véglegesíti a Reliable Collections szolgáltatásban. A Reliable Collectionsben tárolt objektumok a szolgáltatás helyi memóriájában vannak tárolva. Ez azt jelenti, hogy helyi hivatkozással rendelkezik az objektumra.

    Fontos, hogy ne mutálja az objektumok helyi példányait anélkül, hogy frissítési műveletet hajtanak végre a megbízható gyűjteményen egy tranzakcióban. Ennek az az oka, hogy az objektumok helyi példányainak módosításai nem lesznek automatikusan replikálva. Újra be kell szúrnia az objektumot a szótárba, vagy a szótár egyik frissítési módszerét kell használnia.

A Reliable State Manager megbízható gyűjteményeket kezel Önnek. Egyszerűen kérhet megbízható gyűjteményt a Reliable State Managertől név szerint, bármikor és a szolgáltatás bármely helyén. A Reliable State Manager biztosítja, hogy visszakapja a referenciát. Nem javasoljuk, hogy a megbízható gyűjteménypéldányokra mutató hivatkozásokat mentse az osztálytag változóiban vagy tulajdonságaiban. Különös figyelmet kell fordítani annak biztosítására, hogy a hivatkozás a szolgáltatás életciklusában mindenkor egy példányra legyen állítva. A Reliable State Manager kezeli ezt a munkát, és az ismétlődő látogatásokhoz van optimalizálva.

Tranzakciós és aszinkron műveletek

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

A megbízható gyűjtemények számos olyan műveletet hajtanak System.Collections.Generic végre, mint az ő és System.Collections.Concurrent a társaik, kivéve a Language Integrated Queryt (LINQ). A Reliable Collections műveletei aszinkronok. Ennek az az oka, hogy a Reliable Collections írási műveletei I/O-műveleteket hajtanak végre az adatok lemezre történő replikálásához és megőrzéséhez.

A megbízható gyűjteményműveletek tranzakciós jellegűek, így több megbízható gyűjtemény és művelet állapotkonzisztens marad. Például leküldhet egy munkaelemet egy megbízható üzenetsorból, végrehajthat rajta egy műveletet, és mentheti az eredményt egy megbízható szótárba, mindezt egyetlen tranzakcióban. Ez atomi műveletként van kezelve, és garantálja, hogy a teljes művelet sikeres lesz, vagy a teljes művelet vissza fog gördülni. Ha hiba történik az elem törlése után, de az eredmény mentése előtt a rendszer visszaállítja a teljes tranzakciót, és az elem a feldolgozásra váró várólistán marad.

Az alkalmazás futtatása

Most visszatérünk a HelloWorld alkalmazáshoz. Most már létrehozhatja és üzembe helyezheti szolgáltatásait. Az F5 billentyű lenyomásakor az alkalmazás a helyi fürtön lesz felépítve és üzembe helyezve.

Miután a szolgáltatások elkezdenek futni, megtekintheti a Létrehozott Eseménykövetés windowsos (ETW) eseményeket a Diagnosztikai események ablakban. Vegye figyelembe, hogy a megjelenített események az állapot nélküli szolgáltatásból és az alkalmazás állapotalapú szolgáltatásából származnak. A streamet a Szüneteltetés gombra kattintva szüneteltetheti. Ezután az üzenet részleteinek vizsgálatához bontsa ki az üzenetet.

Megjegyzés

Az alkalmazás futtatása előtt győződjön meg arról, hogy fut egy helyi fejlesztői fürt. A helyi környezet beállításával kapcsolatos információkért tekintse meg az első lépéseket ismertető útmutatót .

Diagnosztikai események megtekintése a Visual Studióban

Következő lépések

A Service Fabric-alkalmazás hibakeresése a Visual Studióban

Első lépések: Service Fabric Web API-szolgáltatások az OWIN önkiszolgáló üzemeltetésével

További információ a megbízható gyűjteményekről

Alkalmazás üzembe helyezése

Alkalmazásfrissítés

Fejlesztői referencia a Reliable Serviceshez