C# Academy · Lección

Escalado con Redis Backplane

Escale SignalR en varios servidores mediante un Redis backplane que sincronice los mensajes entre instancias.

Lección 4 de 413 pasos

Escalado con Redis Backplane es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

El problema de los múltiples servidores

Cuando SignalR se ejecuta en un solo servidor, los clientes y el servidor comparten la memoria de las conexiones y los grupos. Al escalar a dos o más servidores, cada servidor solo conoce sus propias conexiones: un mensaje enviado en el servidor A nunca llega a los clientes conectados al servidor B.

¿Qué es un backplane?

Un backplane es un bus de mensajes compartido entre las instancias del servidor de SignalR. Cuando un servidor quiere enviar un mensaje, lo publica en el backplane; todos los servidores lo reciben y lo reenvían a sus conexiones locales.

Adición del backplane de Redis

Instale el paquete Microsoft.AspNetCore.SignalR.StackExchangeRedis y llame a AddStackExchangeRedis() después de 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")!);

Cómo funciona Redis Pub/Sub para SignalR

Cada servidor de SignalR se suscribe a los canales de Redis. Cuando el servidor A publica un mensaje para un grupo o usuario, Redis lo entrega a todos los suscriptores (servidores B, C…), que después lo reenvían a sus conexiones locales.

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

Opciones de configuración

Ajuste la conexión de Redis para producción: TLS, contraseña, resiliencia de la conexión y prefijo del canal de pub/sub.

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

Para un escalado totalmente administrado, use Azure SignalR Service. Actúa como backplane y administrador de conexiones: los servidores de su aplicación pasan a no tener estado y no mantienen las conexiones WebSocket directamente.

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

Sesiones persistentes (alternativa para transportes que no son WebSocket)

Al usar Server-Sent Events o Long Polling (no WebSockets), el mismo cliente debe conectarse siempre al mismo servidor; esto se denomina sesiones persistentes. Configure esta opción en el equilibrador de carga o el proxy inverso.

# 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

Grupos en varios servidores

El backplane mantiene la pertenencia a grupos. Agregar una conexión a un grupo en el servidor A significa que el servidor B lo sabe mediante Redis; esto es transparente para el código de la aplicación.

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

Supervisión de Redis Pub/Sub

Supervise los canales de Redis para verificar el tráfico de SignalR y diagnosticar problemas. Use redis-cli SUBSCRIBE o Redis Insights para observar el flujo de mensajes.

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

Gestión de errores de Redis

Si Redis deja de estar disponible, SignalR vuelve al modo solo local: los mensajes no atraviesan los servidores. Configure políticas de reintento y alertas para la conectividad de 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);
    });

Caso real: arquitectura de chat escalable

En producción, ejecute al menos 3 instancias del servidor de SignalR detrás de un equilibrador de carga, con Redis (o Azure SignalR Service) como backplane. Todo el estado reside en Redis; los servidores no tienen estado y se pueden reemplazar.

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

Comprobación rápida

¿Qué problema resuelve un backplane de SignalR?

Resumen: escalado con un backplane de Redis

Aspectos clave:

  • Sin un backplane, los mensajes de un servidor no llegan a los clientes de otros servidores
  • AddStackExchangeRedis() agrega de forma transparente un backplane de Redis basado en pub/sub
  • Azure SignalR Service proporciona una alternativa de backplane sin servidor y totalmente administrada
  • Las sesiones persistentes son necesarias para los transportes que no usan WebSocket (SSE, Long Polling)
  • La pertenencia a grupos se sincroniza entre servidores mediante el backplane
  • Configure AbortOnConnectFail=false y políticas de reintento para mejorar la resiliencia de Redis
Gratis para empezar

Aprende C# con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
93
Lecciones
346

Preguntas frecuentes

¿La lección «Escalado con Redis Backplane» es gratis?

Sí — el texto completo de «Escalado con Redis Backplane» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Escalado con Redis Backplane»?

Escale SignalR en varios servidores mediante un Redis backplane que sincronice los mensajes entre instancias. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Escalado con Redis Backplane»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Hubs y conexiones de SignalR
  2. Grupos, usuarios y gestión de conexiones
  3. Hubs con tipos seguros
  4. Escalado con Redis Backplane
← Volver a C# Academy