Penskalaan dengan Redis Backplane
Skalakan SignalR di beberapa server menggunakan Redis backplane untuk menyinkronkan pesan antar-instance.
Penskalaan dengan Redis Backplane adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Masalah Banyak Server
Saat SignalR berjalan pada satu server, klien dan server berbagi memori untuk koneksi dan grup. Jika diskalakan menjadi dua server atau lebih, setiap server hanya mengetahui koneksinya sendiri—pesan yang dikirim di Server A tidak pernah mencapai klien yang terhubung ke Server B.
Apa Itu Bus Pesan Bersama?
Bus pesan bersama adalah bus pesan yang digunakan bersama oleh beberapa instans server SignalR. Saat satu server ingin mengirim pesan, server tersebut menerbitkannya ke bus pesan; semua server menerimanya dan meneruskannya ke koneksi lokal masing-masing.
Menambahkan Bus Pesan Redis
Instal paket Microsoft.AspNetCore.SignalR.StackExchangeRedis dan panggil AddStackExchangeRedis() setelah AddSignalR().
// dotnet add package Microsoft.AspNetCore.SignalR.StackExchangeRedis
builder.Services.AddSignalR()
.AddStackExchangeRedis("localhost:6379", options =>
{
options.Configuration.ChannelPrefix =
RedisChannel.Literal("myapp"); // namespace your channels
});
// Or from config:
// .AddStackExchangeRedis(builder.Configuration.GetConnectionString("Redis")!);Cara Kerja Publikasi/Berlangganan Redis untuk SignalR
Setiap server SignalR berlangganan kanal Redis. Saat server A menerbitkan pesan untuk grup atau pengguna, Redis mengirimkannya ke semua pelanggan (server B, C…), yang kemudian meneruskannya ke koneksi lokal masing-masing.
// Server A: client sends message
// Hub on Server A calls:
await Clients.Group("room-42").ReceiveMessage(user, msg);
// Internally SignalR publishes to Redis:
// PUBLISH signalr/myapp/group/room-42 <serialized message>
// Redis delivers to Server B and C
// Both servers find connections in "room-42" and push to themOpsi Konfigurasi
Sempurnakan koneksi Redis untuk produksi: TLS, kata sandi, ketahanan koneksi, dan awalan kanal publikasi/berlangganan.
builder.Services.AddSignalR()
.AddStackExchangeRedis(opts =>
{
opts.Configuration = ConfigurationOptions.Parse(
builder.Configuration["Redis:ConnectionString"]!);
opts.Configuration.Password = builder.Configuration["Redis:Password"];
opts.Configuration.Ssl = true;
opts.Configuration.AbortOnConnectFail = false;
opts.Configuration.ConnectRetry = 3;
});Layanan Azure SignalR
Untuk penskalaan yang dikelola sepenuhnya, gunakan Layanan Azure SignalR. Layanan ini berfungsi sebagai bus pesan dan pengelola koneksi—server aplikasi Anda menjadi tanpa status dan tidak menampung koneksi WebSocket sendiri.
// dotnet add package Microsoft.Azure.SignalR
builder.Services.AddSignalR()
.AddAzureSignalR(builder.Configuration["Azure:SignalR:ConnectionString"]!);
// That's it — Azure manages all connections and backplane
// Your server scales to zero when not neededSesi Lengket (Cadangan untuk Transportasi Non-WebSocket)
Saat menggunakan Peristiwa yang Dikirim Server atau Polling Panjang (bukan WebSockets), klien yang sama harus selalu mengakses server yang sama—ini disebut sesi lengket. Konfigurasikan hal ini di penyeimbang beban atau proksi terbalik.
# Nginx: sticky session config (IP hash)
upstream signalr_servers {
ip_hash; # ensures same client hits same server
server server1:5000;
server server2:5000;
server server3:5000;
}
# Or use cookie-based sticky sessions:
# sticky cookie srv_id expires=1h;
# WebSockets don't need sticky sessions —
# the connection is long-lived on one serverGrup di Beberapa Server
Keanggotaan grup dikelola oleh bus pesan. Menambahkan koneksi ke grup di Server A berarti Server B mengetahuinya melalui Redis—transparan bagi kode aplikasi.
// This works correctly across servers:
public async Task JoinRoom(string room)
{
// Adds to Redis-backed group
await Groups.AddToGroupAsync(Context.ConnectionId, room);
// Clients.Group sends via Redis to all servers
await Clients.Group(room).UserJoined(Context.User!.Identity!.Name!);
}
// No code changes needed — the Redis backplane handles distributionMemantau Publikasi/Berlangganan Redis
Pantau kanal Redis untuk memverifikasi lalu lintas SignalR dan mendiagnosis masalah. Gunakan redis-cli SUBSCRIBE atau Redis Insights untuk mengamati aliran pesan.
# redis-cli: monitor all SignalR channels
redis-cli PSUBSCRIBE "myapp*"
# Check active channel subscribers
redis-cli PUBSUB CHANNELS "myapp*"
# Check number of subscribers per channel
redis-cli PUBSUB NUMSUB "myapp/all"Menangani Kegagalan Redis
Jika Redis tidak tersedia, SignalR beralih ke mode lokal saja—pesan tidak akan melintasi server. Konfigurasikan kebijakan percobaan ulang dan peringatan untuk konektivitas Redis.
builder.Services.AddSignalR()
.AddStackExchangeRedis(opts =>
{
opts.Configuration = ConfigurationOptions.Parse(redisConn);
opts.Configuration.AbortOnConnectFail = false; // don't crash app
opts.Configuration.ConnectRetry = 5;
opts.Configuration.ReconnectRetryPolicy =
new ExponentialRetry(5000, maxDeltaBackoffMilliseconds: 60000);
});Arsitektur Obrolan Berskala di Dunia Nyata
Dalam produksi, jalankan 3+ instans server SignalR di belakang penyeimbang beban, dengan Redis (atau Layanan Azure SignalR) sebagai bus pesan. Semua status berada di Redis; server tidak memiliki status dan mudah diganti.
// Architecture:
// [Browser] -> [Load Balancer (any server, WebSocket)] ->
// [SignalR Server 1] -+
// [SignalR Server 2] -+-> [Redis Pub/Sub] -> all servers
// [SignalR Server 3] -+
// Server code is identical on all instances:
builder.Services.AddSignalR().AddStackExchangeRedis(redisConn);
app.MapHub<ChatHub>("/hubs/chat");
// Scale replicas: kubectl scale deployment chat --replicas=3Pemeriksaan Singkat
Masalah apa yang diatasi oleh bus pesan SignalR?
Ringkasan: Penskalaan dengan Bus Pesan Redis
Poin penting:
- Tanpa bus pesan, pesan dari satu server tidak mencapai klien di server lain
- AddStackExchangeRedis() menambahkan bus pesan publikasi/berlangganan Redis secara transparan
- Layanan Azure SignalR menyediakan alternatif bus pesan tanpa server yang dikelola sepenuhnya
- Sesi lengket diperlukan untuk transportasi non-WebSocket (SSE, Polling Panjang)
- Keanggotaan grup disinkronkan di seluruh server melalui bus pesan
- Konfigurasikan AbortOnConnectFail=false dan kebijakan percobaan ulang untuk ketahanan Redis
Belajar C# dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penskalaan dengan Redis Backplane” gratis?
Ya — teks lengkap “Penskalaan dengan Redis Backplane” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penskalaan dengan Redis Backplane”?
Skalakan SignalR di beberapa server menggunakan Redis backplane untuk menyinkronkan pesan antar-instance. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Penskalaan dengan Redis Backplane” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Hub & Koneksi SignalR
- Grup, Pengguna & Pengelolaan Koneksi
- Hub Bertipe Kuat
- Penskalaan dengan Redis Backplane