Bagikan melalui


Ketahanan dan pemulihan bencana di Azure SignalR Service

Ketahanan dan pemulihan bencana adalah kebutuhan umum untuk sistem online. Azure SignalR Service sudah menyediakan ketersediaan 99,9%, namun masih merupakan layanan regional. Saat terjadi pemadaman di seluruh wilayah, instans layanan Anda tidak gagal ke wilayah lain karena selalu berjalan di satu wilayah.

Untuk pemulihan bencana regional, kami merekomendasikan dua pendekatan berikut:

  • Aktifkan Geo-Replikasi (Cara mudah). Fitur ini menangani failover regional untuk Anda secara otomatis. Saat diaktifkan, hanya ada satu instans Azure SignalR dan tidak ada perubahan kode yang diperkenalkan. Periksa replikasi geografis untuk detailnya.
  • Menggunakan Beberapa Titik Akhir di Service SDK. SDK layanan kami mendukung beberapa instans layanan SignalR dan secara otomatis beralih ke instans lain ketika beberapa di antaranya tidak tersedia. Dengan fitur ini, Anda dapat pulih ketika bencana terjadi, tetapi Anda perlu menyiapkan topologi sistem yang tepat sendiri. Anda mempelajari cara melakukannya dalam dokumen ini.

Arsitektur dengan ketersediaan tinggi untuk layanan SignalR

Untuk memastikan ketahanan lintas wilayah untuk layanan SignalR, Anda perlu menyiapkan beberapa instans layanan di berbagai wilayah. Jadi ketika satu wilayah mengalami gangguan, wilayah lain dapat digunakan sebagai cadangan. Saat server aplikasi terhubung ke beberapa instans layanan, ada dua peran, primer dan sekunder. Primer adalah instans yang bertanggung jawab untuk menerima lalu lintas online, sementara sekunder berfungsi sebagai instans fallback yang berfungsi penuh. Dalam implementasi SDK kami, negosiasi hanya mengembalikan titik akhir utama, sehingga klien hanya terhubung ke titik akhir utama dalam kasus normal. Tetapi ketika instans utama tidak berfungsi, negosiasi mengembalikan titik akhir sekunder sehingga klien masih dapat membuat koneksi. Instans primer dan server aplikasi terhubung melalui koneksi server normal tetapi instans sekunder dan server aplikasi terhubung melalui jenis koneksi khusus yang disebut koneksi lemah. Salah satu karakteristik yang membedakan koneksi yang lemah adalah tidak dapat menerima perutean koneksi klien karena lokasi instans sekunder di wilayah lain. Perutean klien ke wilayah lain bukanlah pilihan optimal (meningkatkan latensi).

Satu instans layanan dapat memiliki peran yang berbeda saat menyambungkan ke beberapa server aplikasi. Salah satu penyiapan umum untuk skenario lintas wilayah adalah memiliki dua pasang atau lebih instans layanan SignalR dan server aplikasi. Di dalam setiap pasangan server aplikasi dan layanan SignalR terletak di wilayah yang sama, dan layanan SignalR terhubung ke server aplikasi sebagai peran utama. Di antara setiap pasangan server aplikasi dan layanan SignalR juga terhubung, tetapi SignalR menjadi sekunder saat menghubungkan ke server di wilayah lain.

Dengan topologi ini, pesan dari satu server masih dapat dikirimkan ke semua klien karena semua server aplikasi dan instans layanan SignalR saling terhubung. Tetapi ketika klien terhubung, klien merutekan ke server aplikasi di wilayah yang sama untuk mencapai latensi jaringan yang optimal.

Diagram berikut mengilustrasikan topologi tersebut:

Diagram memperlihatkan dua wilayah yang masing-masing dengan server aplikasi dan layanan SignalR, di mana setiap server dikaitkan dengan layanan SignalR di wilayahnya sebagai primer dan dengan layanan di wilayah lain sebagai sekunder.

Mengonfigurasi beberapa instans layanan SignalR

Beberapa instans layanan SignalR didukung di server aplikasi dan Azure Functions.

