Akademi C# · Pelajaran

Penskalaan dengan Redis Backplane

Skalakan SignalR merentas berbilang pelayan menggunakan Redis backplane untuk menyegerakkan mesej antara tika.

Pelajaran 4 daripada 413 langkah

Penskalaan dengan Redis Backplane ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Masalah Berbilang Pelayan

Apabila SignalR berjalan pada satu pelayan, klien dan pelayan berkongsi memori untuk sambungan dan kumpulan. Apabila diskalakan kepada dua atau lebih pelayan, setiap pelayan hanya mengetahui sambungannya sendiri — mesej yang dihantar pada Pelayan A tidak pernah sampai kepada klien yang disambungkan ke Pelayan B.

Apakah Itu Bas Perantara?

Bas perantara ialah bas mesej dikongsi antara tika pelayan SignalR. Apabila sebuah pelayan ingin menghantar mesej, pelayan itu menerbitkannya ke bas perantara; semua pelayan menerimanya dan memajukannya kepada sambungan tempatan masing-masing.

Menambahkan Bas Perantara Redis

Pasang pakej Microsoft.AspNetCore.SignalR.StackExchangeRedis dan panggil AddStackExchangeRedis() selepas 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 Penerbitan/Langganan Redis Berfungsi untuk SignalR

Setiap pelayan SignalR melanggan saluran Redis. Apabila pelayan A menerbitkan mesej untuk kumpulan atau pengguna, Redis menghantarnya kepada semua pelanggan (pelayan B, C…), yang kemudiannya memajukannya kepada sambungan tempatan 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

Pilihan Konfigurasi

Laraskan sambungan Redis untuk persekitaran pengeluaran: TLS, kata laluan, ketahanan sambungan dan awalan saluran penerbitan/langganan.

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;
    });

Azure SignalR Service

Untuk penskalaan terurus sepenuhnya, gunakan Azure SignalR Service. Ia bertindak sebagai bas perantara dan pengurus sambungan — pelayan aplikasi anda menjadi tanpa keadaan dan tidak mengurus sambungan 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 Lekat (Sandaran untuk Pengangkutan Bukan WebSocket)

Apabila menggunakan Peristiwa Dihantar Pelayan atau Undian Panjang (bukan WebSockets), klien yang sama mesti sentiasa mencapai pelayan yang sama — keadaan ini dipanggil sesi lekat. Konfigurasikannya dalam pengimbang beban atau proksi songsang anda.

# 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

Kumpulan Merentas Berbilang Pelayan

Keahlian kumpulan diselenggarakan oleh bas perantara. Menambahkan sambungan kepada kumpulan pada Pelayan A bermakna Pelayan B mengetahuinya melalui Redis — semuanya telus kepada kod 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 Penerbitan/Langganan Redis

Pantau saluran Redis untuk mengesahkan trafik SignalR dan mendiagnosis masalah. Gunakan redis-cli SUBSCRIBE atau Redis Insights untuk memerhatikan aliran mesej.

# 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"

Mengendalikan Kegagalan Redis

Jika Redis tidak tersedia, SignalR beralih kepada mod tempatan sahaja — mesej tidak akan merentas pelayan. Konfigurasikan dasar percubaan semula dan amaran untuk sambungan 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);
    });

Dunia Sebenar: Seni Bina Sembang Berskala

Dalam persekitaran pengeluaran, jalankan 3 atau lebih tika pelayan SignalR di belakang pengimbang beban, dengan Redis (atau Azure SignalR Service) sebagai bas perantara. Semua keadaan disimpan dalam Redis; pelayan tidak mempunyai keadaan dan boleh dilupuskan.

// 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

Semakan Pantas

Apakah masalah yang diselesaikan oleh bas perantara SignalR?

Ulang Kaji: Penskalaan dengan Bas Perantara Redis

Inti pati utama:

  • Tanpa bas perantara, mesej daripada satu pelayan tidak sampai kepada klien pada pelayan lain
  • AddStackExchangeRedis() menambahkan bas perantara penerbitan/langganan Redis secara telus
  • Azure SignalR Service menyediakan alternatif bas perantara tanpa pelayan yang diurus sepenuhnya
  • Sesi lekat diperlukan untuk pengangkutan bukan WebSocket (SSE, Undian Panjang)
  • Keahlian kumpulan disegerakkan merentas pelayan melalui bas perantara
  • Konfigurasikan AbortOnConnectFail=false dan dasar percubaan semula untuk ketahanan Redis
Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Penskalaan dengan Redis Backplane” percuma?

Ya — teks penuh “Penskalaan dengan Redis Backplane” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penskalaan dengan Redis Backplane”?

Skalakan SignalR merentas berbilang pelayan menggunakan Redis backplane untuk menyegerakkan mesej antara tika. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Penskalaan dengan Redis Backplane” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Hab & Sambungan SignalR
  2. Kumpulan, Pengguna & Pengurusan Sambungan
  3. Hab Bertip Kukuh
  4. Penskalaan dengan Redis Backplane
← Kembali ke Akademi C#