Megosztás a következőn keresztül:


A Reliable Services használatának első lépései a Javában

Ez a cikk az Azure Service Fabric Reliable Services alapjait ismerteti, és végigvezeti a Java nyelven írt egyszerű Reliable Service-alkalmazások létrehozásán és üzembe helyezésén.

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

Telepítés és beállítás

A kezdés előtt győződjön meg arról, hogy be van állítva a Service Fabric fejlesztői környezet a gépen. Ha be kell állítania, nyissa meg a Mac gép első lépéseit vagy a Linuxon való első lépéseket.

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. Ezt az ön által írt osztály határozza meg, amely kiterjeszti StatelessService , valamint az ott használt bármely más kódot vagy függőséget, valamint egy nevet és egy verziószámot.
  • Elnevezett 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 valójában az Ön által írt szolgáltatásosztály objektumpéldányai.
  • Szolgáltatás gazdagépe: A létrehozott megnevezett szolgáltatáspéldányokat egy gazdagépen belül kell futtatni. A szolgáltatásgazda 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ás gazdagépen, hogy a Service Fabric létrehozhasson példányokat a futtatásához.

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

Először hozzon létre egy Service Fabric-alkalmazást. A Linuxhoz készült Service Fabric SDK tartalmaz egy Yeoman-generátort, amely állapot nélküli szolgáltatással biztosítja a Service Fabric-alkalmazások állványzatát. Először futtassa a következő Yeoman parancsot:

$ yo azuresfjava

Kövesse az utasításokat egy Megbízható állapot nélküli szolgáltatás létrehozásához. Ebben az oktatóanyagban nevezze el a "HelloWorldApplication" alkalmazást és a "HelloWorld" szolgáltatást. Az eredmény tartalmazza az és HelloWorlda HelloWorldApplication könyvtárát.

HelloWorldApplication/
├── build.gradle
├── HelloWorld
│   ├── build.gradle
│   └── src
│       └── statelessservice
│           ├── HelloWorldServiceHost.java
│           └── HelloWorldService.java
├── HelloWorldApplication
│   ├── ApplicationManifest.xml
│   └── HelloWorldPkg
│       ├── Code
│       │   ├── entryPoint.sh
│       │   └── _readme.txt
│       ├── Config
│       │   └── _readme.txt
│       ├── Data
│       │   └── _readme.txt
│       └── ServiceManifest.xml
├── install.sh
├── settings.gradle
└── uninstall.sh

Szolgáltatásregisztráció

A szolgáltatástípusokat regisztrálni kell a Service Fabric-futtatókörnyezetben. A szolgáltatástípus a és a ServiceManifest.xml implementálható szolgáltatásosztályban van definiálva StatelessService. A szolgáltatásregisztráció a folyamat fő belépési pontján történik. Ebben a példában a folyamat fő belépési pontja a következő HelloWorldServiceHost.java:

public static void main(String[] args) throws Exception {
    try {
        ServiceRuntime.registerStatelessServiceAsync("HelloWorldType", (context) -> new HelloWorldService(), Duration.ofSeconds(10));
        logger.log(Level.INFO, "Registered stateless service type HelloWorldType.");
        Thread.sleep(Long.MAX_VALUE);
    }
    catch (Exception ex) {
        logger.log(Level.SEVERE, "Exception in registration:", ex);
        throw ex;
    }
}

A szolgáltatás implementálása

Nyissa meg a HelloWorldApplication/HelloWorld/src/statelessservice/HelloWorldService.java fájlt. Ez az osztály határozza meg a szolgáltatás típusát, és bármilyen kódot futtathat. A szolgáltatás API két belépési pontot biztosít a kódhoz:

  • Egy nyílt végű belépésipont-metódus, amelynek a neve runAsync(), ahol megkezdheti a számítási feladatok végrehajtását, beleértve a hosszú ideig futó számítási feladatokat is.
@Override
protected CompletableFuture<?> runAsync(CancellationToken cancellationToken) {
    ...
}
  • Egy kommunikációs belépési pont, ahol csatlakoztathatja a választott kommunikációs vermet. Itt kezdheti el a kérések fogadását a felhasználóktól és más szolgáltatásoktól.