Setelah Anda membuat layanan SignalR dan server aplikasi/Azure Functions yang dibuat di setiap wilayah, Anda dapat mengonfigurasi server aplikasi/Azure Functions Anda untuk menyambungkan ke semua instans layanan SignalR.

Melalui konfigurasi

Anda harus tahu cara mengatur string koneksi layanan SignalR melalui variabel lingkungan/pengaturan aplikasi/web.cofig, dalam entri konfigurasi bernama Azure:SignalR:ConnectionString. Jika Anda memiliki beberapa titik akhir, Anda dapat mengaturnya dalam beberapa entri konfigurasi, masing-masing dalam format berikut:

Azure:SignalR:ConnectionString:<name>:<role>

Dalam ConnectionString, <name> adalah nama titik akhir dan <role> merupakan perannya (primer atau sekunder). Nama bersifat opsional tetapi berguna jika Anda ingin menyesuaikan perilaku perutean lebih lanjut di antara beberapa titik akhir.

Melalui kode

Jika Anda lebih suka menyimpan string koneksi di tempat lain, Anda juga dapat membacanya dalam kode Anda dan menggunakannya sebagai parameter saat menelepon AddAzureSignalR() (di ASP.NET Core) atau MapAzureSignalR() (di ASP.NET).

Berikut kode sampelnya.

ASP.NET Core:

services.AddSignalR()
        .AddAzureSignalR(options => options.Endpoints = new ServiceEndpoint[]
        {
            new ServiceEndpoint("<connection_string1>", EndpointType.Primary, "region1"),
            new ServiceEndpoint("<connection_string2>", EndpointType.Secondary, "region2"),
        });

ASP.NET:

