Estoy trabajando en un proyecto en el que un cliente debe poder comunicarse con un servidor a través de WebSockets. Dado que la aplicación que desarrollamos es altamente receptiva a la entrada del usuario, hemos decidido permitir que un WebWorker haga toda la comunicación a través de la red para que una conexión lenta no pueda interrumpir la GUI. Eso funciona bien hasta ahora.JavaScript: Uso de una cola para comunicación de red
Ahora pensamos en las optimizaciones que serán necesarias si la red es lenta y la cantidad de mensajes que se envían es alta. Como la mayoría de estos mensajes serán solo para sincronizar la interfaz de usuario de otros clientes, podemos eliminar algunos de ellos si es necesario. Pero para hacerlo necesitamos la posibilidad de detectar las situaciones cuando hay congestión.
Se nos ocurrió la idea de una cola: cada mensaje que se envía se inserta en una cola y el WebWorker no hace más que iterar permanentemente sobre la cola y enviar todos los mensajes que encuentra allí. Con eso, podemos dejar que el Trabajador actúe de manera diferente si hay un cierto número de elementos en la cola (es decir, los mensajes se envían demasiado despacio). La idea es simple y directa, sin embargo, la implementación no parece ser así.
var ws;
var queue = new Array();
function processMessageQueue() {
while(true)
if(queue.length > 0) ws.send(queue.shift());
}
self.addEventListener('message', function(e) {
var msg = e.data;
switch(msg.type) {
case 'SEND':
queue.push(JSON.stringify(msg));
break;
case 'CREATE_WS':
ws = new WebSocket(msg.wsurl);
ws.onmessage = function(e) {
self.postMessage(JSON.parse(e.data));
}
processMessageQueue();
}
}, false);
Como puede ver, el trabajador crea el WebSocket tan pronto como recibió el mensaje para hacerlo. A continuación, ejecuta la función processMessageQueue() que es el ciclo que vacía permanentemente la cola enviando sus datos a través de WebSocket. Ahora, mi problema es que parece que no hay posibilidad de insertar mensajes en la cola. Eso debería ocurrir cuando llega un mensaje de tipo 'SEND' pero no puede porque el Worker está demasiado ocupado como para manejar cualquier evento. Por lo tanto, puede pasar por encima de la cola o enviar mensajes, no ambos.
Lo que necesito es una manera de empujar datos de alguna manera en esta cola. Si eso no es posible, me gustaría saber si alguien puede pensar en otra forma de averiguar cuándo los mensajes llegan más rápido de lo que se envían. ¿Algún consejo?
¡Gracias de antemano!
Ahh, eso era demasiado fácil. Funciona como un encanto, gracias! – j0ker