`
totobacoo
  • 浏览: 16621 次
  • 来自: K星座
文章分类
社区版块
存档分类
最新评论

SNA 架构下的在线人数统计

阅读更多

  一个 Web 系统,通常都有在线人数统计的需求。 按照常规思路应该是首先声明 HttpSessionListener
 
  然后分别在 sessionCreated、sessionDestroyed 回调方法里面做在线人数的加减法。 有过类似经历

  的同学想必都知道,sessionCreated 回调的触发,并不是通常以为的用户客户端首次连接后发生的,而

  是在首次真正的 session 存取操作时才真正被触发,比如:

   HttpSession session = request.getSession();

首次 session 存取操作时,才真正创建 session 实例,从而触发 sessionCreated 的监听回调。


我现在的系统,学习了 SNA 的做法,完全抛弃了 session 的概念。 客户端只通过 cookie 记录用户Id

之类的标识信息,用户登录后,服务端通过 cookie userId 再向 cache module 拿取用户的详细信息。

这样做的目的跟 SNA 的设计目标一致,是为了以后的水平扩展。


现在面临的问题是,为了统计在线人数,我不得不在某一个全局缺省的 interceptor 里面读取 session,

以触发 session 实例的创建,从而触发 sessionCreated 的监听回调。 本来系统已经实现了 SNA,完全

不再需要 session了, 现在又不得不为此创建一堆无用的 session 实例。 就算现在暂时容忍了这一点,

以后做节点水平扩展的时候,还得面临节点间的在线人数广播通知的问题。。。


用 cookie 来解决这个问题,也不是非常的方便。 因为匿名连接,是要计入在线的。 但是初次访问的用户,

并没有 userId 之类的 cookie 信息,服务端为了区分不同的匿名个体,还需要给客户端 cookie 回写一

些唯一匿名标识。 总之是很繁琐。


不知道大家在处理类似 SNA 的结构方式时,怎么处理这样的问题。
分享到:
评论
4 楼 雁行 2008-03-21  
我们做的一个WEB系统,也有实时统计在线人数和具体人员的要求。
我们采用主框架页AJAX方式定期更新用户在线标记字段和在线时间(更新周期1分钟)。
然后再AJAX方式根据在线标记字段取数据库数据。

带来的问题有两个:
1、读取数据库频率很高,导致大量并行查询SQL
2、判断用户是否离线是通过后台一个调度服务来比对用户最新在线时间是否小于当前时间一个更新周期,需要严格统一几个地方的刷新周期,否则会出现数据不准情况。

不知还有更好的方式没有?
3 楼 totobacoo 2007-12-05  
在线统计的计数自然是放到缓存里的。

我关心的问题是,怎样才能不依赖于 sessionListener。 依赖于 session 不仅仅会多出一大堆的session对象开销,而且,在同一用户被 balancer 丢到不同的节点上后,会创建多个节点上的 session,被重复计数。

目前我的实现是通过 cookie 来做的,每次请求都查看 cookie userId 以维护在线统计,不幸的是,同样面临多个节点间的重复计数问题。

看来是必须得有一个广播通知机制来做查重和同步。
2 楼 hocus 2007-12-05  
dingyuan 写道
既然都sna了。。在线统计的计数也放到缓存或者给数据库用户表加一个字段,标示用户是否在线。。


在线统计的计数也放到缓存

表存储就算了,考虑数据量啊,另外当多个db还要数据同步,自找麻烦
1 楼 dingyuan 2007-12-05  
既然都sna了。。在线统计的计数也放到缓存或者给数据库用户表加一个字段,标示用户是否在线。。

相关推荐

Global site tag (gtag.js) - Google Analytics