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 |
- |