C# Academy · Aula

Escalonamento com Redis Backplane

Escale o SignalR em vários servidores usando um Redis Backplane para sincronizar mensagens entre instâncias.

Aula 4 de 413 etapas

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 them

Opçõ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 needed

Sessõ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 server

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

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

Verificaçã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
Grátis para começar

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

  1. Hubs e conexões do SignalR
  2. Grupos, usuários e gerenciamento de conexões
  3. Hubs fortemente tipados
  4. Escalonamento com Redis Backplane
← Voltar para C# Academy