Realtime sin websockets

Cuando nos llega un requerimiento de aplicaciones en tiempo real y este requerimiento viene despues de Junio del 2018, la primera solucion que te vendra a la mente, sera usar websockets (creo) porque es una de las formas en las que podemos obtener actualizaciones de informacion desde el servidor, sin embargo, muchas empresas sobre todo las mas actualizadas (bancos, aseguradoras e instituciones financieras), debido a sus restricciones de red no siempre permiten usar protocolos tales como websockets y muchos desarrolladores piensan que la unica alternativa a websockets es polling o long-polling (hacer requests cada 5 o 3 segundos, o extender el request lo mas posible hasta recibir una respuesta) y usar una libreria como cometd para ayudar con eso (adivinas, tampoco me gusta cometd, de hecho soy uno de esos desarrolladores que no le gustan muchas cosas :P).

Existe una tercera opcion llamada SSE esta opcion es tal vez la menos usada, no se bien si solo es mi impresion o es verdad, no cuento con estadisticas para soportar esta afirmacion, lo que si es seguro es que no tenemos problemas de protocolos, porque es simplemente un http request pero con esteroides, al igual que long-polling no cerramos la conexion, pero a diferencia de long-polling si recibimos informacion tampoco cerramos la conexion, esta es una enorme diferencia y si puedes mantener el request abierto por 10 minutos solo ocupas uno.

Si eres afortunado y estas en una organizacion que puede entregar http2 y sus clientes usan navegadores que lo soporten, los beneficios son todavia mayores, ya que el canal se optimiza mucho mas y el numero de conexiones que se crean se reducen drasticamente. Ahora bien SSE tampoco es la ultima tecnologia del siglo, tambien tiene rato, y aunque no es soportado por todos los navegadores (IE como casi siempre) existe un polyfill que lo integra para IE 11, ahora bien, esto es tan sencillo que crear tu propio cliente SSE no es complicado, pero para que hacer eso, usemos el del navegador.

El server

En este post vamos a iniciar creando el servidor Web SSE, en el siguiente post crearemos el cliente, y luego mandaremos un mensaje de eco, y veremos si nos responde adecuadamente :D.

Creamos un nuevo proyecto kotlin con Intellij community edition y gradle y vamos a agregar las siguientes dependencias al archivo build.gradle como ya sabemos.

 

Exacto lo vamos a hacer con Undertow, un servidor que nos ofrece interesentes capacidades asynchronas no bloqueantes. Y ademas tiene un handler para SSE, lo cual nos facilitara el trabajo, creamos nuestro Main.kt file:

 

El codigo es bastante simple, agregamos dos paths "/" y "/sse" el primero es para configurar CORS que sera la primera version de este server y el segundo es para escuchar peticiones para SSE, la funcion messageSender nos permite enviar mensajes en cualquier momento que queramos, que en este momento no estamos enviando nada, pero cuando tengamos el html podremos enviar ecos :D, bueno, aqui como puedes ver ademas de todo Undertow casi se parece a Express de nodejs que es bastante simple y poderoso, nada nos limita para crear servicios REST con Undertow sin tanta paja como con Spring boot (si tampoco me gusta spring, :P, pero no significa que a ti no te pueda gustar, para gustos hay moles).

En el siguiente post crearemos el cliente con React para el eco usando Parcel. Luego veremos que mas hacemos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Nopalin

Como es diferente de websockets?

Websocket es un protocolo de comunicación por encima de HTTP, que a su vez funciona através de TCP. Hablar de websocket no es otra cosa que una conexión TCP persistente que se mantendrá abierta mientras dure la sesión.

Esta libreria no la conozco, pero podrias explicar un poco más a fondo como es que funciona y como es mas segura que websocket?

Saludos

PD websocket puede funcionar sobre HTTPS.

SSE tambien es un socket

Creo que entendi dos preguntas: Websockets como dices es un protocolo sobre http y despues se envian datagramas en modo full duplex, Server Sent Events o SSE es como websockets pero no hay full duplex, solo envia eventos al browser, es util en situaciones donde Websockets no es una opcion, muchas empresas sobre todo grandes por miedo, falta de infraestructura o demasiada complejidad no dejan usar websockets, SSE es una alternativa ya que es exactamente lo mismo que cualquier http request, solo que no cerramos la conexion, cosa importante tampoco es long-polling, en long polligng cada request cierra la conexion en cuanto hay informacion disponible, SSE no, en cuestiones de seguridad no es que sea mas segura, simplemente toda la infraestuctura que tengas para peticiones http seguira siendo lo mismo.

La otra parte es la libreria Undertow, no es una libreria solo para SSE, es un Webserver java completo, puedes hacer http2, websockets, SSE, servir servlets y jsp's, de hecho es el webserver que JBOSS de Redhat usa (ellos crearon Undertow), es como jetty o tomcat, pero a mi en lo personal se me hace mas sencillo de integrar, sobre todo cuando no necesitas un JEE server completo.

Imagen de Nopalin

Y técnicamente hablando como

Y técnicamente hablando como envia eventos al browser? como establece la conexión hacia éste si puede estar detrás de un firewall por ejemplo?