erlang 游戏开发工具包之一 mongodb驱动

588 阅读2分钟

简要说明

  1. 游戏业务复杂,数据结构经常要添加字段,所以持久化建议用 mongodb(schema free)。
  2. erlang 用的mongodb driver 一般都用的 mongodb-erlang,但这个库有两个问题,一个是不支持bulk write,然后batch write 又会有大小限制,批量写入的时候就会有问题。二个是本身代码很乱,模块职责不清,追踪问题和想做些业务扩展会很困难。
  3. 基于上述两点,我基于 OP_MSG 协议重写了驱动mgd4erl 。支持 bulk write, cursor,但不支持master-slave。因为游戏服部署不需要考虑主从结构的数据库支持,做好备份就好了。
  4. 使用的时候最好拉到本地,然后做本地依赖,有需要可以自己扩展协议,觉得接口够用就直接包引用。
  5. 扩展接口或者想自己写 mongodb 驱动,可以参考 OP-MSGMongoDB Wire Protocol

功能

  1. 基于 OP_MSG mongodb 版本 3.6+

  2. 支持

    batch 操作,单次提交数据总量大小不能超过16M

    bulk 操作,每条记录不超过16M,但数据总量大小没限制

  3. 支持游标cursor

    每个游标会启动一个进程来管理

    超过时间进程会自动关闭,并释放游标

  4. 支持连接池

    基于 pool boy 进程池

    每个链接对应一个进程

    超过30秒链接失败,会尝试重连.

添加依赖

rebar3 文件rebar.config添加依赖

{deps, [  {mgd4erl, {git, "https://github.com/yinye1024/mgd4erl.git", {tag, "<Latest tag>"}}}   ]
}

Latest tag 是最新版本.

测试用例

  1. 对应修改测试用例的数据库链接地址和端口,
  2. 跑用例 修改 mongo_api_test 和 mongo_client_test 的数据库连接信息

rebar3 eunit

rebar3 eunit --module=mongo_api_test

rebar3 eunit --module=mongo_client_test

如何使用

参考测试用例

  1. mongo_api_test

    测试 yymg_mongo_api 接口

  2. mongo_client_test

    测试 yymg_mongo_client_mgr 接口

主要模块

  1. client 目录, mongo客户端,OP_MSG的实现,可以基于 client 做自己的连接池。

    模块接口 yymg_mongo_client_mgr

    OP_MSG编解码实现 yymg_mongo_client_proto

  2. cursor 目录,游标管理,实现分批查询。

    模块接口 gs_yymg_mongo_cursor_mgr

  3. pool 目录,基于poolboy的连接池实现。

    模块接口 yymg_mongo_poolboy_mgr

  4. 使用接口

    yymg_mongo_api

    使用方法 参考测试用例 test/api/mongo_api_test

    使用规范 参考 tpl/tpl_mongo_dao