Server-Sent Events em Kotlin: como tornar o streaming de dados simples e rápido

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Esqueça a sondagem eterna: conheça Server-Sent Events em Kotlin

\n\n

Imagine: você abre um terminal de ações e as cotações se atualizam sozinhas. Ou entra no painel de administração de um site e vê uma transmissão ao vivo do número de usuários online. Sem botões "Atualizar", sem consultas infinitas ao servidor. Apenas um fluxo de dados em tempo real.

\n\n

No mundo do desenvolvimento web, isso é feito com Server-Sent Events (SSE) — um protocolo que permite ao servidor enviar dados ao cliente por conta própria através de uma única conexão HTTP. E hoje vou mostrar como implementar SSE em Kotlin usando o framework Ktor. Não será teoria seca, mas um exemplo prático completo, do servidor ao cliente.

\n\n

O que são Server-Sent Events e por que são incríveis?

\n\n

Há muito tempo, para obter dados atualizados, os desenvolvedores usavam polling (sondagem). O cliente a cada N segundos perguntava ao servidor: "E aí, tem novidades?". O servidor respondia: "Não". E assim por diante. Isso é extremamente ineficiente: 99% das requisições são vazias, e o servidor gasta recursos processando conexões desnecessárias.

\n\n

O SSE resolve o problema de forma radical: o cliente abre uma única conexão, e o servidor envia os dados quando eles surgem. É como uma assinatura de notícias — você apenas espera, e recebe a edição mais recente.

\n\n

Vantagens do Server-Sent Events em Kotlin:

\n
    \n
  • Simplicidade — funciona sobre HTTP comum, sem necessidade de bibliotecas adicionais no cliente (além do EventSource nativo do navegador).
  • \n
  • Reconexão automática — se a conexão cair, o navegador se reconecta sozinho.
  • \n
  • Economia de recursos — uma única conexão em vez de dezenas.
  • \n
  • Suporte nativo em Kotlin — com Ktor e corrotinas, criar um servidor SSE é muito prazeroso.
  • \n
\n\n

A principal desvantagem? SSE é um canal unidirecional (apenas do servidor para o cliente). Se precisar de comunicação bidirecional, considere o WebSocket. Mas para notificações, feeds de notícias, cotações, monitoramento — SSE é ideal.

\n\n

Quando usar SSE no seu projeto Kotlin?

\n\n
    \n
  • Feed de notificações — novas mensagens, comentários, curtidas.
  • \n
  • Monitoramento e logs — streaming de logs do servidor em tempo real.
  • \n
  • Dados do mercado financeiro — atualização de taxas de câmbio, ações, criptomoedas.
  • \n
  • Progresso de tarefas — relatório de upload de arquivo ou processamento de dados.
  • \n
  • Sistemas de alerta — sinais de emergência, status de dispositivos.
  • \n
\n\n

Se você procura uma maneira de transmitir atualizações do servidor para o cliente sem dor de cabeça — SSE Kotlin é a sua escolha. Vamos ao código.

\n\n

Configuração do projeto: Ktor + SSE

\n\n

Primeiro, vamos criar um novo projeto Ktor. Usarei Gradle Kotlin DSL. No build.gradle.kts, adicionamos as dependências:

\n\n
val ktor_version = "2.3.7"\n\ndependencies {\n    implementation("io.ktor:ktor-server-core:$ktor_version")\n    implementation("io.ktor:ktor-server-netty:$ktor_version")\n    implementation("io.ktor:ktor-server-content-negotiation:$ktor_version")\n    implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")\n    implementation("ch.qos.logback:logback-classic:1.4.14")\n    implementation("io.ktor:ktor-server-cors:$ktor_version")\n}
\n\n

Observação: para SSE não precisamos de uma biblioteca separada — o Ktor suporta transmissão de dados em fluxo nativamente através de corrotinas.

\n\n

Criando o endpoint SSE

\n\n

Agora a parte mais interessante — vamos escrever um servidor que enviará eventos ao cliente a cada 2 segundos. Isso simulará cotações do mercado financeiro.

\n\n
import io.ktor.server.application.*\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.response.*\nimport io.ktor.server.routing.*\nimport kotlinx.co                

Blogs

Book Recommendations