用户在线是很多WEB2.0网站都会遇到的问题,其实是个再也简单不过的问题,但其实也是一个难度最高的程序,现在分析一下网络上常见的在线解决访问,并提出一个终极方案。
方案一:数据库记录
这个是用的最多的一个方案了,动网论坛,DISCUZ等都是,一般的程序员也会这么想这么做,对于小流量网站,我们无可厚非,使用不会出问题了,如果是大流量网站:
试想一下,如果用户每次更新页面都要进行查询,更新最后活动时间,会出现什么问题?你的在线程序比你整个网站的负载都要高,如果这个在线程序甚至不是独立的域名的话,那么就死定了。
temp表的负载会高的惊人,而数据库日志也会以每小时100M的速度增加
方案二:Appliction变量
这个应该也是比较常见的方案了,速度很快,缺点也很明显,只能记录次数,不能记录更详细一点的信息了。
方案三:内存中的DATASET
原发是一个.net程序员,页面还写出了详细的代码,但是,这个程序员可能就不知道有个大量,有个并发的问题,维护在内存中的变量被并发修改就会立刻崩溃,基本上不能用的代码,估计这个程序员的站点的流量每天不超过1000个IP,但是还有很多没有体验过的人在吹捧这个代码如何的好。其实如果你的站点的10分钟在线人数超过20个你就会发现了,这个程序本身就是错误的,不能用,呵呵。
总结:
方案一: 通用,但不能实现负载,数据库压力太大
方案二:性能好,但不能记录详细信息
方案三:能记录详细信息,性能还行,但是根本就不能用
思考:
有没有一种方案能综合三种方案的优点,还不占用系统资源呢,OK,拿出一点独门绝创的东西出来(实际测试,2W在线的情况下P43.0的CPU不超过10%)。
其实还是内存表,内存中维护一个在线列表,为了解决并发的问题我们在每次操作更新的时候仅仅LOCK一下,问题解决。
再问: 那么多的并发内存修改是可以的,但是如何CPU会不会高?列表的遍历会不会浪费时间!OK,我们再来优化一下。
再来:如果我把在线用户分组,每个组分100个用户,然后每个组的序列号记录在HASH表中,HASH表中再保存每组内存ArrayList的数据,那么LOCK的话仅仅需要LOCK这个100个用户了,遍历问题解决掉,在线人数越多,性能越好(CPU可以控制在7%了)。
再问,时这样,在线用户还是请求还是需要通过系统来解决,再高的话怎么办?
OK,咱们来个终极的优化方案:
还是用户分组,100个用户一组,但是WEB server只负责把把列表输出为静态文件,列表每分钟更新一次,客户短用AJAX来请求查询状态。
再问:但是有人就问了,AJAX涉及一个跨域的问题,其实这个问题更简单了。给页面一个domain属性即可看一下CPU,是多少,我想你会笑掉大牙的...我可以负责任的说,普遍的刷新时间是20分钟,你的WEBserver可以调整到 3秒来刷新。
站长网 疯狂代码原发,转载请注明出处