2010-10-15 116 views

回答

4

您可以为页面的每个“新”加载分配一个UUID,并从所有UUID中删除不是最近用户的请求。您需要在每个请求中发回UUID。如果你想获得先进的功能,你可以让页面上的JavaScript检查响应,看看服务器是否说它是一个旧的UUID,并且它应该停止发出请求。

+2

打败我发布相同的基本想法。对你很好。 – jcolebrand 2010-10-15 17:36:55

+1

伟大的思想家都认为。 – Incognito 2010-10-15 18:09:29

3

使用在浏览器中实时生成的GUID注册每个连接。检查GUID和用户名对,查看哪个页面是所有者的最后一页。在网页加载时,声明自己是一个新窗口,并确保您拥有所有权。排序的PageJustLoadedMakeMeOwner(myGuid, username)

然后有那个GUID目标帧定期更新服务器,因为它的页面的所有权。

如果它停止更新服务器,则在服务器中有允许下一页联系以获取该用户名的所有权的规则。

有丢失所有权自页面的页面只能访问一分钟左右一次。

检查给定页面是否为该用户名的所有者的响应速度非常快。就客户所知,几乎没有时间去做。所以AJAX并没有真正限制你。

排序一个AmIOwner(username, myGuid)检查(可能每隔五秒左右检查一次)。如果属实,那么做你想要发生的事情。如果为false,则轮询该页面的所有者是否空置。如果属实,则取得所有权。如果为false,则在xx秒内再次轮询以查看所有者是否空置。

这是否有任何意义?

1

您可以在同一浏览器中为多个实例做些事情,但如果用户有多个浏览器,则无法做任何事情。 (当然,不是那种常见的场景)

如果你仍然想尝试一下,最简单的方法可能是在cookie中保留最后一个请求的时间戳,并且只在某个阈值时发出新的请求。在多重实例安定下来之前,您仍然可能会进行小规模的比赛,但是如果您对投票使用模糊时间段,那么实例应该很快稳定到一个稳定状态,其中一个实例进行呼叫,其他实例将重新使用来自上次呼叫。

该方法的主要优点是可以通过任何实例进行请求,因此您不必担心协商一个“主要”实例,该实例会进行调用并计算后备算法,如果用户关闭“主要”一个。主要缺点是由于它是基于模糊计时的算法,因此它不能完全消除竞争条件,偶尔会有两个实例发出请求。你必须微调时间,以尽量减少这种情况,但你不能完全防止它。

相关问题