开发者学堂课程【阿里云原生内存数据库 Tair 课程:Tair 在游戏行业的应用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1198/detail/18193
Tair在游戏行业的应用
内容介绍
一、Tair 在游戏行业的总览
二、用户信息存储:JSON 数据处理
三、游戏论坛:全文索引功能
四、单机及分布式架构排行榜
五、游戏在 Tair 中的常见运维
一、Tair在游戏行业的总览
这是典型的游戏架构。用户的手机或者 pc 通过接入层接入,之后进
入 gameserver 处理。为了用户的体验更快更流畅,很多计算或者数
据存储希望在内存中完成并且快速返回。
例如:对战匹配、实时的单局排行榜、分布式锁、角色选择或者预览
等功能直接可以在 Tair 中完成,有一部分数据需要持久化到 rds 中,
例如:用户背包、流程日志以及进度存档等数据,可以通过 Tair 来
加速读取过程。
除核心系统,一些周边系统,例如:游戏 region/server
负责游戏的分服、分区管理,版本控制和全局活动,也可以直接依赖
Tair 作为数据库,还有一些跨服数据对战、邮箱和聊天服务,Tair
的 pubsible 功能则可以完成,并且性能是 release 的三倍,完全可
以承载出大流量的消息推送和接收。最后是有一些游戏数据需要和
data 的 Warehouse 进行联动分析和运营,这部分产生的结果同时
也可以放在 Tair 中进行快速的查询和展示。
介绍完架构,来看下 Tair 在游戏行业的亮点功能,按照橙色板块主要可以分为主要四大功能:
第一部分是全兼容 Redis 并且性能达到 Redis 的三倍,包括核心的
PubSub 和 Lua 功能的性能都是进行过优化的。
第二部分 Tair Stack 的十余种企业级数据结构,帮助业务快速创新。包括 JSON 数据的处理、全文搜索、排行榜等等,且三种数据结构已经开源,后面会给出开源的地址。
第三部分是数据闪回功能,通过协议 Tair 的数据闪回可以指定时间点最少维度为秒级别,并且 TimeShift 的功能可以在数据恢复的过程中手动进行调节数据新的过期时间,最后是全球多活功能。多地域的数据一致性可以助力融灾以及业务的价格优化和多用户的连接体验。
二、用户信息储存:JSON数据的处理
JSON 作为一种数据交换格式,被游戏数据所广受欢迎,很多客户在 Tair 中存储游戏的 JSON 数据,常见的比如用户信息、背包,技能,数据的存储、游戏配置、原数据以及游戏中需要频繁修改的数据的存储。
Tair 也支持完整的 JSON 标准,在内存中以树的的形式存储二进制的基层数据,查询速度在毫秒级别,且支持两种 rfc 的查询语法,分别是 JSONPointer 以及 RFC-draftJSONPath。
以游戏中添加好友信息举例,首先可以通过 JSON.SET 来将用户信息存储在 Tair 中,可以看到刚加入的用户信息中 friend 字段为空,接着使用 JSON.ARRRPPEND,可以将好友添加给两个用户,注意这里并不是操作整体的JSON,而是通过指定路径点friends,从而操作 JSON 的子元素 friends 部分,这也就避免了将整个 JSON 进行序列化和反序列化的过程,节省开销。
添加结束之后,再次查看用户信息,可以发现 tom 以及 denny 已经互相成为了好友,并且在对方的好友列表中。下面为大家实际演示添加好友的操作,大家也可以按照此示例流程进行操作。
首先,需要打开阿里云的 shell,启动结束之后将会得到 terminal,在这里可以执行一些简单的命令,执行完简单的命令之后只需要复制> cloudshell-git-open https://github.com/yangbooong22011/tair-tutorial.git;teachmetutorial.md,这是写好的教程,将条命令复制并且粘贴到 terminal中。按照步骤来进行操作。
首先,是快速入门的概览,需要创建实例,设置白名单并且连接管理。第一部分,准备 Tair 实例。使用训练营提供的实例或者自行创建实例,如果有需要可自行创建实例,可以购买内存型的实例,这样就可以支持所有 Tair 的高级数据结构。第二是设置白名单,设置完白名单之后,就可以去连接实例了。因为教程是在阿里云进行操作的,因此需要申请公网访问地址,申请完公网访问地址之后,在实例详情页面可以看到公网访问的地址,将地址记录下来,就可以进行后续的操作了。第二步是连接 Tair 实例,在连接 Tair 实例的时候有两种方法,第一种是通过 rscis-cli 进行连接,第二种是通过 DMS,在 Tair 的实例详情页中右上角的登录数据库去登录Tair,跳转到 dms 平台之后也可以执行 Tair 的命令。
第一种方法是点击右侧的执行命令,将命令自动粘贴到左侧的命令框中:-p指定连接数据库的地址,-a可以指定密码,回车,可以看到数据库已经连接上去。接下来,开始执行教程,教程展示的用户添加好友的操作。
首先需要去存储用户 tony 和 Denny 的信息,那是通过 JSON.SET 命令,点击执行命令,命令被粘贴到右边的 terminal 中,通过接层点 set 将用户 Tom 的信息存储在 Tair 中,它的内容是接层串,他的好友是空的数组,回车可以看到 Tair 返回 ok,将 danny 也存储进去。之后,通过 ARRRPPEND 来将用户 tom 添加为 danny 的好友,返回的数字一表明成功的往 friends,JSON 数组中添加成功的元素。同时在将 Jenny 添加为 tom 的好友,结束之后,可以再次查看 tom 和 Denny 的信息。
例如:先获取 Tom 的信息,可以看到在 Tom 的信息中,他的 friends 已经有了Denny,那同理获取 Denny 的信息,他的好友中也有了 tom。关于 Tair 存储 JSON 的特点是:
第一点是不用将整个数据拿回来,可以通过两种 SONPointer 以及 RFC-draftJSONPath 的语法来描述只操作 JSON 的某一部分,而不用将整个 JSON 序列化或者反序列化,这是最大的优势。
其次,语法比较丰富,除了进行点查和点的一些更改之外,还可以进行一些搜索操作,那大家具体可以关注 JSONPath 的用法来完成一部分功能。
三、游戏论坛:全文索引功能
游戏中的全文索引场景主要包括游戏产生的一些数据,还有社区数据以及攻略数据和行为数据,这些数据通过索引之后,可以为游戏的玩家,论坛的用户,游戏的运维以及游戏的运营人员提供充足的分析以及处理整个过程。
Tair 的全文索引具有以下的特点:
第一是低延迟并且高性能的,可以提供毫秒级的写入以及全文搜索能力;
第二是支持多种聚合查询,例如 terms/metrics/filter 等聚合算子;
第三是可以支持增量以及局部更新,并不用更新整个文档,对于的 JSON 文档而言,不需要将像 es 一样将整个文档重写,并且也可以支持 incrby 等常见的操作;
第四是支持前缀的模糊搜索以及自动补全,并且它的语法非常的灵活,语法和类似ElasticSearch,也可以支持像 bool/match/term/ 分页等;
最后是有内置了常见的一些分词器,例如一些其他主流的英语的分词器,并且可以提供定制化分词器的能力。下面以游戏的论坛为例进行演示和实操讲解 Tair 在全文搜索中的能力。
常见的游戏论坛主要包括用户发出去文本的帖子,也会进行帖子的搜索,包括创建索引,发帖以及搜帖三个步骤。创建主要是对于游戏帖子的内容的不同的字段进行索引的创建。比如说的游戏帖子中有 title 是他的名字,也有 content 是内容,还有时间 long,热度等。有这些数据,在创建索引的时候,可以看到右上角在将 title 映射为关键字,它的内容 content 就是文本,时间字段按照 long 来区分,作者也是 key word,最后的热度,可以添加不同的内容,也就是发帖操作,这就可以进行索引的建立。建立完索引之后,可以对索引进行搜索,可以看到右下角的搜索,它是按照热度从高到低,并且进行了排序操作。回到的教程,点击下一步就是游戏论坛的搜索的帖子,可以看到可以先询问,那询问完之后便可以插入数据,插入的每一条数据都会被自动索引。比如插入第一条,返回值是 ID,同理插入第二条数据,拿到了第二个 ID,插入第三条数据……接下来进行搜索,那搜索的时候如果是按照 order 降序,并且搜索的关键字是三个关键字,因为三个关键字在帖子中分别都进行了出现,因此三个帖子都会被搜索出来,并可以看到搜索结果。
为了更好的展示,进行格式化校验,校验之后可以看到搜索出来命中的结果,第一个文本的热度是100,第二个文本的热度是10,,第三个文本的热度是2。对于关键字,第一文本有 code 的关键字,因此被搜索出来,第二个文本有的关键字是内容和 work,第三个的关键字 paypal。因此搜索结果是准确的。如果想按照热度的升序进行的,只需要换 nsc,此时搜出来结果就是按升序进行排列了。热度最小的成为了最低,接下来是热度为10的第二个帖子,接下来是热度为100的第三个帖子。除了论坛的搜索之外,整个全文索引也可以进行商品道具的搜索。包括创建索引,也发布一些商品的道具,包括搜索一些商品的道具,都在游戏中的功能非常的常见。Tair 的全文索引性能非常的高,测试展示了在维基百科上的英文摘要的搜索性能,Tair 在写入和搜索上的 qps 分别是 RedisSearch 和 ES 的两倍和四倍。rt 却只有 RedisSearch 和 ES 的1/2和1/6。
四、单机及分布式架构排行榜
游戏中经常会有排序的需求,无论是整体的排名,或者是类似于赛车游戏在单局结束之后的排名,这都是 Tair 非常擅长的领域。Redis 只能支持一维数据的排序,但是 Tair 的排行榜则可以最大支持256维度的排序,且兼容原生的,Redis 所有的 api,毫秒级别的rt目前已经在 github 上开源。常见的场景在游戏中,当称号相同的时候,需要按照胜率进行排序;还有在奥运奖牌榜中,当金牌数量相同的时候,进行银牌排序,银牌数量相同时,按照铜牌排序;或者是在主播的排序中,当热度相同的时候,按照收到的点赞数量进行排序。下面来为大家展示游戏中的多维排行。同样切到最后教程,游戏中的多维排行榜。
该示例是在游戏中,当等级相同的时候,需要按照胜率去进行排序,否则在按照积分进行排序。第一步是添加数据,各维度的比分需要用#进行隔开,#各个纬度之间的分隔符,例如:用户的等级是60级,胜率是0.3,积分是20,则可以用60#30#20#这种方式,将数据插入。将 exadd 命令插入排行榜,那 leadboard 是排行榜的名称,也是 key 的名称,接下来分别有六个用户,回车之后可以看到的数据返回了零,那是因为此时的 leadboard 已经存在于排行榜中,可以删除,删除之后再次进行演示,返回的是6,成功插入的元素数,插入些元素数之后,可以获取某个用户的排名。例如 user1 和 user2。user1 和 user2 的等级都是级是相同的,因此需要按照胜率进行再次排序,user2的胜率较小,因此被排在后面,如果想按照胜率从低到高排序也是可以的,只要将 api 换成用 exzrank 就好。
exzrank 会按照从高到低的顺序排,因此 user2 实际上是第4名,但是 user1 是第3名,因为 user1 的胜率实际是比 user2 要高的。可以用 exzrevrange 来获取获取 top 用户,默认是从高往低便利用户的,只需要指定两个起始点位,便可以获取相应的用户,例如获取 top 三的用户,则是 exzrevrange 从0到2,同理,如果想获取从小到大的,则使用 exzrevrange 即可,获取所有用户的排名只需要指定从0到负1即可。同理,如果说想获取从低到高的排名只需要用 exzrevrange 即可。Tair 是按照 k 进行分片的数据库,因此一个k只能在一个分片上,如果用户在单个k上存储的数据过多,不仅会影响查询性能,也会导致迁移困难,因此分布式架构的排行榜是为了解决上千万用户排名场景,是在 Tair 开源客户端上开发的功能。用户可以通过构造分布式的排行榜对象,从而在底层会创建多个排行榜。例如示例,用户的插入将会被分摊到多个排行榜中,如图
插入七个 user,user1 和 user5 被插入到第1排行榜,user2 和 user6 被插入第2个排行榜中,当要获取全局第一名时,将会查询所有子排行榜的 top 榜,最后在本地进行简单数据的排序即可完成。通过这种方式,Tair 可以解决上万用户排序的问题,除过普通的排行榜、游戏中常见的日榜,周榜,月榜都可以被轻松构建出来,只需要使用不同的数据维度表示不同的时间范围即可。
五、游戏在 Tair 中的常见运维操作
数据闪回可以在游戏运营中出现问题,或者当用户被盗号之后做紧急的数据处理。Tair 可以支持从 k 到部分 k 到多个 k 所有的全维度的数据闪回,并且通过 Tair 设计可以支持秒级别的闪回。如图右边展示了全量数据或指定 k,并且可以新建实例或者从原实例直接闪回。
在游戏线上的运维过程中,有时候出现的问题是随着某个 k 数量,数据量逐渐变大,从而对 cpu 和网卡造成了一些压力导致查询超时。
大 key 分析功能则可以通过离线分析数据,让用户洞悉数据中的一切,可以拿到大key,按内存大小,按数量,按 k 的前缀,组织等等,遇到爆款的装备则出现热点 qps 达到几万,Tair 也可以从容应对。
通过实例的读写分离版本以及 query cache 功能,可以解决用户的热点问题,助力业务直线增长。
本期课程主要介绍了 Tair 在游戏行业的架构和亮点功能,并且仔细介绍了 JSON 的数据处理,全文索引和排行榜的设计,以及游戏在 Tair 中的常见运维操作。