简要说明
- 游戏业务复杂,数据结构经常要添加字段,所以持久化建议用 mongodb(schema free)。
- erlang 用的mongodb driver 一般都用的 mongodb-erlang,但这个库有两个问题,一个是不支持bulk write,然后batch write 又会有大小限制,批量写入的时候就会有问题。二个是本身代码很乱,模块职责不清,追踪问题和想做些业务扩展会很困难。
- 基于上述两点,我基于 OP_MSG 协议重写了驱动mgd4erl 。支持 bulk write, cursor,但不支持master-slave。因为游戏服部署不需要考虑主从结构的数据库支持,做好备份就好了。
- 使用的时候最好拉到本地,然后做本地依赖,有需要可以自己扩展协议,觉得接口够用就直接包引用。
- 扩展接口或者想自己写 mongodb 驱动,可以参考 OP-MSG 和 MongoDB Wire Protocol。
功能
-
基于 OP_MSG mongodb 版本 3.6+
-
支持
batch 操作,单次提交数据总量大小不能超过16M
bulk 操作,每条记录不超过16M,但数据总量大小没限制
-
支持游标cursor
每个游标会启动一个进程来管理
超过时间进程会自动关闭,并释放游标
-
支持连接池
基于 pool boy 进程池
每个链接对应一个进程
超过30秒链接失败,会尝试重连.
添加依赖
rebar3 文件rebar.config添加依赖
{deps, [ {mgd4erl, {git, "https://github.com/yinye1024/mgd4erl.git", {tag, "<Latest tag>"}}} ]
}
Latest tag 是最新版本.
测试用例
- 对应修改测试用例的数据库链接地址和端口,
- 跑用例 修改 mongo_api_test 和 mongo_client_test 的数据库连接信息
rebar3 eunit
rebar3 eunit --module=mongo_api_test
rebar3 eunit --module=mongo_client_test
如何使用
参考测试用例
-
mongo_api_test
测试 yymg_mongo_api 接口
-
mongo_client_test
测试 yymg_mongo_client_mgr 接口
主要模块
-
client 目录, mongo客户端,OP_MSG的实现,可以基于 client 做自己的连接池。
模块接口 yymg_mongo_client_mgr
OP_MSG编解码实现 yymg_mongo_client_proto
-
cursor 目录,游标管理,实现分批查询。
模块接口 gs_yymg_mongo_cursor_mgr
-
pool 目录,基于poolboy的连接池实现。
模块接口 yymg_mongo_poolboy_mgr
-
使用接口
yymg_mongo_api
使用方法 参考测试用例 test/api/mongo_api_test
使用规范 参考 tpl/tpl_mongo_dao