Bagikan melalui


Menyiapkan backplane Redis untuk ASP.NET Core SignalR scale-out

Oleh Andrew Stanton-Nurse, Brady Gaster, dan Tom Dykstra.

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal paket NuGet berikut:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Panggil AddStackExchangeRedis dengan menambahkan baris berikut sebelum baris yang memanggil builder.Build()) dalam Program.cs file.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur dalam string koneksi atau di ConfigurationOptions objek. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

    Untuk informasi tentang opsi Redis, lihat dokumentasi StackExchange Redis.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut:

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal paket NuGet berikut:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Panggil AddStackExchangeRedis dengan menambahkan baris berikut sebelum baris yang memanggil builder.Build()) dalam Program.cs file.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur dalam string koneksi atau di ConfigurationOptions objek. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

    Untuk informasi tentang opsi Redis, lihat dokumentasi StackExchange Redis.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut:

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal paket NuGet berikut:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Panggil AddStackExchangeRedis dengan menambahkan baris berikut sebelum baris yang memanggil builder.Build()) dalam Program.cs file.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur dalam string koneksi atau di ConfigurationOptions objek. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

    Untuk informasi tentang opsi Redis, lihat dokumentasi StackExchange Redis.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut:

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal paket NuGet berikut:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Dalam metode , Startup.ConfigureServices panggil AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur dalam string koneksi atau di ConfigurationOptions objek. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

    Untuk informasi tentang opsi Redis, lihat dokumentasi StackExchange Redis.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut:

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal paket NuGet berikut:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Dalam metode , Startup.ConfigureServices panggil AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur dalam string koneksi atau di ConfigurationOptions objek. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

    Untuk informasi tentang opsi Redis, lihat dokumentasi StackExchange Redis.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut:

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal salah satu paket NuGet berikut:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis - Tergantung pada StackExchange.Redis 2.X.X. Ini adalah paket yang direkomendasikan untuk ASP.NET Core 2.2 dan yang lebih baru.
    • Microsoft.AspNetCore.SignalR.Redis - Tergantung pada StackExchange.Redis 1.X.X. Paket ini tidak disertakan dalam ASP.NET Core 3.0 dan yang lebih baru.
  • Dalam metode , Startup.ConfigureServices panggil AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    

Saat menggunakan Microsoft.AspNetCore.SignalR.Redis, panggil AddRedis.

  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur di string koneksi atau di objek ConfigurationOptions. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

Saat menggunakan Microsoft.AspNetCore.SignalR.Redis, panggil AddRedis.

Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

Untuk informasi tentang opsi Redis, lihat dokumentasi StackExchange Redis.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut:

Artikel ini menjelaskan SignalR-aspek khusus dalam menyiapkan server Redis untuk digunakan untuk memperluas skala aplikasi ASP.NET Core SignalR .

Peringatan

Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.

Menyiapkan backplane Redis

  • Menyebarkan server Redis.

    Penting

    Untuk penggunaan produksi, backplane Redis disarankan hanya saat berjalan di pusat data yang sama dengan SignalR aplikasi. Jika tidak, latensi jaringan menurunkan performa. Jika aplikasi Anda SignalR berjalan di cloud Azure, kami merekomendasikan Azure SignalR Service alih-alih backplane Redis.

    Untuk informasi selengkapnya, lihat sumber daya berikut:

  • SignalR Di aplikasi, instal Microsoft.AspNetCore.SignalR.Redis paket NuGet.

  • Dalam metode , Startup.ConfigureServices panggil AddRedis setelah AddSignalR:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Konfigurasikan opsi sesuai kebutuhan:

    Sebagian besar opsi dapat diatur di string koneksi atau di objek ConfigurationOptions. Opsi yang ditentukan dalam ConfigurationOptions mengambil alih yang diatur dalam string koneksi.

    Contoh berikut menunjukkan cara mengatur opsi dalam ConfigurationOptions objek. Contoh ini menambahkan awalan saluran sehingga beberapa aplikasi dapat berbagi instans Redis yang sama, seperti yang dijelaskan pada langkah berikut.

    services.AddSignalR()
      .AddRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    Dalam kode sebelumnya, options.Configuration diinisialisasi dengan apa pun yang ditentukan dalam string koneksi.

  • Jika Anda menggunakan satu server Redis untuk beberapa SignalR aplikasi, gunakan awalan saluran yang berbeda untuk setiap SignalR aplikasi.

    Mengatur awalan saluran mengisolasi satu SignalR aplikasi dari aplikasi lain yang menggunakan awalan saluran yang berbeda. Jika Anda tidak menetapkan awalan yang berbeda, pesan yang dikirim dari satu aplikasi ke semua kliennya sendiri akan masuk ke semua klien dari semua aplikasi yang menggunakan server Redis sebagai backplane.

  • Konfigurasikan perangkat lunak penyeimbang beban farm server Anda untuk sesi lengket. Berikut adalah beberapa contoh dokumentasi tentang cara melakukannya:

Kesalahan server Redis

Ketika server Redis tidak berfungsi, SignalR melemparkan pengecualian yang menunjukkan pesan tidak akan dikirimkan. Beberapa pesan pengecualian umum:

  • Gagal menulis pesan
  • Gagal memanggil metode hub 'MethodName'
  • Koneksi ke Redis gagal

SignalR tidak menyangga pesan untuk mengirimnya ketika server muncul kembali. Setiap pesan yang dikirim saat server Redis tidak berfungsi hilang.

SignalR secara otomatis terhubung kembali ketika server Redis tersedia lagi.

Perilaku kustom untuk kegagalan koneksi

Berikut adalah contoh yang menunjukkan cara menangani peristiwa kegagalan koneksi Redis.

services.AddSignalR()
        .AddRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Kluster Redis

Kluster Redis menggunakan beberapa server Redis yang aktif secara bersamaan untuk mencapai ketersediaan tinggi. Ketika Kluster Redis digunakan sebagai backplane untuk SignalR, pesan dikirimkan ke semua node kluster tanpa modifikasi kode ke aplikasi.

Ada tradeoff antara jumlah simpul dalam kluster dan throughput backplane. Meningkatkan jumlah simpul meningkatkan ketersediaan kluster tetapi mengurangi throughput karena pesan harus ditransmisikan ke semua simpul dalam kluster.

Dalam aplikasi, sertakan SignalR semua simpul Redis yang mungkin menggunakan salah satu pendekatan berikut:

  • Cantumkan simpul di string koneksi dibatasi dengan koma.
  • Jika menggunakan perilaku kustom untuk kegagalan koneksi, tambahkan simpul ke ConfigurationOptions.Endpoints.

Langkah berikutnya

Untuk informasi selengkapnya, lihat sumber daya berikut: