Socket.IO确认交付

时间:2012-07-31 03:53:46

标签: node.js socket.io

在深入研究代码之前,有人可以告诉我Socket.IO中是否有可用于确认传递的文档?

到目前为止,这是我能够收集的内容:

  1. 可以提供回叫,以便在确认消息时进行调用
  2. 有一种特殊模式“volatile”无法保证交付
  3. 默认模式不是“易变”
  4. 这给我留下了一些问题:

    1. 如果邮件不易变,如何处理?它会被无限期缓冲吗?
    2. 如果在合理的时间内无法发送消息,是否有任何通知方式?
    3. 如果我想放弃,有没有办法解除消息?
    4. 关于如何在时间敏感的应用程序中使用Socket.IO而不回退到易失性模式并使用可提供故障事件和某种程度的可配置性的外部ACK层,我感到有些失落。或者我错过了什么?

2 个答案:

答案 0 :(得分:7)

TL; DR除非您愿意等到宇宙死亡,否则您无法获得可靠的确认交付。


您寻求的投放确认信息与理论Two Generals Problem相关,this SO answer中也对此进行了讨论。

TCP通过在无限重试后保证交付来管理可靠性问题。我们生活在一个有限的宇宙中,所以“#34;保证"在理论上是可疑的: - )

除了理论之外,请考虑一下:engine.io,socket.io 1.x的基础,使用以下传输:

  • 的WebSocket
  • FlashSocket
  • XHR民意调查
  • JSONP民意调查

每个传输都基于TCP,TCP是可靠的。因此,只要连接保持连接并且传输不会发生变化,每个socket.io消息或事件都应该是可靠的。但是,有两件事情可以随时发生:

  1. engine.io可以更改传输
  2. socket.io可以在基础传输断开连接的情况下重新连接
  3. 那么当一个客户端或你的服务器在管道正在摆弄这些消息的同时喷出一些消息时会发生什么?它在engine.io protocolsocket.io protocol中都没有说(在撰写本文时,分别在第3版和第4版)。

    正如您在评论中所建议的那样,实施中存在一些确认逻辑。但即使是简单的数字通信也具有非常重要的行为,因此我不信任无监督的socket.io连接以实现可靠的交付,用于任务或安全关键操作。这种情况不会发生变化,直到可靠的交付成为其协议的一部分,并且他们的方法已经过独立和正式的验证。

    欢迎您采纳我的政策:

    • 编号我的留言
    • 在有疑问时要求重新发送
    • 不要改变我的状态 - 客户端服务器 - 除非我知道我准备好了

    简而言之:

    证明保证消息传递确认是不可能的,但是TCP保证了交付命令,并且无限制地提供了#34;重试。我对socket.io消息的信心不足,但它们非常强大且易于使用,所以我只是小心使用它们。

答案 1 :(得分:0)

我使用不同的策略确保交付

  1. 我使用套接字发送数据,在消息中包含 nonce 以防止重复的消息错误
  2. 对方发送确认消息或我在x秒后重新发送
  3. 我每 30 秒使用一次客户端的 REST 调用来请求服务器发送的所有新消息,以在传输过程中捕获任何丢失的消息