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

时间:2010-04-25 14:37:28

标签: javascript xmpp bosh

我们最近在我们的旗舰产品上进行了私人测试,并举行了一次小型发布活动。不幸的是,场地有一个可怕的无线连接,数据包被丢弃在左右中心造成了对系统的破坏,基本上它根本无法工作!幸运的是,我们能够切换到不同的网络并拯救演示。这突出了一些我知道已经是一个问题的东西但是并没有意识到它可能存在多大的问题。我们的系统在很大程度上依赖于BOSH,并且具有相当大的JavaScript代码库,现在在良好的网络条件下运行良好。但是,我们需要在恶劣的网络条件下使其运行良好。

由于XMPP的工作方式,一个火灾和忘记系统,不容易判断您发送或应该接收的消息是否实际发送或接收。例如,我们有一个报价系统,一个用户将通过BOSH向另一个发送报价。当服务器接收到该消息时,消息被发布到提供用户offer_sent PEP节点以及与接收用户offer_received PEP节点类似的消息。虽然发送用户能够判断他们的优惠是否(相对)轻松发送,但如果从未收到通知给接收用户,则用户永远不会知道该消息错过了消息。

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

  1. StropheJS
  2. 用于处理低级别任务并构建在
  3. 之上的MVC框架
  4. 包含应用程序逻辑路由,控制器模型等的应用程序层以及模型数据的浏览器缓存
  5. 接收事件并在应用程序层之间发布事件的UI层
  6. 解决丢失消息问题的一种方法是定期检查PEP节点以查找浏览器不知道的新数据。如果发现新消息,则浏览器缓存将失效,并且将从服务器请求所有新数据。我不确定这是最好的方法,也不能涵盖所有情况。我们当然不希望进入我们发送消息以确认在其目的地收到上一条消息的情况,因为这会使网络流量加倍。

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

    1. 在连接不良时,由于数据包被丢弃,不会发送或接收消息
    2. 涉及在页面之间导航时,浏览器会收到一条消息,但在卸载页面之前,该消息未完全处理并存储在本地缓存中。或者在发送队列中添加了一条消息,但在卸载页面之前从未发送过消息
    3. 我怀疑最难解决的问题是2号。对此主题的任何想法都会非常感激。

2 个答案:

答案 0 :(得分:1)

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

BOSH会话仅在给定时间内保持有效(默认情况下,在大多数实现中为60秒)。会话到期后,假c2s连接将关闭,用户必须再次登录。

会话有效时,不应丢失任何消息或无序到达。丢失的唯一可能是在允许HTTP重新打开连接的第60个窗口期间,并且如上所述,如果该窗口关闭则必须创建新会话。如果在该窗口内发出新的HTTP请求,那么任何内容都不会丢失或无序到达。

我建议,既然您正在使用PEP作为商店,那么每当创建会话时,您在客户端都有一个钩子,您从PEP节点获取项目以初始化您的客户端缓存(请参阅section 6.5 of XEP-0060 )。

如果BOSH客户端成功收到邮件,但在成功处理网页之前关闭或重新加载邮件仍然会丢失邮件。但是,对于其他条件,您不应再看到任何数据丢失,仅在启动期间因项目检索而产生额外延迟。

答案 1 :(得分:1)

你应该使用请求&回复致谢解决这个问题:http://xmpp.org/extensions/xep-0124.html#acks strophe.js作者提到他将来会在这段时间内加入支持。