Entendendo o SSE (Server-Sent Events) e seus benefícios
February 1, 2024
Introdução
SSE (Server-Sent Events) é um protocolo de comunicação unidirecional entre clientes e servidores baseado no protocolo HTTP. Ele permite que os servidores enviem dados para os clientes em tempo real usando fluxos de eventos, sem a necessidade de solicitações explícitas dos clientes. Construído sobre o protocolo HTTP padrão, o SSE utiliza conexões persistentes unidirecionais, permitindo que os servidores enviem ativamente eventos e dados para os clientes.
Em essência, ele é implementado usando uma abordagem de streaming, onde o cliente inicia uma solicitação de conexão ao servidor e mantém a conexão aberta. O servidor então envia ativamente mensagens para o cliente. Os dados enviados do servidor para o cliente usando Server-Sent Events (SSE) devem ser codificados em UTF-8, e o tipo de conteúdo retornado é text/event-stream
. Por exemplo, ao usar o ChatGPT, quando você faz uma pergunta, verá a resposta sendo exibida palavra por palavra. Na realidade, o ChatGPT 'empurra' proativamente os dados pré-calculados para você, usando a tecnologia SSE para retornar dados enquanto calcula, evitando assim longos tempos de espera na interface que poderiam levar ao fechamento direto da página.
Benefícios do SSE
-
Comunicação em Tempo Real: O SSE oferece um mecanismo de comunicação em tempo real, permitindo que os servidores enviem dados para os clientes de forma ativa. Essa capacidade em tempo real torna o SSE particularmente adequado para aplicações que exigem atualizações imediatas, como chat em tempo real, ferramentas de colaboração online, exibição de dados em tempo real e entrega de notificações.
-
Redução da Carga na Rede: Comparado aos métodos tradicionais de polling, o SSE utiliza conexões de longa duração. Por meio de uma única conexão HTTP, os servidores podem enviar múltiplos eventos para os clientes, evitando solicitações HTTP frequentes e reduzindo a carga na rede.
-
Leveza: O SSE é baseado no protocolo HTTP, suportado por softwares de servidor existentes, e mais simples de usar em comparação com o WebSocket.
-
Reconexão Automática: O SSE pode tentar automaticamente reconectar após uma interrupção da conexão, sem a necessidade de código adicional. Esse mecanismo de reconexão automática aumenta a estabilidade do sistema, garantindo comunicação contínua mesmo em condições de rede instáveis.
Proxying de Serviços SSE Usando API7 Enterprise
Em aplicações práticas, aproveitar um gateway de API para fazer o proxy de serviços SSE contribui para melhorar a estabilidade do serviço, resolver problemas de segurança e de cross-origin, e é adequado para lidar com cenários de aplicação complexos. O NGINX, como um dos servidores de proxy reverso mais populares, detém uma parcela considerável do mercado.
Ao fazer o proxy de serviços SSE no NGINX, é necessário desativar o proxy_buffering
. No entanto, essa configuração deve ser fechada pelo menos no nível de localização, o que implica que, se houver múltiplas localizações no sistema e apenas algumas precisarem desativar o cache para suportar serviços SSE, isso pode afetar o desempenho de outras APIs não SSE. Além disso, a configuração de proxy_buffering
do NGINX carece de flexibilidade, pois não pode ser ativada ou desativada dinamicamente em tempo de execução, exigindo uma recarga da configuração para entrar em vigor, o que pode levar a interrupções no serviço.
API7 Enterprise fornece o plugin proxy-buffering, permitindo que você faça o proxy de serviços SSE upstream de forma mais flexível. Ao ativar esse plugin nas rotas correspondentes, você pode controlar facilmente o cache sem a necessidade de recarregar toda a configuração. Essa flexibilidade atende aos requisitos de proxy de serviços SSE, ao mesmo tempo em que aborda necessidades de desempenho e configuração dinâmica.
Testes como o abaixo confirmam o sucesso no proxy de serviços SSE.
curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream"
event: server
data: 27d365b177ae
id: 1
event: request
data: GET /.sse HTTP/1.1
data:
data: Host: 127.0.0.1:9080
data: Accept: text/event-stream
data: User-Agent: curl/8.1.2
data: X-Forwarded-For: 192.168.65.1
data: X-Forwarded-Host: 127.0.0.1
data: X-Forwarded-Port: 9080
data: X-Forwarded-Proto: http
data: X-Real-Ip: 192.168.65.1
data:
id: 2
event: time
data: 2024-01-29T04:04:20Z
id: 3
event: time
data: 2024-01-29T04:04:21Z
id: 4
...
Conclusão
Em resumo, o SSE é adequado para cenários que exigem comunicação e atualizações em tempo real, fornecendo um meio simples e eficaz para alcançar isso. No entanto, é importante notar que o SSE é um canal unidirecional, permitindo apenas que os servidores enviem mensagens para os clientes. Portanto, o SSE pode não ser adequado para todos os tipos de necessidades de comunicação em tempo real. Para cenários de comunicação bidirecional mais complexos, o WebSocket ou outras tecnologias podem ser mais apropriados.