【问题标题】:Socket.IO confirmed deliverySocket.IO 确认交付
【发布时间】:2012-07-31 03:53:46
【问题描述】:

在我深入研究代码之前,谁能告诉我是否有任何文档可用于在 Socket.IO 中确认交付?

以下是我目前能够收集到的信息:

  1. 可以提供回调以在消息被确认时调用
  2. 有一种特殊模式“volatile”不能保证交付
  3. 有一个默认模式不是“易失性”

这给我留下了一些问题:

  1. 如果消息不是易失性的,它是如何处理的?会无限期缓冲吗?
  2. 如果消息无法在合理的时间内送达,有什么方法可以得到通知?
  3. 如果我想放弃,有什么方法可以取消缓冲消息?

对于如何在时间敏感的应用程序中使用 Socket.IO 而不退回到易失性模式并使用可以提供故障事件和某种程度的可配置性的外部 ACK 层,我有点茫然。还是我错过了什么?

【问题讨论】:

  • 以下是我通过浏览代码收集到的内容。请不要把它当作权威 - 在某些情况下我可能完全错了。
  • Socket.IO 不会重新发送任何数据。底层传输(即 TCP)有自己的重发机制,但 Socket.IO 不公开对它们的任何控制。
  • 当(非易失性)消息通过未打开的传输在“套接字”上发送时,该消息将被放入队列中,以便在打开传输时发送。消息可以排队的时间似​​乎没有任何限制,尽管当“套接字”本身关闭时队列会被清除。
  • 如果消息需要确认(回调),则会将条目添加到哈希表中,将消息 ID 映射到其回调函数。当并且如果返回确认数据包时,则调用回调。如果消息本身或确认被丢弃,回调将永远不会触发。
  • 我发布这个问题已经快一年了,似乎没有人对此主题有任何补充。我希望能从更了解 Socket.IO 的人那里得到一些反馈。你可以把上面的笔记记下来,因为它们是令人毛骨悚然的,但目前我不知道我的结论当时或现在有多准确或相关。就我而言,这是一个悬而未决的问题。

标签: node.js socket.io


【解决方案1】:

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


您寻求的交货确认与理论上的Two Generals Problem有关,在this SO answer中也有讨论。

TCP 通过在无限 次重试后保证传递来管理可靠性问题。我们生活在一个有限的宇宙中,所以“保证”这个词在理论上是可疑的:-)

抛开理论,考虑一下:engine.io,socket.io 1.x 的基础,使用以下传输:

  • WebSocket
  • FlashSocket
  • XHR 轮询
  • JSONP 轮询

这些传输中的每一个都基于 TCP,而 TCP 是可靠的。因此,只要连接保持连接并且传输不改变,每个单独的 socket.io 消息或事件都应该是可靠的。但是,有两件事情可能会即时发生:

  1. engine.io 可以更改传输方式
  2. socket.io 可以在底层传输断开时重新连接

那么,当客户端或您的服务器在管道被这样摆弄时喷出一些消息会发生什么?在engine.io protocolsocket.io protocol(在撰写本文时分别为版本 3 和 4)中没有说明。

正如您在 cmets 中所建议的,在实现中有一些确认逻辑。但是,即使是简单的数字通信也没有不重要的行为,所以我不相信无监督的 socket.io 连接可以可靠地传递任务或安全关键操作。在可靠交付成为他们协议的一部分并且他们的方法得到独立和正式验证之前,这种情况不会改变。

欢迎您采纳我的政策:

  • 给我的消息编号
  • 如有疑问,请重新发送
  • 不要改变我的状态 - 客户端服务器 - 除非我知道我准备好了

简而言之:

有保证的消息传递确认被证明是不可能的,但 TCP 保证传递 顺序给定“无限”重试。我对 socket.io 消息不太有信心,但它们确实非常强大且易于使用,所以我只是小心使用它们。

【讨论】:

  • +1 表示“除非您愿意等到宇宙消亡,否则您无法获得可靠的确认交付。”
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2023-03-13
    • 2018-09-11
    • 2016-07-18
    • 2011-02-22
    相关资源
    最近更新 更多