相关疑难解决方法(0)

Websocket传输可靠性(重新连接时Socket.io数据丢失)

用过的

NodeJS,Socket.io

问题

想象一下,有2个用户U1U2,通过Socket.io连接到应用程序.算法如下:

  1. U1完全失去互联网连接(例如关闭互联网)
  2. U2U1发送消息.
  3. U1尚未收到该消息,因为Internet已关闭
  4. 服务器通过心跳超时检测到U1断开连接
  5. U1重新连接到socket.io
  6. U1从未收到来自U2的消息- 我猜它在第4步丢失了.

可能的解释

我想我明白为什么会这样:

  • 第4步服务器杀死Socket实例和消息队列U1以及
  • 此外,在步骤5 U1服务器上创建新连接(它不被重用),因此即使消息仍然排队,以前的连接仍然会丢失.

需要帮忙

如何防止这种数据丢失?我必须使用hearbeats,因为我没有人永远挂在应用程序中.此外,我仍然必须重新连接,因为当我部署新版本的应用程序时,我希望零停机时间.

PS我称之为"消息"的东西不仅仅是我可以存储在数据库中的文本消息,而是有价值的系统消息,必须保证交付,或UI搞砸了.

谢谢!


增加1

我已经有了一个用户帐户系统.而且,我的申请已经很复杂了.添加离线/在线状态无济于事,因为我已经有了这种东西.问题不同了.

检查第2步.在这一步我们技术上不能说U1是否脱机,他只是失去连接让我说2秒,可能是因为互联网不好.所以U2给他发了一条消息,但U1没有收到它,因为互联网仍在为他服务(步骤3).需要步骤4来检测离线用户,假设超时为60秒.最后,在另一个10秒内,U1的互联网连接正常,他重新连接到socket.io.但来自U2的消息在空间中丢失,因为服务器U1在超时时断开连接.

这是问题,我不是100%交付.


  1. 收集{}用户的emit(发出名称和数据),由随机的emitID标识.发送发射
  2. 确认客户端的emit(使用emitID发送回服务器)
  3. 如果确认 - 从emitID标识的{}中删除对象
  4. 如果用户重新连接 - 请检查此用户的{}并循环执行它,为{}中的每个对象执行步骤1
  5. 在必要时断开连接或/和连接flush {}

    //服务器const pendingEmits = {};

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

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

node.js socket.io

72
推荐指数
1
解决办法
2万
查看次数

标签 统计

node.js ×1

socket.io ×1