C# Academy · Pelajaran

Penskalaan dengan Redis Backplane

Skalakan SignalR di beberapa server menggunakan Redis backplane untuk menyinkronkan pesan antar-instance.

Pelajaran 4 dari 413 langkah

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 them

Opsi 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 needed

Sesi 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 server

Grup 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 distribution

Memantau 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=3

Pemeriksaan 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
Gratis untuk memulai

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

  1. Hub & Koneksi SignalR
  2. Grup, Pengguna & Pengelolaan Koneksi
  3. Hub Bertipe Kuat
  4. Penskalaan dengan Redis Backplane
← Kembali ke C# Academy