Arresto normale del server

Microsoft Servizio Azure SignalR offre due modalità per arrestare normalmente un server hub SignalR quando Servizio Azure SignalR è configurata come modalità predefinita che Servizio Azure SignalR funge da proxy tra i client SignalR e il server hub SignalR.

Il vantaggio principale dell'uso di questa funzionalità consiste nel impedire ai clienti di riscontrare perdite impreviste di connessione.

In alternativa, è possibile attendere che le connessioni client si chiudano rispetto alla logica di business o anche eseguire la migrazione della connessione client a un altro server senza perdere dati.

Funzionamento

In generale, ci saranno quattro fasi in un processo di arresto normale:

  1. Impostare il server offline

    Significa che non verranno instradate altre connessioni client a questo server.

  2. Hook trigger OnShutdown

    È possibile registrare gli hook di arresto per ogni hub di proprietà del server. Verranno chiamati per quanto riguarda l'ordine registrato subito dopo aver ottenuto una risposta FINACK dal nostro Servizio Azure SignalR, il che significa che questo server è stato impostato offline nel Servizio Azure SignalR.

    È possibile trasmettere messaggi o eseguire alcuni processi di pulizia in questa fase, una volta eseguiti tutti gli hook di arresto, si procederà alla fase successiva.

  3. Attendere il completamento di tutte le connessioni client, dipende dalla modalità scelta, potrebbe trattarsi di:

    Mode impostato su WaitForClientsToClose

    Servizio Azure SignalR conterrà i client esistenti.

    Potrebbe essere necessario progettare un modo, ad esempio trasmettere un messaggio di chiusura a tutti i client e quindi consentire ai client di decidere quando chiudere o riconnettersi.

    Leggere ChatSample per l'utilizzo di esempio, che viene trasmesso un messaggio di "uscita" per attivare la chiusura del client nell'hook di arresto.

    Modalità impostata su MigrateClients

    Servizio Azure SignalR tenterà di reindirizzare la connessione client in questo server a un altro server valido.

    In questo scenario, OnConnectedAsync e OnDisconnectedAsync verrà attivato rispettivamente nel nuovo server e nel server precedente con un IConnectionMigrationFeature set in Context, che può essere usato per identificare se la connessione client è stata migrata o migrata. Questa funzionalità può essere utile soprattutto per gli scenari con stato.

    La connessione client verrà eseguita immediatamente dopo il recapito del messaggio corrente, il che significa che il messaggio successivo verrà instradato al nuovo server.

  4. Arrestare le connessioni server

    Dopo che tutte le connessioni client sono state chiuse/migrate o il timeout (30s per impostazione predefinita) è stato superato,

    SignalR Server SDK procederà il processo di arresto a questa fase e chiuderà tutte le connessioni server.

    Le connessioni client verranno comunque eliminate se non è stato possibile chiudere o eseguire la migrazione. Ad esempio, nessun server di destinazione appropriato/messaggio corrente da client a server non è terminato.

Codici di esempio.

Aggiungere le opzioni seguenti quando 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");
    });
});

configurare OnConnected e OnDisconnected durante l'impostazione della modalità di arresto normale su MigrateClients.

È stato introdotto un messaggio "I Connessione ionMigrationFeature" per indicare se è stata eseguita la migrazione o l'uscita di una connessione.

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