昨天听同事聊起龙之谷的服务端架构,有些新颖和值得学习的地方,姑且在此总结,加深下理解,也算是做个笔记。
架构
龙之谷的服务端架构主要的特点就是将数据分块。服务端在设计数据时,按照不同功能将数据分块,比如:玩家属性,技能,帮派,排行块等,每个模块就是一个内存对象——keeper,这样就能按功能模块来管理数据。
keeper是如何管理数据的呢?在服务器启动时,所有keeper都加载到内存。在keeper的内部维护一个字典,这个字典以玩家id(uid)作为key,该模块的数据作为value。初始化为空,当使用keeper时传入uid,keeper先检测uid是否存字典中,如果存在就直接取数据,如果不存在,则去查询数据库。
keeper还有一个作用就是优化存盘。每个字典中再维护一个变量,标记当前数据是否发生改变,存盘时只存发生改变的的数据。同时,keeper的字典中会设置一个上限,在内存中维持固定数量的玩家数据,当玩家数据达到上限后,使用LRU算法,替换到最久未使用的玩家数据。
优缺点
优点
- 先说最大的优点,就是可以通过keeper直接操作离线玩家的数据
- 解耦合,玩家的数据单独存在,不需要一次性将玩家的数据全部加载进内存
缺点
- 需要将数据分块,增加了逻辑复杂度
- 当玩家数据不在内存中时,需要通过不同的keeper多次,分多次去读数据库