¿Cuál es la mejor manera de enviar datos en tiempo real a una aplicación móvil desde un servidor?

Hay varias formas de enviar datos en tiempo real a una aplicación móvil:

  • Notificaciones push
  • WebSockets
  • Transmisión HTTP, sondeo largo o sondeo simple (con los dos últimos no estrictamente push)
  • Conexión directa TCP / IP
  • WebRTC para mensajería entre pares

La mejor manera dependerá de dos cosas:

  1. La funcionalidad que está intentando construir dentro de su aplicación
  2. Los datos que está entregando y sus requisitos.

Notificaciones push

Para datos ocasionales simples, las notificaciones push serán suficientes. Sin embargo, creo que hay algunas restricciones sobre los datos que se entregan a la aplicación móvil. En cambio, la aplicación se da cuenta de la notificación y tiene que obtener los datos de la fuente original de la que proviene.

WebSocket

WebSocket ofrece una forma de lograr una única conexión bidireccional persistente entre un cliente (aplicación móvil) y un servidor. Es probable que entregue los datos mucho más rápido que las notificaciones push.

Una conexión persistente lo hace muy adecuado para las actualizaciones frecuentes de datos que se entregan directamente a la aplicación.

Dado que se trata de una única conexión persistente, es probable que sea eficiente en términos de uso de recursos, lo que es claramente importante para los dispositivos móviles donde el uso de datos de red y batería son recursos valiosos.

Streaming HTTP

Una conexión persistente de servidor a cliente único. Es probable que entregue los datos mucho más rápido que las notificaciones push.

Adecuado para aplicaciones donde los datos se actualizan frecuentemente.

Dado que la conexión solo permite la comunicación de servidor a cliente, se requieren conexiones adicionales para la funcionalidad de cliente a servidor. Entonces, dependiendo del escenario de comunicación, puede no ser tan eficiente como WebSocket.

HTTP Long-Polling y sondeo estándar

Se realizan solicitudes al servidor a intervalos para obtener nuevos datos. Entonces, no estrictamente empujar.

Adecuado en los siguientes escenarios:

  1. Cuando las actualizaciones no necesitan ser instantáneas
  2. Cuando la infraestructura de red (firewalls y servidores proxy) interfiere con otros tipos de conectividad

Conexión TCP directa

Quería enumerar esto para completar. Claramente de muy bajo nivel.

Siempre he usado un protocolo de nivel superior, pero puede haber escenarios para los que es ideal.

Feliz de aceptar contribuciones adicionales para responder mejor a esta parte.

WebRTC

Conexiones persistentes entre uno o más pares.

Si los datos provienen de otros pares, WebRTC puede ser una opción. Es adecuado para datos, audio y video.

¿Dónde encontrar más?

Si está buscando actualizaciones frecuentes de datos, he compilado una Guía de tecnologías web en tiempo real que puede ser de su interés.

Además, anteriormente no he mencionado el transporte de telemetría MQ (MQTT) que se ha creado para una comunicación ligera dirigida a Internet de las cosas (IoT). Sin embargo, puede haber algunos casos de uso en los que es muy bueno para dispositivos móviles en los que la conectividad será a través de WebSocket o un respaldo HTTP.

Además de los mecanismos de inserción (que la respuesta de Phil ya cubre bien), también es importante pensar en la confiabilidad de los datos. La conectividad en dispositivos móviles es bastante inestable, no solo por la red en sí, sino también por las acciones del usuario. Las aplicaciones en segundo plano o los dispositivos de bloqueo pueden matar sus conexiones de larga duración, causando caídas.

Recomiendo encarecidamente presionar “pistas”, al menos al principio. Una pista es una indicación de la disponibilidad de datos en lugar de los datos reales. Cuando un cliente recibe una pista, hace una solicitud a su API para recuperar los datos reales. Andyet tiene un artículo sobre esto. Pensar en su problema de esta manera facilitará la creación de una aplicación con entrega de datos a prueba de balas.

Por supuesto, la sugerencia agrega latencia de ida y vuelta antes de que el usuario vea una actualización, que es menos que ideal. Pero eso es algo que puede optimizar más adelante.