Uma coisa importante a ter em mente aqui é que as implementações de “chat” geralmente transmitem o conteúdo real para os assinantes.
No Discourse, temos um pipeline bastante complexo, o que torna a implementação ingênua complicada e resulta em grandes volumes de tráfego.
- O usuário publica uma resposta
- Todos os usuários visualizando o tópico descobrem via transmissão que há novo conteúdo
- Todos os usuários solicitam o conteúdo da postagem ao servidor (100 visualizadores = 100 solicitações)
- Extraímos imagens / otimizamos imagens
- Todos os usuários visualizando o tópico descobrem via transmissão que há novo conteúdo
- Todos os usuários solicitam o conteúdo da postagem ao servidor (100 visualizadores = 100 solicitações)
(Temos várias otimizações, limites de taxa, tentativas de reenvio e assim por diante, mas essa é a essência)
Todas essas solicitações precisam passar pelo nosso pipeline de segurança para garantir que o usuário tenha permissão para ver a postagem e assim por diante.
Se o conteúdo fosse relativamente curto e pudéssemos de alguma forma descobrir como fazer a segurança de maneira mais leve para a “pista rápida”, poderíamos distribuir as mensagens de chat via transmissão. Isso resultaria em um desempenho significativamente melhor; provavelmente poderíamos atender 10.000 usuários em um único droplet Digital Ocean de baixo custo com 2 GB de RAM com esse design.
A segurança é muito complexa. O cache também é complexo devido a problemas de invalidação de cache.
Portanto, sim, estamos absolutamente pensando nesse problema. Mas, no momento…
Muitos visualizadores logados em um único tópico + muito conteúdo novo em um único tópico = contas de servidor caras.