app.MapAzureSignalR(GetType().FullName, hub,  options => options.Endpoints = new ServiceEndpoint[]
    {
        new ServiceEndpoint("<connection_string1>", EndpointType.Primary, "region1"),
        new ServiceEndpoint("<connection_string2>", EndpointType.Secondary, "region2"),
    };

Anda dapat mengonfigurasi beberapa instans primer atau sekunder. Jika ada beberapa instans utama dan/atau sekunder, negosiasi mengembalikan titik akhir dalam urutan berikut:

  1. Jika setidaknya ada satu instans primer online, kembalikan instans online primer acak.
  2. Jika semua instans primer mengalami gangguan, kembalikan instans online sekunder acak.

Untuk pengikatan SignalR Azure Functions

Untuk mengaktifkan beberapa instans SignalR Service, Anda harus:

  1. Gunakan Persistent jenis transportasi.

    Jenis transportasi default adalah Transient mode. Anda harus menambahkan entri berikut ke local.settings.json file anda atau pengaturan aplikasi di Azure.

    {
        "AzureSignalRServiceTransportType":"Persistent"
    }
    

    Catatan

    Saat beralih dari Transient mode ke Persistent mode, mungkin ada perubahan perilaku serialisasi JSON, karena di bawah Transient mode, Newtonsoft.Json pustaka digunakan untuk menserialisasikan argumen metode hub, namun, dalam Persistent mode, System.Text.Json pustaka digunakan sebagai default. System.Text.Json memiliki beberapa perbedaan utama dalam perilaku default dengan Newtonsoft.Json. Jika Anda ingin menggunakan Newtonsoft.Json dalam Persistent mode, Anda dapat menambahkan item konfigurasi: "Azure:SignalR:HubProtocol":"NewtonsoftJson" dalam local.settings.json file atau Azure__SignalR__HubProtocol=NewtonsoftJson di portal Azure.

  2. Konfigurasikan beberapa entri titik akhir SignalR Service dalam konfigurasi Anda.

    Kami menggunakan ServiceEndpoint objek untuk mewakili instans SignalR Service. Anda dapat menentukan titik akhir layanan dengan <EndpointName> dan <EndpointType> di kunci entri, dan string koneksi dalam nilai entri. Kunci dalam format berikut:

    Azure:SignalR:Endpoints:<EndpointName>:<EndpointType>
    

    <EndpointType> bersifat opsional dan default ke primary. Lihat sampel di bawah ini:

    {
        "Azure:SignalR:Endpoints:EastUs":"<ConnectionString>",
    
        "Azure:SignalR:Endpoints:EastUs2:Secondary":"<ConnectionString>",
    
        "Azure:SignalR:Endpoints:WestUs:Primary":"<ConnectionString>"
    }
    

    Catatan

    • Saat Anda mengonfigurasi titik akhir Azure SignalR di App Service di portal Azure, jangan lupa untuk mengganti ":" dengan "__", garis bawah ganda di kunci. Untuk alasannya, lihat Variabel lingkungan.

    • String koneksi yang dikonfigurasi dengan kunci {ConnectionStringSetting} (default ke "AzureSignalRConnectionString") juga dikenali sebagai titik akhir layanan utama dengan nama kosong. Tetapi gaya konfigurasi ini tidak disarankan untuk beberapa titik akhir.

Untuk SDK Manajemen

Menambahkan beberapa titik akhir dari konfigurasi

Konfigurasikan dengan kunci Azure:SignalR:Endpoints untuk string koneksi SignalR Service. Kunci harus dalam format Azure:SignalR:Endpoints:{Name}:{EndpointType}, di mana Name dan EndpointType merupakan properti ServiceEndpoint objek, dan dapat diakses dari kode.

Anda dapat menambahkan beberapa string koneksi instans menggunakan perintah dotnet berikut:

dotnet user-secrets set Azure:SignalR:Endpoints:east-region-a <ConnectionString1>
dotnet user-secrets set Azure:SignalR:Endpoints:east-region-b:primary <ConnectionString2>
dotnet user-secrets set Azure:SignalR:Endpoints:backup:secondary <ConnectionString3>

Menambahkan beberapa titik akhir dari kode

Kelas ServiceEndpoint menjelaskan properti titik akhir Azure SignalR Service. Anda dapat mengonfigurasi beberapa titik akhir instans saat menggunakan Azure SignalR Management SDK melalui:

var serviceManager = new ServiceManagerBuilder()
                    .WithOptions(option =>
                    {
                        options.Endpoints = new ServiceEndpoint[]
                        {
                            // Note: this is just a demonstration of how to set options.Endpoints
                            // Having ConnectionStrings explicitly set inside the code is not encouraged
                            // You can fetch it from a safe place such as Azure KeyVault
                            new ServiceEndpoint("<ConnectionString0>"),
                            new ServiceEndpoint("<ConnectionString1>", type: EndpointType.Primary, name: "east-region-a"),
                            new ServiceEndpoint("<ConnectionString2>", type: EndpointType.Primary, name: "east-region-b"),
                            new ServiceEndpoint("<ConnectionString3>", type: EndpointType.Secondary, name: "backup"),
                        };
                    })
                    .BuildServiceManager();

Urutan failover dan praktik terbaik

Sekarang Anda memiliki pengaturan topologi sistem yang tepat. Setiap kali satu instans layanan SignalR tidak berfungsi, lalu lintas online dirutekan ke instans lain. Inilah yang terjadi ketika instans utama tidak berfungsi (dan pulih setelah beberapa waktu):

  1. Instans layanan utama tidak berfungsi, semua koneksi server pada instans ini hilang.
  2. Semua server yang terhubung ke instans ini menandainya sebagai offline, dan negosiasi berhenti mengembalikan titik akhir ini dan mulai mengembalikan titik akhir sekunder.
  3. Semua koneksi klien pada instans ini juga ditutup, klien kemudian terhubung kembali. Karena server aplikasi sekarang mengembalikan titik akhir sekunder, klien terhubung ke instans sekunder.
  4. Sekarang instans sekunder mengambil semua lalu lintas online. Semua pesan dari server ke klien masih dapat dikirim saat sekunder terhubung ke semua server aplikasi. Tetapi pesan klien ke server hanya dirutekan ke server aplikasi di wilayah yang sama.
  5. Setelah instans primer dipulihkan dan kembali online, server aplikasi akan membangun kembali koneksi ke sana dan menandainya sebagai online. Negosiasi sekarang mengembalikan titik akhir utama lagi sehingga klien baru tersambung kembali ke primer. Tetapi klien yang ada tidak menjatuhkan dan masih dirutekan ke sekunder sampai mereka memutuskan sambungan sendiri.

Diagram di bawah ini menggambarkan bagaimana failover dilakukan dalam layanan SignalR:

Gambar.1 Sebelum failover Sebelum Failover

Gambar 2 Setelah failover Setelah Failover

Gambar.3 Waktu singkat setelah primer pulih Waktu singkat setelah primer pulih

Anda dapat melihat dalam kasus normal hanya server aplikasi primer dan layanan SignalR yang memiliki lalu lintas online (berwarna biru). Setelah failover, server aplikasi sekunder dan layanan SignalR juga menjadi aktif. Setelah layanan SignalR primer kembali online, klien baru akan terhubung ke SignalR primer. Tetapi klien yang ada masih terhubung ke sekunder sehingga kedua instans memiliki lalu lintas. Setelah semua klien yang ada terputus, sistem Anda akan kembali normal (Gbr.1).

Ada dua pola utama untuk menerapkan arsitektur lintas wilayah dengan ketersediaan tinggi:

  1. Yang pertama adalah memiliki sepasang server aplikasi dan instans layanan SignalR mengambil semua lalu lintas online, dan memiliki pasangan lain sebagai cadangan (disebut aktif/pasif, diilustrasikan di Gambar.1).
  2. Yang lain adalah memiliki dua (atau lebih) pasang server aplikasi dan instans layanan SignalR, masing-masing mengambil bagian dari lalu lintas online dan berfungsi sebagai cadangan untuk pasangan lain (disebut aktif/aktif, mirip dengan Gambar. 3).

Layanan SignalR dapat mendukung kedua pola tersebut, perbedaan utamanya adalah cara Anda menerapkan server aplikasi. Jika server aplikasi aktif/pasif, layanan SignalR juga aktif/pasif (karena server aplikasi utama hanya mengembalikan instans layanan SignalR utamanya). Jika server aplikasi aktif/aktif, layanan SignalR juga aktif/aktif (karena semua server aplikasi mengembalikan instans SignalR utama mereka sendiri, sehingga semuanya bisa mendapatkan lalu lintas).

Perhatikan pola mana pun yang Anda pilih untuk digunakan, Anda perlu menghubungkan setiap instans layanan SignalR ke server aplikasi sebagai utama.

Juga karena sifat koneksi SignalR (koneksinya panjang), klien mengalami penurunan koneksi ketika terjadi bencana dan failover. Anda perlu menangani kasus seperti itu di sisi klien untuk membuatnya transparan bagi pelanggan akhir Anda. Misalnya, sambungkan kembali setelah koneksi ditutup.

Cara menguji failover

Ikuti langkah-langkah untuk memicu failover:

  1. Di tab Jaringan untuk sumber daya utama di portal, nonaktifkan akses jaringan publik. Jika sumber daya mengaktifkan jaringan privat, gunakan aturan kontrol akses untuk menolak semua lalu lintas.
  2. Mulai ulang sumber daya utama.

Langkah berikutnya

Dalam artikel ini, Anda mempelajari cara mengonfigurasi aplikasi untuk mencapai ketahanan untuk layanan SignalR. Untuk memahami detail selengkapnya tentang koneksi server/klien dan perutean koneksi di layanan SignalR, Anda dapat membaca artikel ini untuk internal layanan SignalR.

Untuk skenario penskalaan seperti sharding yang menggunakan beberapa instans bersama-sama untuk menangani sejumlah besar koneksi, baca cara menskalakan beberapa instans.

Untuk detail tentang cara mengonfigurasi Azure Functions dengan beberapa instans layanan SignalR, baca beberapa dukungan instans Azure SignalR Service di Azure Functions.