我正在开发一个具有某种实时更新的网站。 现在,使用数据集的当前ID的javascript变量生成网站。 然后在一些seconsd的间隔中,传递AJAX调用传递当前ID,如果有新的东西,服务器将其与最新的ID一起返回,然后在javascript中更新。 非常简单,但问题出现了。
如果用户多次打开同一页面,则每个页面都会执行此AJAX请求,从而产生大量服务器负载。
现在我想到了以下方法:
网站加载了当前时间戳的javascript变量和当前数据集的ID。 我想要的刷新间隔例如是3秒。
在网站中,间隔计数器每秒计数一次,每当时间戳到达(timestmap % 3===0)
返回true的状态时,内容就会更新。
该链接看起来像http://www.example.com/refresh.php?my-revision=123×tamp=123456
现在,这应确保每个浏览器窗口都调用相同的URL。 然后我可以打开浏览器级别的缓存。
但我真的不喜欢这个解决方案。 我更希望在Cookie中添加另一层数据共享。 这应该不是什么大问题,我可以将每个请求存储在由时间戳和数据修订命名的cookie中,TTL为10秒左右,并首先检查它的出口。
BUT
页面将同时执行请求。所以浏览器缓存和cookie的整个逻辑可能不起作用,因为请求同时发生而不是一个接一个地发生。
所以我考虑将当前连接限制为1个服务器端。但后来我至少需要一个额外的虚拟主机,因为我真的不想在整个页面上这样做。 这让我遇到有关跨站点策略的问题!
当然有一些超级复杂的负载平衡解决方案/服务器端解决方案必然要求uri和ip地址或其他东西,但这些都是极端的过度杀伤!
这一定是个常见问题!想想facebook聊天。我真的不认为他们在你打开的每个窗口都做了所有请求......
有什么想法吗?我真的很困惑这个!
Maby我可以做一些窗口间的Javascript通信吗?如果它全部在同一个域上,那不应该是一个问题吗?
我能做的事情当然是服务器端缓存。这至少避免了数据库连接和密集计算...但它仍然是我想避免的请求。
答案 0 :(得分:2)
答案 1 :(得分:1)
首先是:无论如何,使用Memcache或Redis或其他任何方式进行服务器端缓存。因此,您要对三台执行请求的计算机进行辩护。但你知道的。
我认为你使用cookie是正确的,坦率地说(但请参阅下面的更现代的选项) - 它们由所有窗口实例共享,易于查询等。您的轮询逻辑可能如下所示:< / p>
在轮询间隔:
回复:
基本上,状态cookie充当信号量,向所有窗口实例指示某人正在某处更新内容。
您的内容Cookie可能直接包含内容,或者如果您的内容很大并且您担心遇到限制,您可以让每个页面都有一个隐藏的iframe,每个iframe都有一个唯一的名称,并拥有您的Ajax update将输出写入iframe。内容Cookie会发布最新iframe的名称,其他窗口会看到有新鲜内容可以使用window.open
来获取该iframe(因为window.open
没有打开窗口如果你使用现有名称。)
警惕竞争条件。虽然任何给定页面中的JavaScript都是单线程的(除非明确使用web workers),否则您不能指望其他窗口中的JavaScript必须在同一个线程上运行(它在某些浏览器上,而不是在其他人 - 哎呀,在Chrome上,它甚至不是同一个进程)。我也不知道写饼干有任何原子性保证,所以你要保持警惕。
现在,HTML5定义了一些有用的inter-document communication mechanisms,因此您可能会考虑查看这些是否存在并使用它们然后再回到此Cookie方法,因为它们现在可以在现代浏览器中使用,但不能在旧版本中使用您可能需要立即处理的浏览器。不过,在支持它的浏览器上,太棒了!
Web storage也可能是一个值得调查的选项作为上述方面,但您的客户几乎肯定必须给您的应用程序权限,这也是一个相当新的事情。