在深入研究代码之前,有人可以告诉我Socket.IO中是否有可用于确认传递的文档?
到目前为止,这是我能够收集的内容:
这给我留下了一些问题:
关于如何在时间敏感的应用程序中使用Socket.IO而不回退到易失性模式并使用可提供故障事件和某种程度的可配置性的外部ACK层,我感到有些失落。或者我错过了什么?
答案 0 :(得分:7)
TL; DR除非您愿意等到宇宙死亡,否则您无法获得可靠的确认交付。
您寻求的投放确认信息与理论Two Generals Problem相关,this SO answer中也对此进行了讨论。
TCP通过在无限重试后保证交付来管理可靠性问题。我们生活在一个有限的宇宙中,所以“#34;保证"在理论上是可疑的: - )
除了理论之外,请考虑一下:engine.io,socket.io 1.x的基础,使用以下传输:
每个传输都基于TCP,TCP是可靠的。因此,只要连接保持连接并且传输不会发生变化,每个socket.io消息或事件都应该是可靠的。但是,有两件事情可以随时发生:
那么当一个客户端或你的服务器在管道正在摆弄这些消息的同时喷出一些消息时会发生什么?它在engine.io protocol或socket.io protocol中都没有说(在撰写本文时,分别在第3版和第4版)。
正如您在评论中所建议的那样,实施中存在一些确认逻辑。但即使是简单的数字通信也具有非常重要的行为,因此我不信任无监督的socket.io连接以实现可靠的交付,用于任务或安全关键操作。这种情况不会发生变化,直到可靠的交付成为其协议的一部分,并且他们的方法已经过独立和正式的验证。
欢迎您采纳我的政策:
证明保证消息传递确认是不可能的,但是TCP保证了交付和命令,并且无限制地提供了#34;重试。我对socket.io消息的信心不足,但它们非常强大且易于使用,所以我只是小心使用它们。
答案 1 :(得分:0)
我使用不同的策略确保交付