@Override
protected List<ServiceInstanceListener> createServiceInstanceListeners() {
    ...
}

Ez az oktatóanyag a runAsync() belépési pont metódusával foglalkozik. Itt kezdheti el azonnal futtatni a kódot.

RunAsync

A platform meghívja ezt a metódust, amikor egy szolgáltatáspéldányt helyeznek el, és készen állnak a végrehajtásra. Állapot nélküli szolgáltatás esetén ez azt jelenti, hogy a szolgáltatáspéldány meg van nyitva. A rendszer egy lemondási jogkivonatot biztosít, amely koordinálja a szolgáltatáspéldány bezárását. A Service Fabricben a szolgáltatáspéldányok nyitott/záró ciklusa a szolgáltatás egészének élettartama során sokszor fordulhat elő. Ez többféle okból is történhet, például:

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

Ezt a vezénylést a Service Fabric 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 CompletableFuture értéket kell visszaadnia, amely lehetővé teszi a futtatókörnyezet folytatását. Ha a számítási feladatnak egy hosszú ideig futó feladatot kell implementálnia, amelyet a CompletableFuture-ben kell elvégeznie.

Lemondás

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 tiszteletben tartani a lemondási jogkivonatot, befejezni a munkát, és a lehető leggyorsabban kilépni runAsync() , amikor a rendszer lemondást kér. Az alábbi példa bemutatja, hogyan kezelhetők a lemondási események:

@Override
protected CompletableFuture<?> 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.

    return CompletableFuture.runAsync(() -> {
        long iterations = 0;
        while(true)
        {
        cancellationToken.throwIfCancellationRequested();
        logger.log(Level.INFO, "Working-{0}", ++iterations);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex){}
        }
    });
}

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 típusú szolgáltatást vezet be, amely állapotalapú. Az állapotalapú szolgáltatások megbízhatóan képesek fenntartani az állapotot magában a szolgáltatásban, és együtt találhatók az azt használó kóddal. Az állapotot a Service Fabric magas rendelkezésre állásúvá tette anélkül, hogy az állapotot egy külső tárolóban kellene tárolnia.

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 mozog vagy újraindul, állapotalapú szolgáltatásra van szüksége.

A HelloWorld alkalmazással megegyező könyvtárban új szolgáltatást adhat hozzá a yo azuresfjava:AddService parancs futtatásával. Válassza ki a keretrendszerhez tartozó "Reliable Stateful Service" (Megbízható állapotalapú szolgáltatás) lehetőséget, és nevezze el a "HelloWorldStateful" szolgáltatást.

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

Az állapotalapú szolgáltatások belépési pontjai megegyeznek az állapot nélküli szolgáltatásokkal. 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, amellyel replikált adatstruktúrákat hozhat létre a Reliable State Manageren keresztül. Az állapotalapú Reliable Service alapértelmezés szerint ezt az állapotszolgáltatót használja.

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

@Override
protected CompletableFuture<?> runAsync(CancellationToken cancellationToken) {
    Transaction tx = stateManager.createTransaction();
    return this.stateManager.<String, Long>getOrAddReliableHashMapAsync("myHashMap").thenCompose((map) -> {
        return map.computeAsync(tx, "counter", (k, v) -> {
            if (v == null)
                return 1L;
            else
                return ++v;
            }, Duration.ofSeconds(4), cancellationToken)
                .thenCompose((r) -> tx.commitAsync())
                .whenComplete((r, e) -> {
            try {
                tx.close();
            } catch (Exception e) {
                logger.log(Level.SEVERE, e.getMessage());
            }
        });
    });
}

RunAsync

RunAsync() állapotalapú és állapot nélküli szolgáltatásokban is hasonlóan működik. Az állapotalapú szolgáltatásban azonban a platform további munkát végez az Ön nevében, mielőtt végrehajtja 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

ReliableHashMap<String,Long> map = this.stateManager.<String, Long>getOrAddReliableHashMapAsync("myHashMap")

A ReliableHashMap egy szótár-implementáció, amellyel megbízhatóan tárolhatja az állapotot a szolgáltatásban. A Service Fabric és a Reliable HashMaps segítségével az adatokat közvetlenül a szolgáltatásban tárolhatja anélkül, hogy külső állandó tárra van szükség. A megbízható hashMaps 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 valósítja meg. Emellett egy API-t is biztosít, amely elvonja a replikák kezelésének és állapotváltásainak bonyolultságait.

