ET6.0数据库模块(一)

学了字母哥的课程之后,发现这篇文章需要修正……

 

数据库模块花了整整一周时间理解,是耗时最长的模块,因为ET官方Demo没有使用DBComponent,所以主要是研究传奇Demo

Gitee:https://gitee.com/Leng-ET/ET-LegendDemo

 

基础使用其实不算难,无非是增删改查,DBComponent确实也提供了Insert、Remove、Save和Query四组方法,但是除了基础方法,梳理之后发现两个难点:

1、数据库模块更多的是涉及到具体的业务逻辑,关系到组件设计、协议设计以及灵活使用不同参数传递和操作数据;

2、缓存层设计,虽然MongoDB比MySQL访问速度更快,但也需要避免高频数据频繁直接和数据库交互,导致可能性能问题,一般主流游戏都会采用Ridis作为缓存层,ET框架中需要设计DBCacheComponent作为缓存层;

关于缓存层视需求而定,ET社区有两篇相关帖子讨论:

https://et-framework.cn/d/71-redis/2

https://et-framework.cn/d/180-dbproxycomponent

 

首先是DBComponent组件的增删改查方法需要理解怎么使用,基本方法可以看上一篇关于C#中MongoDB基础操作的小例子 ,最好能自己安装MongoDB操作一下命令行和写点C#案例增进理解,可以参考官方工程在【工具-NuGet包管理器-管理解决方案的NuGet程序包】添加MongoDB.Driver、MongoDB.Bson、mongocsharpdriver三个扩展包。

DBComponent提供了一组GetCollection方法用于获取指定Collection(集合),用于在增删改查方法中调用集合对象。

public IMongoCollection<T> GetCollection<T>(int zone, string collection=null)
{
    return this.ZoneDatabases[zone].GetCollection<T>(collection ?? typeof (T).Name);
}

public IMongoCollection<Entity> GetCollection(int zone, string name)
{
    return this.ZoneDatabases[zone].GetCollection<Entity>(name);
}

在DBComponentSystem提供的数据增删改查方法组

 

传奇Demo中设计了这些主要的数据组件用于存储对应系统模块的数据,以及相关业务逻辑的协议,需要特别关注的是专门设计了玩家数据协议IDataMessage和BsonMessage,关于Bson协议的理解可以参考ET社区帖子(https://et-framework.cn/d/211-et6)。

这个结构是根据多服设计,最上层是玩家账号Account,账号下包含不同区服的User,不同区服有自己的角色Character,当然这就是根据需求灵活设计的地方,这个Demo可能在选服时需要显示一些简略信息,这个交互阶段无需详细的角色数据,所以抽出了一个User层,如果没有这些需求或者不在乎多一些发送数据,也可以只设账号和角色两层,把LastPlay和Zone信息放到Character里面。

数据组件是基于前后端Protobuf通信(NetOuter)设计,服务端内部进程通信(NetInner)可以直接使用Bson发送Enity实体信息。

BsonMessage主要定义了几个方法用于传递特定类型的数据,继承IDBCacheActorRequest、IDBCacheActorResponse,似乎是缓存层使用的协议,缓存层的逻辑还得继续梳理。

协议的主要传递内容

协议 Request Response
GetComponent

long CharacterId

string Component

Entity Component
GetUnit

long CharacterId

string Component

Entity Component
SaveComponent

long CharacterId

Entity Component

-
SaveUnit

long CharacterId

List<Entity> Components

-

posted @ 2021-11-23 13:58  qianxun0975  阅读(1272)  评论(0编辑  收藏  举报