Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.IO已确认交付_Node.js_Socket.io - Fatal编程技术网

Node.js Socket.IO已确认交付

Node.js Socket.IO已确认交付,node.js,socket.io,Node.js,Socket.io,在我深入研究代码之前,有人能告诉我Socket.IO中是否有可供确认交付的文档吗 以下是我迄今为止收集到的信息: 可以提供回调,以便在确认消息时调用 有一种特殊模式“volatile”,不能保证交付 存在一种非“易失性”的默认模式 这给我留下了一些问题: 如果消息不是易失性的,如何处理它?它会被无限期地缓冲吗 如果邮件无法在合理的时间内送达,有没有办法得到通知 如果我想放弃的话,有没有办法解除我的留言 对于如何在时间敏感的应用程序中使用Socket.IO而不返回到易失性模式,以及如何使用能够提供

在我深入研究代码之前,有人能告诉我Socket.IO中是否有可供确认交付的文档吗

以下是我迄今为止收集到的信息:

  • 可以提供回调,以便在确认消息时调用
  • 有一种特殊模式“volatile”,不能保证交付
  • 存在一种非“易失性”的默认模式
  • 这给我留下了一些问题:

  • 如果消息不是易失性的,如何处理它?它会被无限期地缓冲吗
  • 如果邮件无法在合理的时间内送达,有没有办法得到通知
  • 如果我想放弃的话,有没有办法解除我的留言

  • 对于如何在时间敏感的应用程序中使用Socket.IO而不返回到易失性模式,以及如何使用能够提供故障事件和某种级别的可配置性的外部ACK层,我有点不知所措。还是我遗漏了什么;博士,除非你愿意等到宇宙消亡,否则你无法获得可靠的确认分娩。


    您寻求的交货确认书与理论交货确认书有关,这一点在中也有讨论

    TCP通过保证无限次重试后的交付来管理可靠性问题。我们生活在一个有限的宇宙中,因此“保证”一词在理论上是可疑的:——)

    理论除外,考虑如下:SokKo.IO 1 .x的基础,使用以下传输:

    • 网袋
    • 插座
    • XHR轮询
    • JSONP轮询
    每个传输都基于TCP,并且TCP是可靠的。因此,只要连接保持连接并且传输不改变,每个单独的socket.io消息或事件都应该是可靠的。然而,有两件事可以在飞行中发生:

  • engine.io可以更改传输
  • socket.io可以在底层传输断开连接的情况下重新连接
  • 那么,当一个客户端或您的服务器在处理管道时喷射出一些消息时会发生什么呢?在或中都没有说明(在撰写本文时,分别在版本3和版本4中)

    正如您在评论中所建议的,在实现中有一些确认逻辑。但是,即使是简单的数字通信也没有什么不寻常的行为,因此,对于任务或安全关键型操作,我不信任无监督的socket.io连接以实现可靠的传输。直到可靠的交付成为他们协议的一部分,并且他们的方法得到独立和正式的验证,这种情况才会改变

    欢迎您采纳我的政策:

    • 给我的邮件编号
    • 有疑问时要求重新发送
    • 不要改变我的状态-客户端或服务器-除非我知道我已经准备好了
    简言之:
    有保证的消息传递确认被证明是不可能的,但TCP保证在“无限”重试的情况下传递和订购。我对socket.io消息不太自信,但它们确实强大且易于使用,所以我使用它们时非常小心。

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

  • 我使用在消息中包含nonce的套接字发送数据,以防止重复的消息错误
  • 另一方发送已接收测量信息的确认,或我在x秒后重新发送
  • 我使用客户端每30秒进行一次REST调用,请求服务器发送的所有新消息捕获传输过程中丢弃的消息

  • 下面是我通过浏览代码收集到的信息。请不要将其视为权威-在某些情况下,我可能完全错了。Socket.IO不会重新发送任何数据。底层传输(即TCP)有其自己的重发机制,但Socket.IO不公开对它们的任何控制。当(非易失性)消息通过未打开的传输在“Socket”上发送时,该消息将被放入队列中,以便在传输打开时发送。消息排队的时间似乎没有任何限制,但当“套接字”本身关闭时,队列会被清除。如果消息需要确认(回调),则会向哈希表添加一个条目,将消息id映射到其回调函数。如果返回确认数据包,则调用回调。如果消息本身或确认被丢弃,回调将永远不会触发。据我所知,“套接字”的回调散列永远不会被清除,无论是否收到ack。我认为这将是一个严重的问题,除非我遗漏了什么。+1表示“除非你愿意等到宇宙消亡,否则你无法获得可靠的确认交付。”