Confiabilidad del transporte de Websocket (pérdida de datos de Socket.io durante la reconexión)

Usado

NodeJS, Socket.io

Problema

Imagina que hay 2 usuarios.U1 & U2, conectado a una aplicación a través de Socket.io. El algoritmo es el siguiente:

U1 Pierde completamente la conexión a Internet (por ejemplo, apaga Internet)U2 envía un mensaje aU1.U1 Aún no se ha recibido el mensaje porque Internet está inactivo.Servidor detectaU1 desconexión por latido del tiempo de esperaU1 reconecta a socket.ioU1 nunca recibe el mensaje deU2 - Se pierde en el paso 4, supongo.Explicación posible

Creo que entiendo por qué sucede:

en el paso 4Servidor mata la instancia de socket y la cola de mensajes aU1 tambiénAdemás en el paso 5U1 yServidor cree una nueva conexión (no se reutiliza), por lo que incluso si el mensaje sigue en cola, la conexión anterior se pierde de todos modos.Necesitas ayuda

¿Cómo puedo prevenir este tipo de pérdida de datos? Tengo que usar latidos, porque no las personas cuelgan en la aplicación para siempre. También debo dar la posibilidad de volver a conectarme, porque cuando implemento una nueva versión de la aplicación no deseo ningún tiempo de inactividad.

PD Lo que yo llamo "mensaje" no es solo un mensaje de texto que puedo almacenar en la base de datos, sino un valioso mensaje del sistema, cuya entrega debe estar garantizada, o la UI se equivoca.

¡Gracias!

Adición 1

Ya tengo un sistema de cuenta de usuario. Además, mi aplicación ya es compleja. Agregar estados sin conexión / en línea no ayudará, porque ya tengo este tipo de cosas. El problema es diferente.

Echa un vistazo al paso 2. En este paso técnicamenteno puedo decir si U1 se desconecta, solo pierde la conexión, digamos por 2 segundos, probablemente debido a una mala conexión a Internet. Entonces, U2 le envía un mensaje, pero U1 no lo recibe porque Internet aún no funciona (paso 3). El paso 4 es necesario para detectar usuarios sin conexión, digamos, el tiempo de espera es de 60 segundos. Finalmente, en otros 10 segundos, la conexión a Internet para U1 se activa y se vuelve a conectar a socket.io. Pero el mensaje de U2 se pierde en el espacio porque en el servidor U1 se desconectó por tiempo de espera.

Ese es el problema, no voy a ser 100% de entrega.

SoluciónRecoge un emisor (nombre y datos de emisión) en el usuario {}, identificado por emitID aleatorio. Enviar emitirConfirme la emisión en el lado del cliente (envíe la emisión de nuevo al servidor con emitID)Si está confirmado, elimine el objeto de {} identificado por emitIDSi el usuario se ha vuelto a conectar: ​​marque {} para este usuario y realice un ciclo a través de él ejecutando el Paso 1 para cada objeto en {}

Cuando está desconectado y / o conectado a la descarga {} para el usuario si es necesario

// Server const pendingEmits = {};

socket.on ('reconexión', () => resendAllPendingLimits); socket.on ('confirm', (emitID) => {delete (pendingEmits [emitID]);});

// Cliente socket.on ('algo', () => {socket.emit ('confirmar', emitID);});

Respuestas a la pregunta(6)

Su respuesta a la pregunta