Monthly Archives: March 2012

Notificaciones en Tiempo Real – Pusher

Las últimas aplicaciones web utilizan mucho notificaciones en tiempo real; desde chat (por ejemplo Facebook Chat), notificaciones de nuevos elementos (Twitter), actualizaciones de progreso (por ejemplo procesando un archivo).

La primera aproximación fue utilizar un poll en ajax (solicitar datos de manera periódica); pero no puede escalar fácilmente (una mala implementación puede hacer que aplicación sufra un DDos) y tendrás retrasos en tus actualizaciones.

Del lado del servidor hay muchas librerías/servidores con soluciones para esto. La buena noticia es que WebSockets será el estándar y la solución para notificaciones de tiempo real tanto en navegador como en servidor. La mala noticia es que el estándar de WebSocket está en progreso y cambia mucho entre versiones, por lo que no es estable entre los principales navegadores (Firefox, Safari y Chrome lo implementan pero con diferentes versiones)

Una buena opción son las implementaciones en la nube que eliminan todos los problemas de programación y mantenimiento de servidores para esta tarea.

Hasta el momento he probado dos implementaciones: Beaconpush (que me gustaba para implementaciones rápidas y que tenían pocos mensajes que enviar; pero ahora está en proceso de eliminar esta característica y dejar solo un versión para instalar) y Pusher

Pusher.com es una grandiosa solución para notificaciones en tiempo real. El equipo responde rápido y aporta ayuda todo el tiempo.

Detallaré algunas ventajas y problemas que puedes encontrar si necesitas escogerlo.

Ventajas:

  • Barato, especialmente si vas a mandar muchos mensajes
  • Fácil de implementar en servidor y en el navegador
  • Utiliza websockets en los principales navegadores (usa por ejemplo la reciente implementación de Mozilla y nunca tuve un problema de conexión en versiones diferentes de Safari/Chrome)
  • Tiene mecanismos de autenticación que te permiten asegurar tus mensajes (En Beaconpush era fácil recibir mensajes de otros si no escondías el id del usuario)
  • Tiene canales de presencia (presence channels) que significa que puedes ver a los otros usuarios conectados sin implementarlo en tu servidor
  • Puedes almacenar datos cuando el usuario es autorizado(por ejemplo datos rendereados en HTML), por lo que puedes usarlo para mostrar datos en tu navegador
  • Webhooks que te permiten saber cuando tu canal está ocupado o vacío (en línea/desconectado si utilizas un “canal de usuario”)

Problemas

  • No estoy seguro si realmente limitan el número de conexiones, porque si tienes un sitio grande con pocas notificaciones puedes fácilmente llegar al límite de conexiones (Además que pienso que son realmente límites muy bajos)
  • Todos son canales, así que no puedes manejar id de usuarios, la solución es fácil si creas “canales de usuarios” (canales privados solo para el usuario y manejas la autorización)
  • No tienen un API para enviar un mensaje a múltiples canales (o destinatarios)
  • Del lado del servidor no puedes obtener una lista de usuarios en un canal (Aunque sería difícil de procesar porque no tienen id de usuarios sino un socket_id)
  • Los Webhooks son geniales para páginas ajax, pero no funcionarán fácilmente si tu usuario navega varias páginas, ya que obtendrás muchas notificaciones de conectado/desconectado (tienen una solución para el navegador, pero en servidor necesitas tu propia solución
  • En mis pruebas, si utilizaba la configuración por defecto tenía un retraso en la conexión de hasta 10 segundos para iniciar; si forzaba a utilizar socket seguros, funcionaba sin problemas:
    new Pusher(applicationKey, {encrypted: true});

Pienso que Pusher es una excelente solución de sitios pequeños a medianos; debido a que te permite hacer un desarrollo rápido y las notificaciones en tiempo real tienen un gran impacto en tu aplicación.