您的位置:首页 > 编程语言 > Go语言

Go游戏服务器开发的一些思考(三十):排行榜服务器设计思路

2018-02-11 14:12 881 查看

排行方式

通常有2类排行:

全服所有人排名

前N名排名

考虑到大量用户的情况下,实时全服排名难度很大,一般可以做成离线排名的方式。

这里考察的是大量用户的情况下,前N名的实时排名方法。

背景假设

这里假设,有500万玩家同时在线

那么极端情况下,每秒500万玩家可能同时改变战力值

初步设计



启动时,加载最新前N名排名数据。

变化的战力输入到排序服务,通过排序器,更新排名。并最终保存到数据库。

排名服务内置 战力数据缓冲器。每秒500万次排序,不一定能够完成。因此需要做缓冲。且缓冲规模最大在500w数据。

大多数情况下的战力变化,实际上只做了一次比较。这点很重要。

以上基本可以做到接近实时的排名。

但是,还存在问题。一般的服务器网络模块每秒接收数据次数在10万级别。

因此上述单个排名服务是无法胜任上述背景假设的。

再次设计



由于要开多台排名服务器,因此把排行数据独立出来,可以简化数据同步逻辑

变化的战力,可以根据当前的台数,散列到某台上

数据库一般处理能力也在10万次级别。这样可以通过 战力数据缓冲器,来缓冲 500万次每秒的 压力。

而实时性,则由于数据库的处理瓶颈,会被最大延迟1分钟内的更新。

以上设计还有缺点:

如果某台排名服务器挂掉了,那么部分待排名战力数据会被丢失

排名服务器扩容或缩减时,变化的战力 一致性散列问题

排名服务N1 与 排名服务N2 同时获取战力,并都在做前N名内排序时,可能出现对旧数据排序。造成错误排序。

如何达成最优设计,待下文
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