游戏后台一个功能没有想到好办法,所有问问大家

2019-02-23 15:42:19 +08:00
 flyzero

功能是这样的: 游戏里面有 pvp 功能,每天 22 点都会根据 pvp 积分进行结算然后发放奖励

现在的做法是: 专门开一个服务,定点统计所有玩家 pvp 积分排名,然后奖励

但是考虑到如果用户量特别大的话,耗时严重,结算也不太准确( 22 点的时候有玩家玩 pvp 更新了积分,但还没统计到他)

想了半天也没有想到更加合理的办法,所以问问 v 友们

1883 次点击
所在节点    问与答
16 条回复
woscaizi
2019-02-23 16:02:37 +08:00
给积分加个更新时间字段,到时直接选取时间范围内按照积分 order by desc 的结果?
xiaotuzi
2019-02-23 16:03:49 +08:00
(曾维护过 xxx 平台复利计息系统,他们机器每天 23 点更新分红,几乎每天都炸(˶‾᷄⁻̫‾᷅˵))
PHP 的程序,PHP 在特别庞大复杂计算的时候会很慢,跟你的问题差不多吧。
解决方案如下:(简单-复杂)
(处理过的数据一定要加更新时间,防止重复操作)
1,如果计算的数据结果可以延迟一两小时到客户账户,且不会造成其他影响,那么就发布公告:xx 数据更新时间是 22:00-23:00 之间。那么这段时间就慢慢处理数据吧,反正结果不会影响客户操作。
2,多线程数据库分割处理。10w 数据,分为 5w+5w,两个线程处理,或者更多划分,以达到最快速度处理完(服务器要求要高)。(加服务器,分布式处理更复杂一点,需要数据再集中一次,看你如何操作了)
3,整体系统积分设计上调整。每个用户每个操作有积分获取或者扣除的,能立刻得出结果,不必要统一批处理。(目测基本不可能这么玩)

仅供参考。
song0071000
2019-02-23 16:09:48 +08:00
减少要排序的数据量
一定要给所有的玩家做排序?过滤部分 pvp 积分很小玩家
wake156
2019-02-23 16:13:12 +08:00
用户 id 和对应积分放到缓存里,然后 22:00 点开始结束计分,开始排序结算,22:15 或者 22:30 发放奖励
这样行不?
wake156
2019-02-23 16:22:04 +08:00
用户数量级别不可能是天文数字,不太可能导致排序慢
chinvo
2019-02-23 16:23:11 +08:00
比较同意 @xiaotuzi #2,尤其是第三条,可以在每个得分点就进行积分操作,积分分为积分日志和按天归档日志,在按天归档日志里,每条记录都是一个用户从昨天 22:00 到今天 22:00 的 pvp 积分和(每次增加积分日志的时候就给按天归档日志做一个庚新),22 点的时候跑后台进程做排序甚至直接用数据库的查询语句排序就完了
ymj123
2019-02-23 16:27:35 +08:00
你游戏上线了吗?别到时候玩家都没几个,根本没这个烦恼。😂
zhy0216
2019-02-23 16:31:53 +08:00
如果只关心比如说前一千名的玩家 可以开个 1000 的数组 每次拿比如 5 万数据遍历 然后更新那个数组
应该比直接排序快
pkokp8
2019-02-23 16:34:40 +08:00
产生积分的时候就计算规定时间的总合,分散计算的强度
justbuy
2019-02-23 16:42:55 +08:00
10:30 发奖励
flyzero
2019-02-23 16:50:54 +08:00
好像只能需要一个时间段来处理了
misaka19000
2019-02-23 16:54:50 +08:00
用 spark 来算
JamesR
2019-02-23 17:06:56 +08:00
搞笑,有多少玩家啊,千万级别万家有吗?
千万级别玩家在普通数据库里照样 2-3 秒完成计算。
zzj0311
2019-02-23 17:12:39 +08:00
又不需要实时发奖,慢慢算呗
Amit
2019-02-23 17:13:34 +08:00
1、从业务方面加限制,特定任务限制时间段
2、使用流计算,就是有点太重了
一般游戏里面排名都不是实时的,会等到第二天或下周更新排名
changnet
2019-02-23 17:29:26 +08:00
1. 这个功能为啥不是游戏服务器做而是游戏后台做
2. 就个积分排序,几万人直接内存中排就完了
3.人实在是太多,有几百万上亿,分段排即可,又不需要实时发奖励

我很好奇用户量特别大是有多大,耗时严重有多严重?

因为我见过的游戏服务器数据都是常驻内存,全服几万人排序都是毫秒级别的,排个奖励都是直接排的,没特殊处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/537950

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX