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 的结构方式时,怎么处理这样的问题。

你可能感兴趣的:(数据结构,sql,Web,Ajax,框架)