在socket.io下可靠的消息传递?
API提供发送/发送callback机制来确认收到的消息。 但是,如果发生断开或错误,则此callback不会被触发。 在我看来,在断开连接之后,需要经过一些相当混乱的过程来清理未完成的已发送消息(例如 – 假设您稍后可能需要存储消息以供转发的用例等)。 任何简单的想法在这里如何做到这一点? 想知道我是否错过了一些东西….谢谢。
真正的根本问题
这个问题不仅限于socket.io
。 这是一个众所周知的问题,称为两个将军的问题 。
两个军队由一个将军率领,正在准备袭击一座坚固的城市。 军队在城市附近扎营,各自在山上。 山谷将两座山丘分开,两位将军之间沟通的唯一途径就是派遣信使穿过山谷。 不幸的是,这个山谷被这个城市的守军占领,任何一个通过山谷发送的信使都有可能被俘虏(这种情况下,假设两位将军都同意攻击,但是他们还没有同意攻击他们在各自的山上的位置之前)。
您试图通过不可靠的链接达到共同的知识 。
在通过socket.io
进行通信的任何阶段,链接都可以被破坏,并且可以发送callback
但是对方不能确定它是否到达。
什么可以做
你需要拥抱这个事实,这总是一个可能性。 这并不是一个简单的解决scheme 。 这个问题及其推广在多Agent系统研究等领域仍然正在积极研究。
在你的具体情况下仍然可以做什么
有一些常见的方法来缓解这个问题。
我在使用socket.io
devise应用程序时所做的事情是将ID附加到消息中,如果发生断开连接并且一方尝试发送已发送的消息,则接收方将意识到消息已被接收。
请注意,在实践中,你不需要在任何地方这样做。
关于这个问题的更多阅读
- 相关的问题在这里SO
- 微软研究院的拜占庭将军问题 (LESLIE LAMPORT,ROBERT SHOSTAK和MARSHALL PEASE)讨论了这个问题并提出了一些解决scheme
- 由Yoav Shoham 撰写的着名书籍讲述了Multiagent系统以及他们如何解决这个问题。
- 博客文章关于这个问题在TCP。