Intervalo websocket: ¿problemas de rendimiento en dispositivos móviles?

En mi proyecto actual descubrí un problema al usar websockets con socket.io y node.js en dispositivos móviles. Parece que hay un problema para los mensajes de socket de manejo de dispositivos móviles en un intervalo.

Lo reduje a un escenario mínimo:

El servidor (servidor express.js mínimo) envía mensajes al cliente en un intervalo específico:

setInterval(function(){ socket.emit('interval'); }, 500); 

El cliente simplemente calcula el tiempo entre los mensajes recibidos y los muestra:

 socket.on('interval', function (data) { timeElement.html(new Date() - startTime); startTime = new Date(); }); 

En un desktop (usando Chrome), el tiempo resultante entre los mensajes es bastante estable a 515 ms . Así que es como una demora de 15 ms, pero el intervalo de mensaje es consistente.

En un mobile device (estoy usando un Galaxy Nexus con Chrome) el tiempo varía between 400 and 600 ms con algunos picos más extremos de cualquier manera.

Quiero usar ese intervalo como un indicador de turno de juego y este problema da como resultado un gran retraso y un movimiento desigual de los jugadores en los dispositivos móviles.

No tiene promesas sobre cuándo le llegará un paquete de red. Si no está utilizando un protocolo confiable como TCP, no puede estar seguro de si un paquete le llegará. A veces los paquetes se caen.

A medida que sucede, está utilizando TCP (que es el protocolo de nivel de red subyacente para WebSockets). Cuando se pierde un paquete TCP, la red debe identificar la pérdida y luego reenviar el paquete, causando un retraso. Es posible que la tarjeta de red física del dispositivo móvil simplemente sea más propensa a soltar paquetes que la tarjeta física en su escritorio.

Los intervalos de mensajes de red son un mecanismo terrible para una sincronización confiable.

Otra explicación, o una explicación adicional (si sospecha que la pérdida de paquetes es poco probable) es que en un dispositivo móvil de tan bajo consumo, el controlador de red simplemente no recibe suficiente tiempo en la CPU (o no obtiene su CPU). tiempo bastante pronto), por lo que hay retrasos en el nivel del controlador para procesar la cola de paquetes recibidos en el dispositivo de red física.

  1. Algunos proxies no permiten conexiones de socket web, por lo que en caso de que no lo hagan, entonces necesita cambiar a HTTP.
  2. Dado que la red móvil no es confiable, es posible que su socket web no esté activo. Será bueno seguir controlando durante un período específico de tiempo si la conexión está activa o no. Si no es así, establecer una nueva conexión.