Ajax Comet 聊天中的掉线判断

ajax comet连接如果成功返回或超时,应该立刻建立新的长连接。

但如果遇到特殊情况,如停电等,长连是无法连回去的。这个情况等于是掉线(可以用结束浏览器进程模拟)

异步超时,是throw了一个TimeoutException类型的错误。我们可以通过捕获这个错误来判断掉线

大体思路如下

1、长连接建立时,记录连接进来的时间

2、超时时(即错误被捕获时),记录超时的时间

3、超时后,等几秒(如5秒),获取长连接进来的时间和超时的时间进行比较,如果连接时间<超时时间,则认为是掉线。理想情况下,因为是超时后等5秒才去判断,所以判断中取到的连接时间是重新建立的长连接的时间,必然比超时时间晚

但是在负载均衡环境中经常出问题。

单独在某一台服务器上都很正常,但是一到场环境就某明奇妙的出现掉线。

其原因在于 几台服务器之间时间不一致(百思不得其解 灵光一闪想到可能是这方面的原因)。

比如有A,B两台机器,B上的时间比A上的时间慢5秒

长连接第一次进入,负载到A,记录进入时间为0:0:1秒,30秒后超时,记录超时时间为0:0:31秒

此时长连接重新连回,负载到B上,比如这个时候是0:0:32秒,但是B的时间比A的时间慢5秒,记录的连回时间为0:0:27秒,比超时时间小,所以被认为是掉线。

解决方法:

1、在比较时给连回时间加几秒;或者做个减法,看他们值是否大于某一个范围;等等方式 使他有个缓冲。

2、给几台服务器设置时间一致,可以使用同一个时间服务器来保证他们的时间是一致的。

原文地址:https://www.cnblogs.com/czcz1024/p/2685128.html