NodeJS Socket.io
假设有两个用户 U1和 U2,通过 Socket.io 连接到一个应用程序:
我想我知道为什么会这样:
如何防止这类数据丢失?我必须使用心跳,因为我不会让人们永远挂在应用程序上。此外,我还必须提供重新连接的可能性,因为当我部署新版本的应用程序时,我希望零停机时间。
附言。我称之为“消息”的东西不仅是可以存储在数据库中的文本消息,还是有价值的系统消息,必须保证传递,否则用户界面会搞砸。
谢谢!
我已经有一个用户账户系统了。而且,我的应用程序已经很复杂了。添加离线/在线状态不会有任何帮助,因为我已经有了这类东西。问题不一样。
看看第二步。在这一步我们技术上 无法确定 U1是否离线,他只是失去连接让说2秒钟,可能是因为互联网不好。所以 U2给他发了一条信息,但是 U1没有收到,因为他还没有上网(第三步)。需要步骤4来检测脱机用户,比方说,超时60秒。最终在另一个10秒钟的互联网连接为 U1是起来了,他重新连接到 socket.io。但是来自 U2的消息在太空中丢失了,因为服务器上的 U1被超时断开了连接。
这就是问题所在,我不想百分百交货。
// Server
const pendingEmits = {};
socket.on('reconnection', () => resendAllPendingLimits);
socket.on('confirm', (emitID) => { delete(pendingEmits[emitID]); });
// Client
socket.on('something', () => {
socket.emit('confirm', emitID);
});
增补2020年2月1日。
虽然这不是 Websockets 的真正解决方案,但有些人可能仍然觉得它很方便。我们从 Websockets 迁移到了 SSE + Ajax。SSE 允许您从客户端进行连接,以保持持久的 TCP 连接,并实时从服务器接收消息。要将消息从客户机发送到服务器,只需使用 Ajax。存在延迟和开销等缺点,但 SSE 保证可靠性,因为它是 TCP 连接。
因为我们使用 Express,所以我们对 SSE https://github.com/dpskvn/express-sse使用这个库,但是您可以选择一个适合您的库。
在 IE 和大多数 Edge 版本中不支持 SSE,因此需要一个 polyfill: https://github.com/Yaffle/EventSource。