socket.io下的可靠消息?

时间:2012-03-06 04:59:25

标签: node.js socket.io

API提供发出/发送回调机制来确认收到的消息。但是,如果断开连接或错误,则不会触发此回调。在我看来,在断开连接时,需要经历一些相当混乱的过程来清理未完成的已发送消息(例如 - 假设您可能希望存储消息以便稍后转发的用例等)。关于如何实现这一点的任何简单的想法?想知道我是否遗漏了什么....谢谢。

1 个答案:

答案 0 :(得分:30)

真正的潜在问题

此问题不仅限于socket.io。这是一个众所周知的问题,称为Two Generals' Problem

  

两名军队,每人都由将军领导,准备袭击一座要塞城堡。军队在城市附近安营扎寨,每个都在自己的山上。一个山谷将两座山丘分开,两位将军交流的唯一途径就是派遣信使穿过山谷。不幸的是,山谷被城市的防御者所占据,并且有可能被捕获的任何特定信使将被捕获(这种情况假设两名将军同意他们会攻击,他们还没有达成协议的时间在各自的山丘上占据阵地前进​​行攻击。)

您正试图通过不可靠的链接访问Common Knowledge

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

可以做什么

你需要拥抱这一事实总是有可能。对此有没有简单的解决方案。在Multi-Agent Systems研究等领域,这个问题及其generalization仍在积极研究中。

在特定情况下仍可以做什么

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

我在使用socket.io设计应用程序时所做的是将ID附加到消息,如果发生断开连接并且一方尝试发送已发送的消息,接收方将知道该消息已被接收。

请注意,在实践中,您不需要无处不在

更多关于问题的阅读