Bagikan melalui


Mematikan server dengan baik

Microsoft Azure SignalR Service menyediakan dua mode untuk mematikan server SignalR Hub dengan lancar saat Azure SignalR Service dikonfigurasi sebagai mode Default yang bertindak sebagai proksi antara Klien SignalR dan Server SignalR Hub.

Keuntungan utama menggunakan fitur ini adalah mencegah pelanggan Anda mengalami penurunan koneksi yang tidak terduga.

Sebaliknya, Anda dapat menunggu koneksi klien memutuskan sehubungan dengan logika bisnis Anda, atau bahkan memigrasikan koneksi klien ke server lain tanpa kehilangan data.

Cara kerjanya

Secara umum, akan ada empat tahap dalam proses mematikan yang baik:

  1. Mengatur server luring

    Ini berarti tidak ada lagi koneksi klien yang akan dirutekan ke server ini.

  2. Pemicu OnShutdown kait

    Anda dapat mendaftarkan kait penutup pada setiap hub yang Anda miliki di server Anda. Mereka akan dipanggil sehubungan dengan pesanan terdaftar tepat setelah kami mendapatkan respons FINACK dari Azure SignalR Service kami, yang berarti server ini telah diatur secara offline di Azure SignalR Service.

    Anda dapat menyiarkan pesan atau melakukan beberapa pekerjaan pembersihan pada tahap ini, setelah semua kait matikan dijalankan, kami akan melanjutkan ke tahap berikutnya.

  3. Tunggu sampai semua koneksi klien selesai, tergantung pada mode yang Anda pilih, bisa jadi:

    Mode diatur ke WaitForClientsToClose

    Azure SignalR Service akan menahan klien yang sudah ada.

    Anda mungkin harus merancang cara, seperti menyiarkan pesan penutup ke semua klien, dan kemudian membiarkan klien Anda memutuskan kapan harus menutup/menyambungkan kembali dirinya sendiri.

    Baca ChatSample untuk penggunaan sampel, yang kami siarkan pesan 'keluar' untuk memicu klien menutup di kait penutup.

    Mode diatur ke MigrateClients

    Azure SignalR Service akan mencoba mengalihkan sambungan klien pada server ini ke server lain yang valid.

    Dalam skenario ini, OnConnectedAsync dan OnDisconnectedAsync akan dipicu pada server baru dan server lama masing-masing dengan set IConnectionMigrationFeature di Context, yang dapat digunakan untuk mengidentifikasi apakah koneksi klien sedang dimigrasikan atau dimigrasikan-keluar. Fitur ini bisa berguna terutama untuk skenario stateful.

    Koneksi klien akan segera dimigrasikan setelah pesan saat ini dikirim, yang berarti pesan berikutnya akan dirutekan ke server baru.

  4. Hentikan koneksi server

    Setelah semua koneksi klien ditutup/dimigrasikan, atau batas waktu (30 detik secara default) terlampaui,

    SignalR Server SDK akan melanjutkan proses mematikan ke tahap ini, dan menutup semua koneksi server.

    Sambungan klien akan tetap terputus jika gagal ditutup/dimigrasikan. Misalnya, tidak ada server target yang cocok / pesan klien-ke-server saat ini belum selesai.

Contoh kode.

Tambahkan opsi berikut saat 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");
    });
});

mengkonfigurasi OnConnected dan OnDisconnected saat mengatur mode matikan yang baik ke MigrateClients.

Kami telah memperkenalkan "I Koneksi ionMigrationFeature" untuk menunjukkan apakah koneksi sedang dimigrasikan-masuk/keluar.

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