Escalonamento com Redis Backplane
Escale o SignalR em vários servidores usando um Redis Backplane para sincronizar mensagens entre instâncias.
Escalonamento com Redis Backplane é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
O problema de vários servidores
Quando o SignalR é executado em um único servidor, os clientes e o servidor compartilham a memória das conexões e dos grupos. Ao escalar para dois ou mais servidores, cada servidor conhece apenas as conexões do seu próprio servidor — uma mensagem enviada no Servidor A nunca chega aos clientes conectados ao Servidor B.
O que é um barramento intermediário?
Um barramento intermediário é um barramento de mensagens compartilhado entre instâncias do servidor SignalR. Quando um servidor quer enviar uma mensagem, ele a publica no barramento intermediário; todos os servidores a recebem e a encaminham para suas conexões locais.
Adicionando o barramento intermediário do Redis
Instale o pacote Microsoft.AspNetCore.SignalR.StackExchangeRedis e chame AddStackExchangeRedis() depois 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")!);Como a publicação/assinatura do Redis funciona com o SignalR
Cada servidor SignalR se inscreve em canais do Redis. Quando o servidor A publica uma mensagem para um grupo ou usuário, o Redis a entrega a todos os assinantes (servidores B, C…), que então a encaminham para suas conexões locais.
// 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 themOpções de configuração
Ajuste a conexão do Redis para produção: TLS, senha, resiliência da conexão e prefixo do canal de publicação/assinatura.
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 obter escalabilidade totalmente gerenciada, use o Azure SignalR Service. Ele atua como o barramento intermediário e o gerenciador de conexões — seus servidores de aplicação tornam-se sem estado e não mantêm conexões WebSocket diretamente.
// 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 neededSessões persistentes (alternativa para transporte sem WebSocket)
Ao usar eventos enviados pelo servidor ou sondagem longa (e não WebSockets), o mesmo cliente deve sempre acessar o mesmo servidor — isso é chamado de sessões persistentes. Configure isso no balanceador de carga ou proxy reverso.
# 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 serverGrupos em vários servidores
A associação a grupos é mantida pelo barramento intermediário. Adicionar uma conexão a um grupo no Servidor A significa que o Servidor B fica sabendo disso por meio do Redis — de forma transparente para o código da aplicação.
// 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 distributionMonitoramento da publicação/assinatura do Redis
Monitore os canais do Redis para verificar o tráfego do SignalR e diagnosticar problemas. Use redis-cli SUBSCRIBE ou o Redis Insights para observar o fluxo de mensagens.
# 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"Como lidar com falhas do Redis
Se o Redis ficar indisponível, o SignalR voltará ao modo somente local — as mensagens não atravessarão os servidores. Configure políticas de repetição e alertas para a conectividade do 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);
});Na prática: arquitetura de chat escalável
Em produção, execute 3 ou mais instâncias de servidor SignalR atrás de um balanceador de carga, com o Redis (ou o Azure SignalR Service) como barramento intermediário. Todo o estado fica no Redis; os servidores não mantêm estado e podem ser descartados.
// 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=3Verificação rápida
Que problema um barramento intermediário do SignalR resolve?
Recapitulação: escalabilidade com o barramento intermediário do Redis
Principais conclusões:
- Sem um barramento intermediário, as mensagens de um servidor não chegam aos clientes de outros servidores
- AddStackExchangeRedis() adiciona de forma transparente um barramento intermediário de publicação/assinatura do Redis
- O Azure SignalR Service oferece uma alternativa de barramento intermediário totalmente gerenciada e sem servidor
- Sessões persistentes são necessárias para transportes que não são WebSocket (SSE, sondagem longa)
- A associação a grupos é sincronizada entre os servidores por meio do barramento intermediário
- Configure AbortOnConnectFail=false e políticas de repetição para garantir a resiliência do Redis
Aprenda C# com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 93
- Aulas
- 346
Perguntas Frequentes
A aula “Escalonamento com Redis Backplane” é grátis?
Sim — o texto completo de “Escalonamento com Redis Backplane” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Escalonamento com Redis Backplane”?
Escale o SignalR em vários servidores usando um Redis Backplane para sincronizar mensagens entre instâncias. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Escalonamento com Redis Backplane”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Hubs e conexões do SignalR
- Grupos, usuários e gerenciamento de conexões
- Hubs fortemente tipados
- Escalonamento com Redis Backplane