javascript - 使用 BOSH 时处理 JavaScript 中丢失的消息

标签 javascript xmpp

我们最近对我们的旗舰产品进行了私有(private)测试,并举办了一场小型发布会。不幸的是, field 的无线连接很糟糕,数据包从左到右和中心丢失,导致系统严重损坏,基本上它根本无法工作!幸运的是,我们能够切换到不同的网络并挽救演示。这突出了一些我知道已经是一个问题但没有意识到它可能是一个多大问题的东西。我们的系统严重依赖 BOSH,并且拥有相当大的 JavaScript 代码库,现在在良好的网络条件下运行良好。然而,我们也需要让它在糟糕的网络条件下也能正常工作。

由于 XMPP 的工作方式,一个即发即弃的系统,很难判断您发送或应该接收的消息是否实际发送或接收。例如,我们有一个报价系统,一个用户将通过 BOSH 向另一个用户发送报价。当服务器接收到此消息时,一条消息将发布到提供用户 offers_sent PEP 节点,并将类似消息发布到接收用户 offers_received PEP 节点。虽然发送用户能够判断他们的报价是否(相对)容易地发送,但如果从未收到给接收用户的通知,则该用户永远不会知道它错过了一条消息。

关于 JavaScript 设置的一些信息,它有 4 个主要层:

  1. StropheJS
  2. 用于处理低级任务并构建于其之上的 MVC 框架
  3. 包含应用程序逻辑路由、 Controller 模型等的应用层以及模型数据的浏览器缓存
  4. UI 层接收事件并向应用层发布事件

解决丢失消息问题的一种方法是定期检查 PEP 节点以获取浏览器不知道的新数据。如果发现新消息,浏览器缓存将失效,并且将从服务器请求所有新数据。我不确定这是最好的方法,它也不能涵盖所有情况。我们当然不希望陷入我们发送消息以确认之前的消息已在其目的地收到的情况,因为这会使网络流量加倍。

随着实时网站的数量每天都在增长,这是其他开发人员一定遇到过的问题,看看其他人如何解决它会很有趣。据我所知,消息丢失有两种情况:

  1. 在连接不良时,由于数据包丢失而无法发送或接收消息
  2. 涉及在页面之间导航,浏览器收到一条消息,但在页面卸载之前未完全处理并存储在本地缓存中。或者消息被添加到发送队列,但在页面被卸载之前从未发送过

我怀疑最难解决的问题是第 2 个问题。如果对这个问题有任何想法,我们将不胜感激。

最佳答案

对此没有好的解决方案,但是有一个可行的解决方案。

BOSH session 仅在给定时间内保持有效(在大多数实现中默认为 60 秒)。一旦 session 过期,伪造的 c2s 连接就会关闭,用户必须重新登录。

当 session 有效时,不应丢失任何消息或乱序到达。唯一可能丢失的是在允许 HTTP 重新打开连接的六十秒窗口期间,并且如前所述,如果该窗口关闭,则必须创建一个新 session 。如果在该窗口内发出新的 HTTP 请求,则不会丢失任何内容或乱序到达。

我建议,因为您使用 PEP 作为您的商店,所以无论何时创建 session ,您在客户端中都有一个 Hook ,您从 PEP 节点获取项目以初始化您的客户端缓存(参见 section 6.5 of XEP-0060 )。

如果您的 BOSH 客户端成功接收到消息,但网页在成功处理之前关闭或重新加载,消息仍然可能丢失。但是,对于其他情况,您应该不会再看到任何数据丢失,只是在启动期间由于项目检索而出现额外延迟。

关于javascript - 使用 BOSH 时处理 JavaScript 中丢失的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708564/

相关文章:

javascript - jquery 文件树高亮选中

javascript - .click 不适用于图形中的 anchor

安全层字节精度?

ios - 如何在 objective-c 中通过ios中的XMPPFramework连接XMPP服务器

ios - XMPPFramework - 如何创建群聊室?

安卓/XMPP : Unable to reconnect to Server after Connection Type Changes

javascript - 在下拉列表中显示数组

javascript - 复选框 document.getElementById 获取 null

javascript - Framework 7如何使用垂直对话框按钮并将id和class分配给按钮

android - 无法使用 smack-android :4. 1.4 接收群聊消息