Go游戏服务器开发的一些思考(三十):排行榜服务器设计思路
2018-02-11 14:12
881 查看
排行方式
通常有2类排行:全服所有人排名
前N名排名
考虑到大量用户的情况下,实时全服排名难度很大,一般可以做成离线排名的方式。
这里考察的是大量用户的情况下,前N名的实时排名方法。
背景假设
这里假设,有500万玩家同时在线那么极端情况下,每秒500万玩家可能同时改变战力值
初步设计
启动时,加载最新前N名排名数据。
变化的战力输入到排序服务,通过排序器,更新排名。并最终保存到数据库。
排名服务内置 战力数据缓冲器。每秒500万次排序,不一定能够完成。因此需要做缓冲。且缓冲规模最大在500w数据。
大多数情况下的战力变化,实际上只做了一次比较。这点很重要。
以上基本可以做到接近实时的排名。
但是,还存在问题。一般的服务器网络模块每秒接收数据次数在10万级别。
因此上述单个排名服务是无法胜任上述背景假设的。
再次设计
由于要开多台排名服务器,因此把排行数据独立出来,可以简化数据同步逻辑
变化的战力,可以根据当前的台数,散列到某台上
数据库一般处理能力也在10万次级别。这样可以通过 战力数据缓冲器,来缓冲 500万次每秒的 压力。
而实时性,则由于数据库的处理瓶颈,会被最大延迟1分钟内的更新。
以上设计还有缺点:
如果某台排名服务器挂掉了,那么部分待排名战力数据会被丢失
排名服务器扩容或缩减时,变化的战力 一致性散列问题
排名服务N1 与 排名服务N2 同时获取战力,并都在做前N名内排序时,可能出现对旧数据排序。造成错误排序。
如何达成最优设计,待下文
相关文章推荐
- Go游戏服务器开发的一些思考(三十一):排行榜服务器设计思路(二)
- Go游戏服务器开发的一些思考(三十七):无缝世界场景构建与同步(四)
- Go游戏服务器开发的一些思考(二十八):登录流程(一)
- Go游戏服务器开发的一些思考(二十二):Godep包管理介绍
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(十二):行为树behavior3go介绍
- Go游戏服务器开发的一些思考(十三):behavior3go的一些坑(备忘)
- Go游戏服务器开发的一些思考(十六):IO游戏服务器架构
- Go游戏服务器开发的一些思考(三十九):go reflect的正确使用方法
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)
- Go游戏服务器开发的一些思考(十七):IO游戏同步(三)
- Go游戏服务器开发的一些思考(三十五):无缝世界场景构建与同步(二)
- Go游戏服务器开发的一些思考(二十五):Redis的Docker Swarm部署
- Go游戏服务器开发的一些思考(五):goroutine看似美好的陷阱
- Go游戏服务器开发的一些思考(二十七):Go Redis ORM库(二)
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- Go游戏服务器开发的一些思考(二十四):命令行库封装技巧
- Go游戏服务器开发的一些思考(三十二):关于无缝世界的一些思考
- Go游戏服务器开发的一些思考(八):Docker桥接网络及固定IP
- Go游戏服务器开发的一些思考(三十四):无缝世界场景构建与同步(一)