A megbízható gyűjtemények bármilyen Java-típust tárolhatnak, beleértve az egyéni típusokat is, néhány kivétellel:

  • A Service Fabric magas rendelkezésre állásúvá teszi az állapotot a csomópontok közötti replikálással , a Reliable HashMap pedig minden replikán tárolja az adatokat a helyi lemezen. Ez azt jelenti, hogy a Reliable HashMaps-ben tárolt mindennek szerializálhatónak kell lennie.

  • A rendszer replikálja az objektumokat a magas rendelkezésre állás érdekében, amikor tranzakciókat véglegesíti a megbízható kivonattérképeken. A Reliable HashMapsben 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. Vissza kell helyeznie 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 a Reliable HashMapst kezeli. A Reliable State Managertől bármikor és a szolgáltatás bármely helyén kérhet megbízható gyűjteményt név szerint. 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ásokra van optimalizálva.

Tranzakciós és aszinkron műveletek

return map.computeAsync(tx, "counter", (k, v) -> {
    if (v == null)
        return 1L;
    else
        return ++v;
    }, Duration.ofSeconds(4), cancellationToken)
        .thenCompose((r) -> tx.commitAsync())
        .whenComplete((r, e) -> {
    try {
        tx.close();
    } catch (Exception e) {
        logger.log(Level.SEVERE, e.getMessage());
    }
});

A Reliable HashMaps-műveletek 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 Reliable HashMap-műveletek tranzakciósak, így több Megbízható kivonattérkép és művelet állapotkonzisztens állapotot biztosít. Lekérhet például egy munkaelemet egy Reliable Dictionaryből, végrehajthat rajta egy műveletet, és mentheti az eredményt egy másik Reliable HashMap-ba, mindezt egyetlen tranzakción belül. 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ási várólistán marad.

Az alkalmazás létrehozása

A Yeoman-állványzat tartalmaz egy gradle-szkriptet, amely létrehozza az alkalmazást és bash-szkripteket az alkalmazás üzembe helyezéséhez és eltávolításához. Az alkalmazás futtatásához először hozza létre az alkalmazást a gradle használatával:

$ gradle

Ez létrehoz egy Service Fabric-alkalmazáscsomagot, amely a Service Fabric parancssori felületével helyezhető üzembe.

Az alkalmazás üzembe helyezése

Az alkalmazást a létrehozása után telepítheti a helyi fürtben.

  1. Csatlakozzon a helyi Service Fabric-fürthöz.

    sfctl cluster select --endpoint http://localhost:19080
    
  2. Futtassa a sablonban megadott telepítési szkriptet az alkalmazáscsomagnak a fürt lemezképtárolójába való másolásához, regisztrálja az alkalmazás típusát, és hozza létre az alkalmazás egy példányát.

    ./install.sh
    

A kész alkalmazás a többi Service Fabric-alkalmazással azonos módon telepíthető. Részletesebb útmutatást talál a Service Fabric-alkalmazás kezelése a Service Fabric parancssori felülettel című dokumentációban.

Ezen parancsok paraméterezése megtalálható az alkalmazáscsomagon belül, a generált jegyzékfájlokban.

Az alkalmazás telepítése után nyisson meg egy böngészőt, és keresse fel a Service Fabric Explorert a http://localhost:19080/Explorer URL-címen. Bontsa ki az Alkalmazások csomópontot, és figyelje meg, hogy most már megjelenik benne egy bejegyzés az alkalmazás típusához, és egy másik a típus első példányához.

Fontos

Ahhoz, hogy az alkalmazást biztonságos Linux-fürtön helyezze üzembe az Azure-ban, konfigurálnia kell egy tanúsítványt az alkalmazás Service Fabric-futtatókörnyezettel való érvényesítéséhez. Ezzel lehetővé teszi, hogy a Reliable Services-szolgáltatások kommunikáljanak a mögöttes Service Fabric futtatókörnyezeti API-kkal. További információ: Reliable Services-alkalmazás konfigurálása Linux-fürtökön való futtatásra.

Következő lépések