TDR表是基于TDR协议设计的TcaplusDB表,TDR协议是腾讯自研的RPC通信协议,用于TcaplusDB存储数据的序列化、反序列化等操作,相比于PB表(Protocol协议表)在传输效率及传输质量上有一定优势,在腾讯游戏内部有广泛应用基础,具体关于TDR表的定义说明可参考章节:表定义语言(PB,TDR)。TDR表定义以xml格式来定义表结构,支持丰富的数据类型,请参考章节:数据类型(TDR)。
快速入手TDR协议表的开发涉及几个步骤,下面介绍如何基于TcalusDB本地Docker版环境,快速上手基于C++进行TDR表的增删查改操作。所有操作均在申请的开发测试机或云主机进行。
在开始示例代码演示之前,需要提前准备好TcaplusDB本地Docker环境及tcapluscli工具,具体请参考资料:TcaplusDB入门-Docker部署篇.md。 Docker部署好后,对于命令行工具需要授权所有IP访问Docker环境,授权方式:
./tcapluscli privilege --endpoint-url=http://localhost --allow-all-ip
这里以table_test.xml举例,表名: PLAYERONLINECNT, 表类型: GENERIC。文件具体内容如下:
<?xml version="1.0" encoding="GBK" standalone="yes" ?> <metalib name="tcaplus_tb" tagsetversion="1" version="1"> <struct name="PLAYERONLINECNT" version="1" primarykey="TimeStamp,GameSvrID" splittablekey="TimeStamp"> <entry name="TimeStamp" type="uint32" desc="单位为分钟" /> <entry name="GameSvrID" type="string" size="64" /> <entry name="GameAppID" type="string" size="64" desc="gameapp id" /> <entry name="OnlineCntIOS" type="uint32" defaultvalue="0" desc="ios在线人数" /> <entry name="OnlineCntAndroid" type="uint32" defaultvalue="0" desc="android在线人数" /> <entry name="BinaryLen" type="smalluint" defaultvalue="1" desc="数据来源数据长度;长度为0时,忽略来源检查"/> <entry name="binary" type="tinyint" desc="二进制" count= "1000" refer="BinaryLen" /> <entry name="binary2" type="tinyint" desc="二进制2" count= "1000" refer="BinaryLen" /> <entry name="strstr" type="string" size="64" desc="字符串"/> <index name="index_id" column="TimeStamp"/> </struct> </metalib>
对于TcaplusDB,在创建表之前需要创建对应的表集群。对于Docker本地版,集群已经默认创建好一个供大家使用,所以不用再创建集群。
TcaplusDB表在集群的基础上还依赖于表格组,相当于游戏里的逻辑分区,使用工具创建表格组命令如下:
#查看表格组帮助命令 ./tcapluscli tablegroup -h #创建一个表格组,id指定为4, endpoint-url为上面docker暴露的80端口,access-id为集群访问id (业务id, tdr集群默认为2), 用于docker环境连接使用, group name由字母、数字和下划线组成 ./tcapluscli tablegroup create --endpoint-url=http://localhost --access-id=2 --group-id=4 --group-name=zone_4
现在正式进入表创建环节,在上述表格组基础上创建一个TDR表,执行创建表命令,如下所示:
#查看表创建命令提示帮助 ./tcapluscli table -h #创建一个表, 指定endpoint-url, 表格组id: group-id, 表类型: TDR, 表定义文件: table_test.xml,放当前路径 ./tcapluscli table create create --endpoint-url=http://localhost --access-id=2 --group-id=4 --schema-type=TDR --schema-file=table_test.xml
以C++示例代码为例,介绍如何使用TDR接口进行TcaplusDB表数据操作,这里主要介绍Generic类型表操作。示例代码包括两种模式:同步模式 和异步模式,这里主要介绍异步模式示例代码,同步模式代码可查看SDK中examples目录相关代码。
这里以3.46.0版本为示例演示,需要下载两个组件:
组件名 | 下载地址 | 用途 |
---|---|---|
TcaplusServiceApi3.46.0.198987.x86_64_release_20200925 | Download | SDK API相关代码 |
TSF4G_BASE-2.7.37.0a1db41b8_X86_64_Release | Download | tdr依赖包相关代码 |
TcaplusServiceApi3.46.1.199000.x86_64_release_20201102下载后,直接解压至目标机器相应目录即可,如:
/root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102
TSF4G_BASE-2.7.37.0a1db41b8_X86_64_Release下载后,解压后把子目录内的内容拷贝至/usr/local/tsf4g_release即可,如:
#创建目标部署目录 [root@VM-32-2-centos ~]# mkdir /usr/local/tsf4g_release #进子目录 [root@VM-32-2-centos ~]# cd /root/TSF4G_BASE-2.7.37.0a1db41b8_X86_64_Release/release/x86_64 #拷贝至/usr/local/tsf4g_release [root@VM-32-2-centos x86_64]# cp -rf * /usr/local/tsf4g_release
主要设置两个环境变量: TSF4G_HOME和TCAPLUS_HOME, 把下面内容添加至/root/.bashrc,然后执行source /root/.bashrc使其生效,如下所示:
export TSF4G_HOME=/usr/local/tsf4g_release/ export TCAPLUS_HOME=/root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64
环境依赖 | 版本 | 说明 |
---|---|---|
操作系统 | CentOS7 | x86体系 |
C++ | C++98 | |
GCC | 4.8.5 | |
gcc-c++ | 4.8.5 | yum install -y gcc-c++ |
tsf4g | 2.7.37 | tdr相关依赖,参考上述TSF4G部署方式描述 |
示例代码目录在SDK目录下的examples子目录下,examples目录有很多不同类型的表示例,下面主要以C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation子目录的来举例,具体子目录如下:
#SDK根目录 /root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64 #SDK公共配置目录 /root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64/examples/tcaplus/C++_common_for_tdr1.0 #SDK Examples目录 /root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64/examples/tcaplus/C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation
在编译具体示例代码之前,需要把本地版中关于公共参数配置的集群信息进行配置,配置目录在examples/tcaplus/C++_common_for_tdr1.0下,主要涉及如下:
#进入公共信息配置目录 cd TcaplusServiceApi3.46.0.198987.x86_64_release_20200925/release/x86_64/examples/tcaplus/C++_common_for_tdr1.0 #修改common.h,将相关集群信息改为本地版中集群相关信息 /*********************测试例子前需要用户手动修改的地方BEGIN**************************************/ // 目标业务的tcapdir地址,对于TcaplusDB本地版直接配置成0.0.0.0:9999即可 static const char DIR_URL_ARRAY[][TCAPLUS_MAX_STRING_LENGTH] = { "tcp://0.0.0.0:9999" }; // 目标业务的tcapdir 地址个数, 配置成:1 static const int32_t DIR_URL_COUNT = 1; // 目标业务的表名 PLAYERONLINECNT static const char * TABLE_NAME = "PLAYERONLINECNT"; // 目标业务的App ID (接入ID,Access ID), TcaplusDB本地版APP_ID默认为2,用户测试可以不用修改 static const int32_t APP_ID = 2; // 目标业务的Zone ID (游戏区ID, Table Group ID), 参考上述章节创建的group id static const int32_t ZONE_ID = 4; // 目标业务的业务密码,默认为39859BC573A2E254,用户测试可以不用修改, 如果有问题可访问oms控制台在业务管理->业务维护-> 查看密码 static const char * SIGNATURE = "39859BC573A2E254"; /*********************测试例子前需要用户手动修改的地方END**************************************/
在examples/tcaplus/C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation目录下每个操作子目录下的文件有几个:
文件名 | 文件用途 |
---|---|
conv.sh | 依据表定义文件table_test.xml生成表定义接口文件table_test.h, table_test.cpp, 借助SDK根目录下bin目录下的tdr工具来生成 |
envcfg.env | 环境变量设置,主要设置TCAPLUS_HOME和TSF4G_HOME环境变量,设置为SDK根目录,在编译之前执行source envcfg.env,使环境变量生效 |
main.cpp | 示例代码主程序 |
Makefile | 编译文件 |
readme.txt | 编译操作提示说明 |
table_test.xml | 示例表TDR定义文件 |
tlogconf.xml | 日志配置文件,默认不需改动 |
示例代码目录:
/root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64/examples/tcaplus/C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation/insert
生成表定义接口文件,如下:
#生成table_test.h, table_test.cpp sh conv.sh #检查Makefile,重点是LIBS和INC两个变量,参考下面设置 LIBS += -L$(TSF4G_HOME)/lib -L$(TCAPLUS_HOME)/lib -Wl,-Bstatic -ltcaplusserviceapi -ltsf4g_r -lreadline -lncurses -lscew -lexpat -Wl,-Bdynamic -lpthread -lanl INC = -I$(TSF4G_HOME)/include -I$(TCAPLUS_HOME)/include/tcaplus_service -I../../../C++_common_for_tdr1.0 #编译 make #执行编译好的二进制文件,插入记录,如果有问题,请联系TcaplusDB项目组相关人员协助定位问题 ./mytest
示例代码目录:
/root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64/examples/tcaplus/C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation/get
编译过程:
#生成table_test.h, table_test.cpp sh conv.sh #检查Makefile,重点是LIBS和INC两个变量 LIBS += -L$(TSF4G_HOME)/lib -L$(TCAPLUS_HOME)/lib -Wl,-Bstatic -ltcaplusserviceapi -ltsf4g_r -lreadline -lncurses -lscew -lexpat -Wl,-Bdynamic -lpthread -lanl INC = -I$(TSF4G_HOME)/include -I$(TCAPLUS_HOME)/include/tcaplus_service -I../../../C++_common_for_tdr1.0 #编译 make #执行编译好的二进制文件,插入记录,如果有问题,请联系TcaplusDB项目组相关人员协助定位问题 ./mytest #编译 make #执行编译好的二进制文件,插入记录,如果有问题,请联系TcaplusDB项目组相关人员协助定位问题 ./mytest
示例代码目录:
/root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64/examples/tcaplus/C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation/update
编译过程:
#生成table_test.h, table_test.cpp sh conv.sh #检查Makefile,重点是LIBS和INC两个变量 LIBS += -L$(TSF4G_HOME)/lib -L$(TCAPLUS_HOME)/lib -Wl,-Bstatic -ltcaplusserviceapi -ltsf4g_r -lreadline -lncurses -lscew -lexpat -Wl,-Bdynamic -lpthread -lanl INC = -I$(TSF4G_HOME)/include -I$(TCAPLUS_HOME)/include/tcaplus_service -I../../../C++_common_for_tdr1.0 #编译 make #执行编译好的二进制文件,插入记录,如果有问题,请联系TcaplusDB项目组相关人员协助定位问题 ./mytest
示例代码目录:
/root/TcaplusServiceApi3.46.1.199000.x86_64_release_20201102/release/x86_64/examples/tcaplus/C++_tdr1.0_asyncmode_generic_simpletable/SingleOperation/delete
编译过程:
#生成table_test.h, table_test.cpp sh conv.sh #检查Makefile,重点是LIBS和INC两个变量 LIBS += -L$(TSF4G_HOME)/lib -L$(TCAPLUS_HOME)/lib -Wl,-Bstatic -ltcaplusserviceapi -ltsf4g_r -lreadline -lncurses -lscew -lexpat -Wl,-Bdynamic -lpthread -lanl INC = -I$(TSF4G_HOME)/include -I$(TCAPLUS_HOME)/include/tcaplus_service -I../../../C++_common_for_tdr1.0 #编译 make #执行编译好的二进制文件,插入记录,如果有问题,请联系TcaplusDB项目组相关人员协助定位问题 ./mytest
TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。