Server-Sent Events en Kotlin: cómo hacer que el streaming de datos sea simple y rápido

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Olvídate del sondeo eterno: conoce Server-Sent Events en Kotlin

\n\n

Imagina: abres un terminal bursátil y las cotizaciones se actualizan solas. O entras al panel de administración de un sitio y ves un feed en vivo de la cantidad de usuarios en línea. Sin botones de "Actualizar", sin solicitudes interminables al servidor. Simplemente un flujo de datos en tiempo real.

\n\n

En el mundo del desarrollo web, esto se logra con Server-Sent Events (SSE), un protocolo que permite al servidor enviar datos al cliente de forma autónoma a través de una única conexión HTTP. Y hoy te mostraré cómo implementar SSE en Kotlin usando el framework Ktor. No será teoría aburrida, sino un ejemplo funcional completo, desde el servidor hasta el cliente.

\n\n

¿Qué son Server-Sent Events y por qué son geniales?

\n\n

Hace tiempo, para obtener datos actualizados, los desarrolladores usaban polling (sondeo). El cliente preguntaba al servidor cada N segundos: "¿Hay novedades?". El servidor respondía: "No". Y así en un bucle. Esto es terriblemente ineficiente: el 99% de las solicitudes son vacías y el servidor gasta recursos procesando conexiones innecesarias.

\n\n

SSE resuelve el problema de raíz: el cliente abre una sola conexión y el servidor envía los datos cuando aparecen. Es como suscribirse a un boletín de noticias: solo esperas y te traen la edición más reciente.

\n\n

Ventajas de Server-Sent Events en Kotlin:

\n
    \n
  • Simplicidad — funciona sobre HTTP estándar, no requiere bibliotecas adicionales en el cliente (excepto el EventSource integrado en el navegador).
  • \n
  • Reconexión automática — si la conexión se interrumpe, el navegador se reconecta solo.
  • \n
  • Ahorro de recursos — una sola conexión en lugar de docenas.
  • \n
  • Soporte nativo en Kotlin — con Ktor y corrutinas, escribir un servidor SSE es un placer.
  • \n
\n\n

¿El principal inconveniente? SSE es un canal unidireccional (solo del servidor al cliente). Si necesitas comunicación bidireccional, mira hacia WebSocket. Pero para notificaciones, feeds de noticias, cotizaciones, monitoreo, SSE es ideal.

\n\n

¿Cuándo usar SSE en tu proyecto Kotlin?

\n\n
    \n
  • Feed de notificaciones — nuevos mensajes, comentarios, "me gusta".
  • \n
  • Monitoreo y registros — streaming de logs del servidor en tiempo real.
  • \n
  • Datos bursátiles — actualización de tipos de cambio, acciones, criptomonedas.
  • \n
  • Progreso de tareas — informe de carga de archivos o procesamiento de datos.
  • \n
  • Sistemas de alerta — señales de emergencia, estados de dispositivos.
  • \n
\n\n

Si buscas una forma de transmitir actualizaciones del servidor al cliente sin complicaciones, SSE Kotlin es tu opción. Pasemos al código.

\n\n

Configuración del proyecto: Ktor + SSE

\n\n

Primero, crearemos un nuevo proyecto Ktor. Usaré Gradle Kotlin DSL. En build.gradle.kts agregamos las dependencias:

\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

Nota: para SSE no necesitamos una biblioteca adicional, Ktor soporta transmisión de datos de forma nativa mediante corrutinas.

\n\n

Creando el endpoint SSE

\n\n

Ahora lo más interesante: escribiremos un servidor que envíe eventos al cliente cada 2 segundos. Será una simulación de cotizaciones bursátiles.

\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