Javascript 在多个浏览器窗口中使用sam AJAX的最佳实践?
我正在开发一个网站,有一些实时更新排序。 现在,网站是使用数据集当前ID的javascript变量生成的。 然后在几秒钟的时间间隔内进行AJAX调用,传递当前ID,如果有新的内容,服务器将返回它以及最新的ID,然后在javascript中更新该ID。 很简单,但问题来了 如果用户多次打开同一页面,则每个页面都会执行此AJAX请求,这会产生沉重的服务器负载 现在我想到了以下方法: 网站加载了当前时间戳和当前数据集ID的javascript变量。 我想要的刷新间隔是例如3秒 在网站中,间隔计数器每秒钟计数一次,每当时间戳达到Javascript 在多个浏览器窗口中使用sam AJAX的最佳实践?,javascript,html,ajax,partial-page-refresh,Javascript,Html,Ajax,Partial Page Refresh,我正在开发一个网站,有一些实时更新排序。 现在,网站是使用数据集当前ID的javascript变量生成的。 然后在几秒钟的时间间隔内进行AJAX调用,传递当前ID,如果有新的内容,服务器将返回它以及最新的ID,然后在javascript中更新该ID。 很简单,但问题来了 如果用户多次打开同一页面,则每个页面都会执行此AJAX请求,这会产生沉重的服务器负载 现在我想到了以下方法: 网站加载了当前时间戳和当前数据集ID的javascript变量。 我想要的刷新间隔是例如3秒 在网站中,间隔计数器每秒
(timestmap%3==0)
返回true的状态时,内容就会更新。
链接看起来像
现在,这应该确保每个浏览器窗口调用相同的URL。
然后我可以打开浏览器级缓存
但我真的不喜欢这个解决方案。
我更喜欢在Cookie中添加另一层数据共享。
这应该不是什么大问题,我可以将每个请求存储在一个以时间戳和数据修订命名的cookie中,TTL为10秒左右,然后首先检查它是否存在
但是
页面将同时执行请求。因此,浏览器缓存和cookie的整个逻辑可能不起作用,因为请求是同时发生的,而不是一个接一个地发生的
所以我考虑将当前的连接限制在1个服务器端。但是我至少需要一个额外的vhost,因为我真的不想在整个页面上这样做。
这让我遇到了有关跨站点策略的问题
当然,有一些超级复杂的负载平衡解决方案/服务器端解决方案绑定到请求uri和ip地址之类的东西,但这一切都是极端的过度使用
这一定是一个常见的问题!想想facebook聊天吧。我真的不认为他们在你打开的每一个窗口里都会做所有的请求
有什么想法吗?我真的受不了这个
也许我可以做一些跨窗口Javascript通信?如果它都在同一个域上,应该不会有问题吗
当然,我可以做的一件事是服务器端缓存。这至少避免了DB连接和密集的计算。。。但这仍然是一个我希望避免的请求。您可能希望签出并删除它。
这最好通过服务器推送技术来解决。您可能需要签出并删除。
这最好通过服务器推送技术来解决。第一件事是:无论如何都要进行服务器端缓存,使用或其他任何方式。因此,您可以抵御三台执行请求的机器。但你知道的 坦率地说,我认为您使用cookie的方法是正确的(但请参阅下面更现代的选项)-它们由所有窗口实例共享,易于查询,等等。您的轮询逻辑可能类似于以下内容: 在轮询间隔上:
- 看看内容cookie:它比你拥有的更新鲜吗?如果是这样,使用它,你就完成了
- 看看状态cookie;其他人是否正在进行轮询(例如,cookie已设置且未过时)?如果是,请稍后再来
- 设置状态cookie:我正在(现在)进行主动轮询
- 请求
- 如果新数据比内容cookie的(可能已更新)内容更新,请将内容cookie设置为新数据
- 如果设置状态cookie的人是您,则清除状态cookie
窗口。打开以获取该iframe(因为窗口。如果使用现有窗口的名称,则打开不会打开窗口)
对比赛情况保持警惕。尽管任何给定页面中的JavaScript都是单线程的(除非显式使用),但您不能期望其他窗口中的JavaScript一定是在同一线程上运行的(它在某些浏览器上运行,而在其他浏览器上运行——见鬼,在Chrome上甚至不是同一个进程)。我也不知道在编写cookies时有任何原子性的保证,所以你应该保持警惕
现在,HTML5定义了一些有用的东西,因此,你可能会考虑看看它们是否存在并在返回到Cookie方法之前使用它们,因为它们将在今天的现代浏览器中运行,而不是在你现在可能要处理的旧浏览器中。不过,在支持它的浏览器上,太棒了
作为上述内容的一个方面,这可能也是一个值得研究的选项,但您的客户端几乎肯定必须授予您的应用程序权限,这也是一件相当新鲜的事情。第一件事是:无论如何都要使用或执行服务器端缓存。因此,您可以抵御三台执行请求的机器。但你知道的
坦率地说,我认为您使用cookie的方法是正确的(但请参阅下面更现代的选项)-它们由所有窗口实例共享,易于查询,等等。您的轮询逻辑可能类似于以下内容:
在轮询间隔上:
- 看看内容cookie:它比你拥有的更新鲜吗?如果是这样,使用它,你就完成了
- 看看状态cookie;其他人是否正在进行轮询(例如,cookie已设置且未过时)?如果是,请稍后再来
- 设置