在socket.io下可靠的消息传递?

API提供发送/发送callback机制来确认收到的消息。 但是,如果发生断开或错误,则此callback不会被触发。 在我看来,在断开连接之后,需要经过一些相当混乱的过程来清理未完成的已发送消息(例如 – 假设您稍后可能需要存储消息以供转发的用例等)。 任何简单的想法在这里如何做到这一点? 想知道我是否错过了一些东西….谢谢。

真正的根本问题

这个问题不仅限于socket.io 。 这是一个众所周知的问题,称为两个将军的问题 。

两个军队由一个将军率领,正在准备袭击一座坚固的城市。 军队在城市附近扎营,各自在山上。 山谷将两座山丘分开,两位将军之间沟通的唯一途径就是派遣信使穿过山谷。 不幸的是,这个山谷被这个城市的守军占领,任何一个通过山谷发送的信使都有可能被俘虏(这种情况下,假设两位将军都同意攻击,但是他们还没有同意攻击他们在各自的山上的位置之前)。

您试图通过不可靠的链接达到共同的知识 。

在通过socket.io进行通信的任何阶段,链接都可以被破坏,并且可以发送callback但是对方不能确定它是否到达。

什么可以做

你需要拥抱这个事实,这总是一个可能性。 这并不是一个简单的解决scheme 。 这个问题及其推广在多Agent系统研究等领域仍然正在积极研究。

在你的具体情况下仍然可以做什么

有一些常见的方法来缓解这个问题。

我在使用socket.iodevise应用程序时所做的事情是将ID附加到消息中,如果发生断开连接并且一方尝试发送已发送的消息,则接收方将意识到消息已被接收。

请注意,在实践中,你不需要在任何地方这样做。

关于这个问题的更多阅读

  • 相关的问题在这里SO
  • 微软研究院的拜占庭将军问题 (LESLIE LAMPORT,ROBERT SHOSTAK和MARSHALL PEASE)讨论了这个问题并提出了一些解决scheme
  • 由Yoav Shoham 撰写的着名书籍讲述了Multiagent系统以及他们如何解决这个问题。
  • 博客文章关于这个问题在TCP。