SNA 架构下的在线人数统计

本文探讨了一个Web系统中在线人数统计的实现难题。特别是在采用类似SNA的无session设计时,如何有效统计在线人数,包括匿名连接的情况。文章还讨论了使用cookie作为替代方案的复杂性和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个 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 的结构方式时,怎么处理这样的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值