Kiszolgáló kecses leállítása

A Microsoft Azure SignalR Service két módot biztosít a SignalR Hub-kiszolgáló kecses leállításához, ha az Azure SignalR Service alapértelmezett módként van konfigurálva, amelyet az Azure SignalR Szolgáltatás proxyként használ a SignalR-ügyfelek és a SignalR Hub-kiszolgáló között.

A funkció használatának fő előnye, hogy megakadályozza, hogy az ügyfél váratlan kapcsolatcsökkenést tapasztaljon.

Ehelyett megvárhatja, amíg az ügyfélkapcsolatok bezárulnak az üzleti logikával kapcsolatban, vagy akár át is migrálhatja az ügyfélkapcsolatot egy másik kiszolgálóra adatok elvesztése nélkül.

How it works

Egy kecses leállítási folyamatnak általában négy szakasza lesz:

  1. A kiszolgáló offline beállítása

    Ez azt jelenti, hogy nem lesz több ügyfélkapcsolat erre a kiszolgálóra irányítva.

  2. Triggerhook OnShutdown

    A leállítási horgokat regisztrálhatja minden olyan központhoz, amely a kiszolgálón található. A rendszer közvetlenül azután hívja meg őket a regisztrált megrendeléssel kapcsolatban, hogy finACK-választ kaptunk az Azure SignalR szolgáltatástól, ami azt jelenti, hogy ez a kiszolgáló offline állapotba lett állítva az Azure SignalR szolgáltatásban.

    Küldhet üzeneteket, vagy elvégezhet néhány tisztítási feladatot ebben a szakaszban, ha az összes leállítási horog végrehajtása megtörtént, a következő szakaszra lépünk.

  3. Várjon, amíg az összes ügyfélkapcsolat befejeződik, a választott módtól függően a következő lehet:

    Mode set to WaitForClientsToClose

    Az Azure SignalR szolgáltatás meglévő ügyfeleket fog tárolni.

    Előfordulhat, hogy meg kell terveznie egy módszert, például egy záró üzenetet kell elküldenie az összes ügyfélnek, majd hagyhatja, hogy az ügyfelek eldöntsék, mikor zárják be/kapcsolják újra.

    Olvassa el a ChatSample-et a mintahasználathoz, amelyet egy kilépési üzenetet küldünk az ügyfél bezárásának aktiválásához a leállítási horogban.

    A MigrateClients mód beállítása

    Az Azure SignalR Service megpróbálja átirányítani a kiszolgáló ügyfélkapcsolatát egy másik érvényes kiszolgálóra.

    Ebben a forgatókönyvben OnConnectedAsyncOnDisconnectedAsync a rendszer aktiválódik az új kiszolgálón és a régi kiszolgálón egy IConnectionMigrationFeature készlettel Context, amely alapján megállapítható, hogy az ügyfélkapcsolat migrálva vagy migrálva lett-e. Ez a funkció különösen állapotalapú forgatókönyvek esetén lehet hasznos.

    Az ügyfélkapcsolat az aktuális üzenet kézbesítése után azonnal át lesz migrálva, ami azt jelenti, hogy a következő üzenet az új kiszolgálóra lesz irányítva.

  4. Kiszolgálókapcsolatok leállítása

    Miután az összes ügyfélkapcsolatot bezárták/migrálták, vagy túllépték az időtúllépést (alapértelmezés szerint 30-at),

    A SignalR Server SDK ebben a szakaszban folytatja a leállítási folyamatot, és bezárja az összes kiszolgálókapcsolatot.

    Az ügyfélkapcsolatok továbbra is megszakadnak, ha nem sikerült bezárni/migrálni. Nincs például megfelelő célkiszolgáló/aktuális ügyfél-kiszolgáló üzenet, amely nem fejeződött be.

Mintakódok.

Adja hozzá a következő beállításokat, amikor AddAzureSignalR:

services.AddSignalR().AddAzureSignalR(option =>
{
    option.GracefulShutdown.Mode = GracefulShutdownMode.WaitForClientsClose;
    // option.GracefulShutdown.Mode = GracefulShutdownMode.MigrateClients;
    option.GracefulShutdown.Timeout = TimeSpan.FromSeconds(30);

    option.GracefulShutdown.Add<Chat>(async (c) =>
    {
        await c.Clients.All.SendAsync("exit");
    });
});

konfigurálja OnConnected és OnDisconnected miközben a kecses leállítási módot a értékre állítja MigrateClients.

Bevezettünk egy "I Csatlakozás ionMigrationFeature"-t, amely jelzi, hogy a kapcsolat migrálása folyamatban van-e.

public class Chat : Hub {

    public override async Task OnConnectedAsync()
    {
        Console.WriteLine($"{Context.ConnectionId} connected.");

        var feature = Context.Features.Get<IConnectionMigrationFeature>();
        if (feature != null)
        {
            Console.WriteLine($"[{feature.MigrateTo}] {Context.ConnectionId} is migrated from {feature.MigrateFrom}.");
            // Your business logic.
        }

        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception e)
    {
        Console.WriteLine($"{Context.ConnectionId} disconnected.");

        var feature = Context.Features.Get<IConnectionMigrationFeature>();
        if (feature != null)
        {
            Console.WriteLine($"[{feature.MigrateFrom}] {Context.ConnectionId} will be migrated to {feature.MigrateTo}.");
            // Your business logic.
        }

        await base.OnDisconnectedAsync(e);
    }
}