【发布时间】:2010-04-25 14:37:27
【问题描述】:
我们最近对我们的旗舰产品进行了私人测试,并举办了一场小型发布会。不幸的是,场地的无线连接很糟糕,数据包被左右和中心丢弃,在没有系统的情况下造成了严重破坏,基本上它根本无法工作!幸运的是,我们能够切换到不同的网络并拯救演示。这突出了我知道已经是一个问题但没有意识到它可能是一个多大的问题。我们的系统严重依赖 BOSH,并且有一个相当大的 JavaScript 代码库,现在在良好的网络条件下运行良好。但是我们需要让它在糟糕的网络条件下也能正常工作。
由于 XMPP 的工作方式是一种即发即弃的系统,因此很难判断您发送或应该接收的消息是否实际发送或接收。例如,我们有一个报价系统,一个用户将通过 BOSH 向另一个用户发送报价。当服务器接收到此消息时,将向提供用户 offer_sent PEP 节点发布一条消息,并向接收用户 offer_received PEP 节点发布一条类似消息。虽然发送用户能够(相对)轻松地判断他们的报价是否已发送(相对),但如果从未收到发送给接收用户的通知,该用户将永远不会知道它错过了一条消息。
关于 JavaScript 设置的一点点,它有 4 个主要层:
- StropheJS
- 一个用于处理低级任务并在其之上构建的 MVC 框架
- 一个应用层,包含应用逻辑路由、控制器模型等以及模型数据的浏览器缓存
- 一个 UI 层,用于接收事件并将事件发布到应用层和从应用层发布事件
解决丢失消息问题的一种方法是定期检查 PEP 节点以获取浏览器不知道的新数据。如果发现新消息,则浏览器缓存将失效,并且将从服务器请求所有新数据。我不确定这是最好的方法,也不能涵盖所有情况。我们当然不希望陷入我们发送消息以确认在其目的地收到前一条消息的情况,因为这会使网络流量增加一倍。
随着实时网站的数量每天都在增长,这是其他开发人员肯定遇到过的问题,看看其他人如何解决这个问题会很有趣。据我所知,消息丢失有两种情况:
- 在连接不佳时,由于数据包被丢弃而无法发送或接收消息
- 涉及页面之间的导航,浏览器接收到一条消息,但在卸载页面之前未完全处理并存储在本地缓存中。或者一条消息被添加到发送队列中,但在页面卸载之前从未发送过
我怀疑最难解决的问题将是第二个问题。对此主题的任何想法将不胜感激。
【问题讨论】:
标签: javascript xmpp