Penskalaan dengan Redis Backplane
Skalakan SignalR merentas berbilang pelayan menggunakan Redis backplane untuk menyegerakkan mesej antara tika.
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 themPilihan 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 neededSesi 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 serverKumpulan 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 distributionMemantau 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=3Semakan 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
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
- Hab & Sambungan SignalR
- Kumpulan, Pengguna & Pengurusan Sambungan
- Hab Bertip Kukuh
- Penskalaan dengan Redis Backplane