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

Posted

技术标签:

【中文标题】socket.io 下的可靠消息传递?【英文标题】:Reliable messaging under socket.io? 【发布时间】:2012-03-23 14:28:11 【问题描述】:

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

【问题讨论】:

你能找到更多关于这个的信息吗,也许是一个解决方案? @Mark 如果您可以参考我的回答,无论它对您有帮助还是其他任何东西 - 那太好了。 @BenjaminGruenbaum - 在 socket.io 出现许多问题后,我决定“少即是多”并选择了 engine.io(sock.js 也是一个很好的候选者),基本上所有事情都使用显式消息传递,不依赖任何基础设施功能。这样就容易多了。 【参考方案1】:

真正的根本问题

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

由将军率领的两支军队正准备进攻一座坚固的城市。军队驻扎在城市附近,每个人都在自己的山上。两座山丘之间有一条山谷,两位将军的交流方式只有派使者穿过山谷。不幸的是,山谷被城市的守军占领了,任何通过山谷派出的信使都有可能被俘虏(这种情况假设两位将军已经同意他们将进攻,但他们还没有商定进攻的时间)在各自的山上占领阵地之前发动攻击)。

您正试图通过不可靠的链接联系Common Knowledge。

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

可以做什么

您需要接受这样一个事实,这始终是可能的。对此没有简单的解决方案。这个问题及其generalization 在多智能体系统研究等领域仍在积极研究。

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

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

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

请注意,实际上您不需要在任何地方都这样做。

更多阅读问题

Related question here in SO The Byzantine Generals Problem 由 Microsoft Research(LESLIE LAMPORT、ROBERT SHOSTAK 和 MARSHALL PEASE)讨论该问题并提出了一些解决方案 Acclaimed Book 由 Yoav Shoham 撰写,讨论多代理系统以及它们如何解决此问题。 Blog post 关于 TCP 中的这个问题。

【讨论】:

是的 - 现在我实际上知道并理解我在这里谈论的所有事情,这个答案并没有太大帮助。您只需使用一个 ID 并跟踪两端相关的最后一件事,然后同步 - 链接是可靠的,无论如何都不会发生拜占庭错误。

以上是关于socket.io 下的可靠消息传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的音频在 socket.io 中播放?

FCM 不可靠的消息传递,有一些消息传递延迟 [重复]

基于CORBA的可靠消息传递技术

Android 应用上游消息传递是不是可靠?

消息中间件-----RabbitMq消息可靠传递

FCM 上游消息传递的可靠性如何?