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()
) dalamProgram.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 dalamConfigurationOptions
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()
) dalamProgram.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 dalamConfigurationOptions
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()
) dalamProgram.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 dalamConfigurationOptions
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 dalamConfigurationOptions
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 dalamConfigurationOptions
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
panggilAddRedis
setelahAddSignalR
: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:
ASP.NET Core