Guia Completo: Blazor e SignalR para Apps em Tempo Real
Streaming em Tempo Real com C#, SignalR e ChannelReader
Imagine transmitir cotações da bolsa, dados de sensores IoT ou logs📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. de sistemas com latência de milissegundos e economia de 70% em banda. Este guia completo revela como implementar streaming em tempo real usando C#, SignalR
🚀 SignalR Básico: Crie um Chat em Tempo Real!Descubra como criar um chat em tempo real com SignalR e ASP.NET Core. Tutorial prático com passo a passo para iniciantes e especialistas. e ChannelReader, desde conceitos fundamentais até arquiteturas escaláveis para milhões de usuários!
🔗 Tabela de Conteúdo🔗
- 🚀 Por que Streaming?
- ⚡ SignalR
🚀 SignalR Básico: Crie um Chat em Tempo Real!Descubra como criar um chat em tempo real com SignalR e ASP.NET Core. Tutorial prático com passo a passo para iniciantes e especialistas.: O Canhão de Dados do .NET
- 🔧 ChannelReader: O Coração do Fluxo Contínuo
- 💻 Implementação em 4 Etapas
- 🌐 Exemplos Práticos (Bolsa vs
🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE. IoT)
- 🚦 Escalando para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! Milhões
- 📊 Projeto
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes.: Dashboard Financeiro
- 🏁 Conclusão e Boas Práticas
🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados.
🚀 Por que Streaming?🔗
Cenário Tradicional (Polling):
// Cliente fazendo requisições a cada 2 segundos
while (true)
{
var dados = await httpClient.GetAsync("api/dados");
await Task.Delay(2000); // Latência de até 2s
}
Problemas:
- 🔋 Consumo excessivo de recursos
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. (servidor/cliente)
- ⏳ Latência desnecessária
- 🔄 Overhead de conexões HTTP repetidas
Solução com Streaming:
// Conexão persistente com SignalR
hubConnection.On("NovosDados", (Dados dados) =>
{
AtualizaDashboard(dados); // Reação imediata
});
⚡ SignalR: O Canhão de Dados do .NET🔗
Arquitetura Multiprotocolo:
Protocolo | Vantagens | Caso de Uso Ideal |
---|---|---|
WebSocket | Conexão full-duplex, baixa latência | Aplicações críticas |
Server-Sent Events | Simples, servidor→cliente | Notificações em massa |
Long Polling | Compatível com firewalls restritas | Ambientes corporativos |
Fluxo de Dados com Hub:
public class DadosHub : Hub
{
public ChannelReader<Cotacao> StreamDados(CancellationToken ct)
{
var canal = Channel.CreateUnbounded<Cotacao>();
_ = ProduzirDadosAsync(canal.Writer, ct);
return canal.Reader;
}
private async Task ProduzirDadosAsync(ChannelWriter<Cotacao> escritor, CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
var cotacao = GerarCotacaoAleatoria();
await escritor.WriteAsync(cotacao, ct);
await Task.Delay(1000, ct);
}
escritor.Complete();
}
}
🔧 ChannelReader: O Coração do Fluxo Contínuo🔗
Padrão Produtor-Consumidor Assíncrono⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais.:
public class SensorService
{
private readonly Channel<LeituraSensor> _canal = Channel.CreateUnbounded<LeituraSensor>();
public async Task IniciarColetaAsync(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
var leitura = await _sensor.LerAsync();
await _canal.Writer.WriteAsync(leitura, ct);
}
_canal.Writer.Complete();
}
public ChannelReader<LeituraSensor> ObterLeitor() => _canal.Reader;
}
public async IAsyncEnumerable<LeituraSensor> StreamSensor(
[EnumeratorCancellation] CancellationToken ct)
{
var leitor = _sensorService.ObterLeitor();
while (await leitor.WaitToReadAsync(ct))
{
while (leitor.TryRead(out var leitura))
{
yield return leitura; // Envio contínuo ao cliente
}
}
}
💻 Implementação em 4 Etapas🔗
1. Modelagem de Dados:
public record Cotacao(string Simbolo, decimal Valor, DateTime TimeStamp);
builder.Services.AddSignalR()
.AddJsonProtocol(opts => opts.PayloadSerializerOptions.PropertyNamingPolicy = null);
app.MapHub<DadosHub>("/dados-realtime");
4. Cliente JavaScript:
const conexao = new signalR.HubConnectionBuilder()
.withUrl("/dados-realtime")
.build();
conexao.on("NovosDados", dados => {
atualizarGrafico(dados);
});
conexao.start();
🌐 Exemplos Práticos (Bolsa vs IoT)🔗
Caso 1: Simulador de Ações
// Gerador de cotações
var cotacao = new Cotacao(
Simbolo: "PETR4",
Valor: Random.Shared.Next(20, 30),
TimeStamp: DateTime.UtcNow
);
public class LeituraSensor
{
public double Temperatura { get; set; }
public double Umidade { get; set; }
public DateTime TimeStamp { get; set; }
}
Clientes Específicos:
// Ações
conexao.on("CotacaoAtualizada", cotacao => {
plotarGrafico(cotacao);
});
// IoT
conexao.on("LeituraSensor", leitura => {
exibirAlertas(leitura.Temperatura);
});
🚦 Escalando para Milhões🔗
Clientes → Azure SignalR Service → Redis Backplane → Instâncias
builder.Services.AddSignalR()
.AddAzureSignalR("Endpoint=...;AccessKey=...;");
Métrica | WebSocket | SSE | Long Polling |
---|---|---|---|
Conexões/Node | 50k | 20k | 10k |
Latência | 50ms | 100ms | 200ms |
Throughput | 10MB/s | 5MB/s | 2MB/s |
📊 Projeto: Dashboard Financeiro🔗
Funcionalidades Essenciais:
1. Gráfico em tempo real com Plotly.js
2. Alertas📊 Monitoramento com Prometheus: Métricas em Tempo Real!Descubra como implementar o Prometheus para monitoramento em sistemas .NET, com métricas em tempo real e dashboards inteligentes. personalizáveis por ativo
3. Histórico de 24h com suavização
Estrutura Frontend:
const configGrafico = {
layout: {title: 'PETR4 - Tempo Real'},
config: {responsive: true}
};
conexao.on('Atualizacao', dados => {
Plotly.extendTraces('grafico', {y: [[dados.Valor]]}, [0]);
if (dados.Valor > limite) dispararAlerta();
});
🏁 Conclusão e Boas Práticas🔗
Benefícios do Streaming:
- ⚡ Latência reduzida para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! ms
- 💰 Economia de até 70% em banda
- 🎯 Experiência
🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! do usuário cinematográfica
Checklist de Implantação:
1. Use MessagePack para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! compactação:
services.AddSignalR().AddMessagePackProtocol();
2. Monitore conexões com Application Insights
3. Implemente Circuit Breaker🛡️ Circuit Breaker: Proteja seus Microservices de Falhas em Cascata!Descubra como implementar o Circuit Breaker em .NET 8 para sistemas resilientes. Aprenda estratégias de fallback e monitore o desempenho com eficácia! para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! resiliência
4. Utilize Redis🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real. para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! scale-out
Dica Profissional:
GlobalHost.Configuration.DefaultMessageBufferSize = 32; // Otimiza memória em dispositivos móveis
Próximo Nível: Explore Azure Functions + SignalR para arquiteturas serverless e processamento orientado a eventos em larga escala!
[FunctionName("ProcessarDados")]
public static async Task Run(
[EventHubTrigger("dados")] EventData[] eventos,
[SignalR(HubName = "dadosHub")] IAsyncCollector<SignalRMessage> signalRMensagens)
{
foreach (var evento in eventos)
{
await signalRMensagens.AddAsync(new SignalRMessage
{
Target = "NovoDado",
Arguments = new[] { JsonConvert.DeserializeObject<Dado>(evento.Body) }
});
}
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/