Confiabilidade de transporte Websocket (perda de dados Socket.io durante a reconexão)

Usava

NodeJS, Socket.io

Problema

Imagine que existem 2 usuáriosU1 & U2, conectado a um aplicativo via Socket.io. O algoritmo é o seguinte:

U1 perde completamente a conexão com a Internet (ex. desativa a Internet)U2 envia uma mensagem paraU1.U1 não recebe a mensagem ainda, porque a Internet está inoperanteServidor detectaU1 desconexão por tempo limite de pulsaçãoU1 reconecta-se ao socket.ioU1 nunca recebe a mensagem deU2 - está perdido no passo 4, eu acho.Explicação possível

Acho que entendi porque acontece:

no passo 4Servidor mata a instância do socket e a fila de mensagens paraU1 tambémAlém disso, no passo 5U1 eServidor crie uma nova conexão (ela não é reutilizada), portanto, mesmo que a mensagem ainda esteja na fila, a conexão anterior será perdida de qualquer maneira.Preciso de ajuda

Como posso evitar esse tipo de perda de dados? Eu tenho que usar hearbeats, porque eu não as pessoas ficam no aplicativo para sempre. Também devo ainda dar a possibilidade de se reconectar, porque quando eu implantar uma nova versão do aplicativo eu quero zero inatividade.

P.S. A coisa que eu chamo de "mensagem" não é apenas uma mensagem de texto que eu posso armazenar no banco de dados, mas uma valiosa mensagem do sistema, cuja entrega deve ser garantida, ou que a interface do usuário estraga.

Obrigado!

Adição 1

Eu já tenho um sistema de conta de usuário. Além disso, meu aplicativo já é complexo. Adicionar status offline / online não ajudará, porque eu já tenho esse tipo de coisa. O problema é diferente.

Confira o passo 2. Nesta etapa nós tecnicamenteNão posso dizer se o U1 fica off-line, ele só perde conexão, digamos por 2 segundos, provavelmente por causa da internet ruim. Então o U2 envia uma mensagem para ele, mas o U1 não o recebe porque a internet ainda está baixa para ele (passo 3). A etapa 4 é necessária para detectar usuários off-line, digamos, o tempo limite é de 60 segundos. Eventualmente, em outros 10 segundos, a conexão com a Internet para o U1 é ativada e ele se reconecta ao socket.io. Mas a mensagem do U2 é perdida no espaço porque no servidor U1 foi desconectado pelo tempo limite.

Esse é o problema, eu não quero 100% de entrega.

SoluçãoColete um emissor (nome e dados de emissão) no {} usuário, identificado por emitID aleatório. Enviar emitConfirme o emissor no lado do cliente (envie de volta ao servidor com emitID)Se confirmado - excluir objeto de {} identificado por emitIDSe o usuário se reconectar - verifique {} para este usuário e faça um loop por ele executando a Etapa 1 para cada objeto em {}

Quando desconectado e / ou conectado, flush {} para o usuário, se necessário

// Servidor const pendingEmits = {};

socket.on ('reconexão', () => resendAllPendingLimits); socket.on ('confirmar', (emitID) => {delete (pendingEmits [emitID]);});

// Client socket.on ('alguma coisa', () => {socket.emit ('confirm', emitID);});

questionAnswers(6)

yourAnswerToTheQuestion