做完WEB旺旺,一直想写点关于WEB旺旺轮询关于前端消息的通知的处理的介绍,今天整理了一下:
前端处理方法:
1、一般前端的长连接处理方式是:
浏览器开三个页面,即使现在的focus页在C,但是还是建立了3个Comet接,当服务端有消息时间,三份同时从3个Comet写回浏览器,此时展示给用户的提示信息是只需求出现在C页面就可以了,A,B并不是focus页,这个Comet链接实际的数据是无意义的。
优点:
a)、消息失时,速度快。
缺点:
a)、Comet链接数与PV量成正比,量很大。
2、Web旺旺前端的处理方式 :
三个页面只有A是主页面去建一个到WebServer的Comnet链接,服务端的消息更新通知有新消息数据,写到Cookie中。
当任何一个部署了前端JS页面获取focus时写一个时间戳T1到Cookie。Focus页C 800ms检查Cookie是否有新的消息,有新的消息发一个普通的Http请求到消息服务器上取到消息内容。
当C失去Focus时候写入一个时间戳T2到Cookie 中,同时把时间戳写到内存变量T3中,800ms检查新消息的时同时检查Cookie时间T2和内存中T3时间是否相等。
任何获取Focus页的写入时间戳T1在改变了存在Cookie中的时间戳T2,800ms检查时间戳时,两个不相等停止轮询本地Cookie。这样可以保证用户焦点没有在网页上时,最后一个失去focus的页,可以正常收到消息。
如何保存一直都有一个Comet存在,用户关掉Comet页处理,Comet页一直会写一个时间戳到Cookie中,所有部署JS页在一个时间如3S检查这个时间戳是否有更新,有更新说明Comet页存在,没有更新说明Comet不存在。要新建一个Comet到WebServer
优点:
a)、链接数比一个页一个长边接少,和UV成正比。
b)、轮询根据focus页切换,只有一个页面要轮询本地cookie,800ms完全可以接受。
缺点:
a)、本地是轮询Cookie有延时。
b)、只能推送通知,要取2次才能取正真实的消息。
c)、当Comet页关掉的时候,要重新建立时有延时。
4核心的CPU,4内存,32位系统,只测试长连接,30S断开一次:压力测试到4万。
现在淘宝的PV量来计划所有部署WEB旺旺的页面建一个Comet是行不通的,用Cookie本地信息共享,是可以解决这一问题的。