Řádné vypnutí serveru

Služba Microsoft Azure SignalR Service poskytuje dva režimy pro řádné vypnutí serveru služby SignalR Hub, pokud je služba Azure SignalR nakonfigurovaná jako výchozí režim , který služba Azure SignalR Funguje jako proxy mezi klienty SignalR a serverem služby SignalR Hub.

Klíčovou výhodou použití této funkce je zabránit tomu, aby zákazník neočekávaně zapadl do výpadků připojení.

Místo toho můžete buď počkat, aby se klientská připojení zavřela s ohledem na obchodní logiku, nebo dokonce migrovat připojení klienta na jiný server bez ztráty dat.

Jak to funguje

Obecně platí, že v procesu řádného vypnutí budou čtyři fáze:

  1. Nastavení serveru offline

    To znamená, že na tento server nebudou směrována žádná další připojení klientů.

  2. Aktivační OnShutdown háky

    Můžete zaregistrovat háky vypnutí pro každé centrum, které vlastníte na serveru. Budou volána s ohledem na zaregistrovanou objednávku hned po získání odpovědi FINACK z naší služby Azure SignalR, což znamená, že tento server byl ve službě Azure SignalR nastavený offline.

    Zprávy můžete vysílat nebo provádět některé úlohy čištění v této fázi, jakmile se spustí všechny háčky vypnutí, přejdeme k další fázi.

  3. Počkejte, až se všechna klientská připojení dokončí, závisí na zvoleném režimu. Může to být:

    Režim nastavený na WaitForClientsToClose

    Služba Azure SignalR bude obsahovat existující klienty.

    Možná budete muset navrhnout způsob, jako je vysílání zprávy o zavření všem klientům, a pak nechat své klienty rozhodnout, kdy se mají zavřít nebo znovu připojit.

    Přečtěte si ChatSample pro ukázkové použití, které vysíláme zprávu "exit", která aktivuje ukončení klienta v háku vypnutí.

    Režim nastavený na MigrateClients

    Služba Azure SignalR se pokusí převést připojení klienta na tomto serveru na jiný platný server.

    V tomto scénáři OnConnectedAsync se OnDisconnectedAsync aktivuje na novém serveru a na starém serveru s nastavenou IConnectionMigrationFeature sadou, Contextkterá se dá použít k identifikaci, jestli se migrovalo nebo migrovalo připojení klienta. Tato funkce může být užitečná zejména pro stavové scénáře.

    Připojení klienta bude okamžitě migrováno po doručení aktuální zprávy, což znamená, že další zpráva bude směrována na nový server.

  4. Zastavení připojení k serveru

    Po zavření nebo migraci všech klientských připojení nebo překročení časového limitu (ve výchozím nastavení 30s)

    Sada SIGNALR Server SDK bude pokračovat v procesu vypnutí této fáze a ukončí všechna připojení k serveru.

    Pokud se nepodařilo zavřít nebo migrovat připojení klientů, připojení klientů se stále zahodí. Například nebyl dokončen žádný vhodný cílový server nebo aktuální zpráva typu klient-server.

Vzorové kódy

Přidejte následující možnosti, pokud 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");
    });
});

OnDisconnected a OnConnected při nastavování režimu odkladu vypnutí na MigrateClients.

Zavedli jsme "I Připojení ionMigrationFeature", která indikuje, jestli se migrovalo/ven připojení.

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