[开发者心得] 【模块管理和数据中心】——为什么需要数据中心?④

[复制链接]
2074 |0
空伊伊 发表于 2023-3-9 19:33:51 | 显示全部楼层 |阅读模式

本帖最后由 空伊伊 于 2023-11-8 17:28 编辑

模块管理和数据中心

目录

为什么要使用模块管理①

模块管理的使用步骤②

模块管理的各功能介绍③

为什么要使用数据中心④

数据中心的使用步骤⑤

数据中心的各功能介绍⑥

为什么需要数据中心?

1.数据中心可以帮助我们将数据进行永久存储

我们在定义一个数据类的时候,可以通过给属性字段添加 @Decorator.persistence() 这个装饰器来让数据被永久存储。

2. 数据中心实现了服务端和客户端的数据同步

已知,DataStorage的方法只能在服务端调用生效,所以数据中心帮我们封装了数据同步,让我们能在双端都能取到想要的数据。这里简单介绍一下数据同步的时间点:

首次同步:DataCenterS 会监听玩家上线,当玩家上线的时候会从KV服务器上获取PlayerData同步给对应客户端

保存同步:每次在服务端调用SubData的save(true)方法时,会将数据同步给对应的客户端

主动同步:每次在服务端调用SubData的syncToClient()方法时,会将数据同步给对应的客户端

3. 数据中心实现了数据缓存,降低与KV服务器的交互频率

已知,直接使用DataStorage来存储数据,会有频率限制

【总频率限制】 接口调用时至一分钟前的时间区间内,某个Key的对应值在KV服务器上被获取Get、改写Set、删除Remove的总次数不能超过 (60+游戏设定的最大人数×10)次,不管它是在哪个ds服务器被操作的;如果时间区间内超限,请求会失败,然后Set、Remove会返回 FREQUENCY_OVERRUN(操作失败:请求频率超限) 而Get会catch到error timeout。 【改写间隔限制】 对于某个Key的对应值,在KV数据服务器上进行了1次改写Set 或 删除Remove操作后,该Key的对应值将会被锁定6s,在这6s内将无法再被Set、remove,尝试将会返回 FREQUENCY_OVERRUN(操作失败:请求频率超限),直到6s过去解锁后才可修改。

数据缓存的实现原理:每个玩家在DataCenterS上会有一份PlayerData,玩家每次修改数据都是对这个PlayerData进行修改,然后每隔10秒以及玩家下线时,会调用 DataStorage.asyncSetData 来保存一次数据。这样就避免了与KV服务器交互频率过高的问题。

所以使用数据中心存储数据,就不需要考虑存取频率的问题啦~。不过得考虑RPC的频率,因为存和取都得在服务端进行,频率太高会导致服务端压力太大

4. 数据中心实现了模块数据的统一管理

举个例子,假如现在一个玩家有背包数据、关卡数据、天赋数据,我们使用数据中心保存和使用它们

export class BagData extends Subdata {
    /**背包物品 */
    @Decorator.persistence()
    bagItem: [] = [];
    /**背包皮肤 */
    @Decorator.persistence()
    bagSkin: string;

    public saveBagData() {
        this.save(true)
    }
}

export class LevelData extends Subdata {
    /**关卡数据 */
    @Decorator.persistence()
    levelID: number
    public saveLevelData() {
        this.save(true)
    }
}

export class TalentData extends Subdata {
    /**天赋数据 */
    @Decorator.persistence()
    myTalent: [] = []
    public saveTalentData() {
        this.save(true)
    }
}

// 在S端获取各个数据
DataCenterS.getData(player, BagData)
DataCenterS.getData(player, LevelData)
DataCenterS.getData(player, TalentData)
// 在C端获取各个数据
DataCenterC.getData(BagData)
DataCenterC.getData(LevelData)
DataCenterC.getData(TalentData)

由上可见,这样做有3个好处:

定义数据方便】数据体只需要继承SubData,数据就能自动被DataCenter管理起来 【保存数据方便】保存数据只需要调用父类SubData的save方法,即可实现保存 【获取数据方便】获取数据只需要传入数据体的类名,即可获取到对应数据

下一节:数据中心的使用步骤⑤

回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表