前言:
MMOARPG 跨服是很有必要的,
1:某些服玩家稀少做任务找不到人
2:增加服与服之间的竞争
3:增加玩家的交流
4:等等 最主要是减少玩家流失,增加消费
1:跨服的实现
1>跨服,进入拉数据过去(不拉回来),打完,给奖励,简单好实现
2>跨服,进入拉数据过去(可以带部分消耗过去,剩余会拉回来),打完,给奖励, 梦幻西游好像是这样的
3> 跨服,进入拉数据过去,打完再拉回,
4>同时连跨服与本服,去跨服后,战斗相关的 跨服处理,其他的如工会什么的 还在本服处理,相当于 数据库的2主模式,
需要同步,但是又跟数据双主(写)不一样,没有事务回滚机制,还有就是有时间限制,
eg: 在本服 充值元宝,现在跳到跨服,在跨服 使用元宝复活,本服充值的元宝也到账了,类试与 银行账户,同时有支出与收入,这是一定要加锁的,但是场景服,操作都是串行的,而且必须快速处理,不然全场景都会卡。
解决方案> 参考 https://www.sohu.com/a/130991258_483399
1> 如果是不转移
这里有个问题,在场景服吃个血药,有人对己 砍过来,这是个串行操作,
【1】如果背包物品没带过来,回本服请求(同步),一般行体验不太好,如果这样的操作多点,体验就太差了
如果是异步,药没吃上,被人砍死了(异步只要不是返回太慢,一般情况下,玩家会以为自己吃慢了,或网速差了一点,别人先发起的砍的操作)
【2】如果是在userserver先把药吃了(玩家状态也同步到userserver) 加血,再在screensrv同步血量呢,但是这个中间过程 别人给你一个无法使用物品的DEBUFF,那么screensrv里是加还是不加呢
2> 自己设想的解决方式
1 与2 不能同时存在,(玩家只能在一个场景里)
说明(如果可以忍受异步,这里可以跳过)
场景里需要用到的全带过去,包含(背包–带不带过去取决于里面有没有道具在场景里需要串行操作的而且不能忍受去同步时间?),但是更新不在场景里操作
1> 场景 不更新玩家数据,玩家数据之能由 userserver 做更新,场景服也可以操作DB(城战结果==),跨服场景的也如此
2>本服 处理方式与跨服处理方式 一样,在本服 还是跨服 没区别,数据都通过userserver 做转发(这里可能会浪费一点时间),
3>物品处理以场景为主,在非场景得到物品,先临时保存,再发场景中,场景更新后再返回非场景更新,这里也可以增加一个userserver请求同步的消息索引,如果场景不返回,可以重试,重要东西一定要先写日志啊
这里涉及到以个物品ID的产生,所以可以增加ID Generator 服,不管本地还是跨服,需要ID 都从 ID Generator 服 获取,
为了效率,可以一次多要点,100个,10000都行,具体参数需要根据实际情况调整,还由一些不重要的物品,产生,销毁,
可以回收ID,重复利用,场景服可以从ID Generator 服得到ID 存在本地的 redis里(持久化,重启后下次继续用)
?为什么以场景为主,因为场景里一般是串行操作,实时行要求高,产出与消耗也高,
4> 场景 同步到 userserver的数据,可以增加 同步消息索引,如果userserver 断开,再链接,对比消息索引,类试与数据库的binlog,没同步的继续同步,存数据时,也要带上这个消息索引,同步后需要回复一个确认的消息索引
[1]:如userserver 挂了,重起来后,拉回玩家数据,根据存储的消息索引 ,跟场景同步过来的索引的,确认更新
如果某些 不需要screensrv处理的,加个好友等等,哪回复只能要日志或userserver存redis里做相应的处理了
[2]:如 screensrv挂了,就只能根据screensrv存redis里的恢复了,再找userserver 确认同步到哪了,没同步的继续同步
5>本服场景 跟userserver 数据同/异步 做好了,跨服也做好了,因为没区别
6>任务类,跟场景相关的任务(跟某对话,KILL多少怪,kill哪个BOSS,完成哪个副本等等),可以由场景做检查,最后还是由userserver 完成任务相应状态( 因为 场景已经检查了,所以userserver直接更改状态给与奖励)
也可以直接由 screensrv 把相应的事件发给userserver,由userserver 检测是否完成
这里跟 https://www.sohu.com/a/130991258_483399 的 处理方式 类试
其他的监听逻辑抛回游戏服处理,根据这事件,任务模块处理完成任务,获得奖励;成就模块处理完成成就,获得奖励;主角模块获得经验,金币等奖励;活动模块处理完成活动,获得奖励。
2:如果觉得有用,麻烦点个赞,加个收藏