例如多伺服器用户登录,我要实时知道在线用户人数(应该是个分散式的问题吧)。用什么方法来实现高并发

1.是用一个主伺服器来维护这个全局变数2.还是每次有用户登录,就要伺服器之间相互通信来统计总人数

不知道目前主流的方法都这么实现这个功能的?


这种情况一般不需要完全的准确性和实时性,设计过程中一般每个伺服器非同步上报,应用再通过轮询获取一个相对结果就行了。曾经的一个做法是,每个伺服器在zookeeper 上的对应节点每60s写入当前的数据,然后服务查询所有节点数据再加和。

在线人数不是一个需要实时和绝对准确的业务。

同步的方法比较贵,而且本来分散式的服务可以提供故障转移的特性,同步数据又变成单点了。

仅仅是在线用户数,可以:

1 每个伺服器提供一个API能查询本地的数值,显示的时候轮询一次加起来。2 做一个独立的计数服务,每台伺服器定时去刷新自己的数字。还有一个费力容易出错的方案,计数其实速度非常快,比如Memcached就有原子操作+1/-1。可以在上线下线的时候改这个全局数字。这个方法费力是因为除了上线下线,还有很多伺服器故障状态要处理。

容易出错是因为一旦出错就没有机会修复。


其实非常简单:

1.如果需要统计精准的数据,那么就必须牺牲性能:

事务开始
锁住第1台伺服器的用户表
锁住第2台伺服器的用户表
.....

获取第1台伺服器的在线用户数量
获取第2台伺服器的在线用户数量
....
事务结束
把以上在线用户数量,进行累加,返回结果

2.如果需要保持高性能,那么就必须牺牲统计的精准度:

获取第1台伺服器的在线用户数量
获取第2台伺服器的在线用户数量
....
把以上在线用户数量,进行累加,返回结果

以上只是针对普通人进行解释的方案。我自己则更喜欢这样的结构:


之前不是日报有个文章写游戏伺服器的变迁么,他提到现在主流是星形结构,也就是说所有的slave都跟master交互,master来维护这个统计变数,这样看起来就简单的很阿。无论用资料库,还是用code写个socket,都相当容易完成了。

=================你要做成push,不要做成pull,这样就不会有同步的问题了。这也是对一些其他答案的看法。
每个伺服器独立统计,然后上报汇总;这样知道了每个伺服器的量级,也可以知道总的量级。
推荐阅读:
相关文章