开发者学堂课程【阿里云原生内存数据库 Tair 课程:Tair在搜推广场景中的使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1198/detail/18196
Tair在搜推广场景中的使用
内容介绍
一、产品介绍和业务建模
二、电影评价系统案例介绍
三、特征存储作用
四、为什么 Tair 作为特征存储
五、Tair 作为特征存储的具体实践
首先会简单进行 Tair 产品介绍以及业务建模,接下来会以电影评价系统为例展示Tair 是如何融合结构化 、非结构化数据,并挖掘数据背后的价值。
一、产品介绍和业务建模
Tair for Graph 介绍和 Tair 向量检索介绍会从原理上讲解两种技术是如何实现万物互联。最后会给出业务如该如何建模来更好的使用 Tair for Graph。
Tair for Graph 全称 Tair for Graph 图引擎以图论为基础,针对图结构设计的一款数据库。以属性图为例,核心包括<顶点、有向边、属性、标签>。
如图所示:
顶点:张三、李四、Tair for Graph
有向边:created
属性:id、name、age、time、weight
标签:Person、Service、created
Tair for Graph截至目前发展经过了三个阶段:2018年,研发了 Tair for Graph,主要服务于集团内用户,2020年初上线了 gdp,主要针对云上的图数据库用户;2022年中 Tair以及 gdp 进行了品牌的融合,构建了基于 Hash ,string 向量图的一体化的整体的解决方案。Tair 向量检索是 string,Hash,Zset 等等, 针对非机构化数据构建了处理引擎。
如图所示:
用户可以将图片,文本,音频,视频等等进行特征抽取,形成特征向量并存处于的Tair 向量检索系统,通过进行近似的检索,Tair 向量检索基于从内层实现性能相比友商提升四倍以上,同时针对各种算法进行了内存的优化,整体内存相比友商占用更低,目前支持单节点和主备两种部署形态。
检索算法中支持暴力搜索和 HNSW 两种检索方案,向量运算支持欧距、向量内积、余弦距离三种距离算法,除了支持近邻检索外,还支持近邻检索和条件过滤混合查询距离函数。通过 AI 技术将图片、视频、音频、文本、分子结构、DNA 等非结构化数据转换为向量,通过 Tair 向量检索进行实体信息统一存储。
例如图中黄色圈中的非结构化数据都可以储存在 Tair 向量检索中,同时这些信息中的结构化部分以及其他的信息构成的关系模型可以储存在 Graph 图系统中。通过业务建模,将实体关联等结构化数据建模为 Graph 模型。通过 Tair 向量检索、Graph对关联数据进行深度洞察,挖掘数字资产价值。基于AI和图技术带来的突破,用户可以进行更富有想象力、更有创造力、更具有价值前沿的新业务探索。
用户在用途的过程中最大的问题是该如何建模,这没有最终的通用方案,这都要根据的业务场景,使用图数据库的查询方式来进行建模。虽然没有通用的方案,但是有一些通用的指导原则。
指导原则:基于业务场景、数据使用方式,无"one-size-fits-all"方案通用准则:
唯一性:所有的节点和有向边都需要唯一 ID。
顶点:
以实体为核心建模,少量场景以操作为核心,判断标准是如果所建模信息涉及2个以上实体可以将其建模为顶点(例如"交易"如果涉及到3方以上参与)。
0实体属性 or 有向边:
如果需要以该信息为核心进行深度遍历或者该信息具有关联属性,则建议建模为有向边,如果以实体查询场景为主,则建议建模为属性。
超级顶点有两种做法:
多层顶点扩展(例如机场 -航班-> 机场,机场会成为超级点。可以将航班按天建模:机场-20211010航班->机场);
属性(例如只需要查询大V的粉丝,可以将大V到粉丝边抽象为粉丝数作为顶点属性);
建模效果论证:proof-of-concept,可提供技术指导。
用户用 Tair for Graph 图引擎一个典型的场景是从关键数据库转到图引擎。
如图是转换的关键数据库表模型到图转换的非常经典的案例。
对于关键数据库里面的每一张表都可以对应到图里面的一类顶点,表里面的每一行对应到具体的顶点,表里面的每一列对应到的是顶点的属性。对于关联表或者是表的外键,可以将它建模为两个顶点的边,关联表上的属性的其实是边的属性。
通过非常清晰的映射关系可以非常快的将关系模型转化为图模型进行存储。下面的是包含很多种不同场景的一些典型的图建模的一些案例,左上角的信用卡套现
场景包含了用户,信用卡,商店三类信息,通过 Tair for Graph 的循环路径发现算法是能够轻易的发现种环路的情况。
接下来是金融欺诈的场景,这里面包含了交易,地址,设备三类顶点,如果发现某个交易是潜在的欺诈交易,可以通过左侧的地址链路或者通过右侧的设备链路能够轻易的挖掘出其他潜在的未发现的一些交易问题。保险反欺诈的场景包含了保险单,理赔单以及投保人,被保人相关的疾病等等信息。如果发现某理赔单是有问题的理赔单,那可以通过被保人链路或者是通过投保人的链路。非常快的,非常高效的去发现其他潜在风险的风险单以及有风险的嫌疑用户。通过这些通过图的深度辨理的能力,能够非常轻而易举的挖掘之中潜在的问题。
下面的是三个典型的模式,首先的是协同推荐的模型,这里面主要以社交+为主,例如社交+电商,+游戏,+金融等等。
以电影推荐为例 ,将好友喜欢的电影推荐给我,这是一个典型的协同推荐的场景。第二是封层模型。如图它最上层是更顶点,往下分第一层,第二层,可以分非常多的层次,这里面非常典型的场景是企业的多层持股,例如说根企业下面有很多子企业,子控股企业以及他的高管,他的法人,围绕着子企业、高管法人又会再往下扩展出不同层级的其他的一些壳企业等等,那通过的 Tair for Graph 的路径发现以及种子图匹配是能够非常轻易的挖掘出种里面的持股关系以及整个的子图的情况 第三类模式是项目协作模型,图中人和软件之间,多个人共同创作了软件,通过 Tair for Graph 能够很轻易的从某个人来出发,查他所创建的所有的软件以及他的每个软件中的权重,也可以从某个特定的软件来出发来看,给软件做做贡献的所有的人以及按照贡献度进行一些排序。那项目协作模型呢 它和些代码管理 流程管理,项目进度等等基本都是同一个模式,除这三种模式模型之外,Tair for Graph 在传统行业也有非常多的用户场景。例如在教育领域,这里面包括了课程 ,教材,章节,视频知识点,课件,老师的等等,如果从课程出发,可以很轻易的得到课程有关的章节,每个章节包含的知识点,它的课件,相关的视频等等。第二个场景是医疗行业,典型的有基因疾病、药物症状等等,如果发现了新的疾病,可以很轻易的通过图中来判别出和疾病相关的一些药物或者是基因等等。第三类是传统制造业,这里有一些非常复杂一些工业产品,在常年累月的迭代中会有非常多的一些版本,每个版本的都是完整的产品,它下面会分很多种子部件 ,子部件下面又分很多组件,再往下分零件,原材料,还有供应商等等,每个版本的都是非常复杂的多层的图。通过 Tair for graph 的深度链路的挖掘能力是非常容易的去对整个子图进行管理。
二、电影评价系统案例介绍
首先是介绍三种电影推荐的方案,第二个是通过小模型大威力来了解一下电影明星高薪背后的一些技术原理,第三个是通过 Tair for Graph 的子图匹配进行优质朋友圈的推荐。
首先对电影评价系统进行业务建模。
建模主要包含了结构化数据和非结构化数据。 非结构化数据主要是最上面的两张图片,主体是围绕电影进行展开,围绕电影的关联关系的主要包含三类:第一类是用户和电影。用户可以对电影进行一些打分、点赞,用户和用户之间可以进行基于电影的一些话题帖子进行讨论等等。第二是影视基地和电影。影视基地本身是非常好的旅游资源,同时影视基地是对新电影的推荐提供非常重要的来源。第三类是明星和电影。明星和很多电影都有非常直接的关系,同时的明星又有很多的粉丝,可以基于粉丝关注、点赞等等形成非常强的话题,同时明星还可以通过带货来进行多层裂变营销的一些非常好玩的一些场景。首先,第一种电影推荐是基于特征进行推荐。这是这是一个 Tair 向量检索服务解决方案。首先进行数据采集,采集用户特征、电影特征、电影评分等关键信息,然后进行信息融合,融合成32位的向量;接下来根据用户评分等进行模型训练:采用双塔模型训练用户特征向量、电影特征向量, 根据当前用户的画像信息,实时抽取用户特征,根据特征向量向 Tair 向量检索进行个性化电影推荐,根据<特征向量、复合条件>进行更细粒度电影推荐,根据电影 ID 进行电影结构化信息查询。
接下来是根据拍摄基地进行电影推荐。这是一个 Tair(向量检索+Graph)融合的解决方案:
首先进行数据持久化,通过VGG16技术将图片编码为向量,将向量数据和实体其他信息存入 Tair 向量检索,同时将评价系统中的关联关系存储 Tair for Graph 图引擎中。当用户在拍摄基地游玩,随手拍照进行搜索,后端将照片通过VGG16转换为特征向量并请求 Tair 向量检索服务口,Tair 向量检索返回对应的影视基地 ID,后端请求 Tair for Graph 获取该基地的其他好评电影列表,Tair 限量检索服务的解决方案。第三类是根据协同策略进行电影推荐。协同推荐的方案的方法非常多,简单的看三个不同维度的 case。
首先的是基于朋友社交关系的推荐,例如说将李毅的朋友喜欢的并且有影星张雷出演的电影推荐给李毅,可以用左下角的进行描述。中间是以电影的社交关系进行推荐,例如将王佳喜欢的《老兵的故事》喜欢电影的其他人所喜欢的其他的电影推荐给王佳。最右侧 case 是基于明星社交关系推荐新电影。例如说将明星张雷他主演的,同时李毅没有点过赞的电影, 按照评分高低排序推荐给李毅。
讲完了三种推荐方案,看一下明星带货的精准营销:
明星有海量的粉丝,可以把自己喜欢的商品通过发朋友圈进行推荐,通过最左侧的图可以看到以把喜欢的明星所喜欢的商品拿过来。第二个图是基于朋友好友关系的推荐,例如说将证言郑炎的朋友购买过的商品推荐给郑炎。两个场景进行融合就会形成最右侧的小模型、大威力。小模型指的是模型非常简单,最上层的百万级别粉丝的大明星推荐的商品,下一层是大V,大V再向下进行很多层的传递。同时下层的些普通的用户可以基于好友的一种推荐关系进行横线的拓展,整体来看简单的 case可以让大v通过带货很直接或进行的触达几百万上千万的终端的用户,这里面会带来非常大的利润的空间。
接下来看通过 Tair for Graph 的子图推荐优质朋友圈的几个案例:
第一个还是基于好友的好友推荐,如最左侧是将王佳她的好朋友李毅的朋友,但王佳还不认识的人推荐给王佳的。那第二类是基于对同电影有共同的好评的人来发现志同道合的一些朋友,例如将王佳他喜欢的电影《老兵的故事》喜欢同样的电影的人推荐给王佳。最右侧的是基于同明星的粉丝以及通过同明星的粉丝来发现共同好友的人,共同兴趣的人作为好友。例如说将韩莉他喜欢的明星张雷,他的粉丝中和韩丽一样都喜欢文艺歌曲的粉丝介绍给韩莉。
通过三个场景可以看到推荐好友的原则是在某领域有一些共同的一些兴趣爱好。基于种形式推荐出来的好友的质量会更好。
在搜推广场景下面用Tair 作为特征存储的应用。分享主要分为三部分,第一部分在搜推广场景下面特征存储作用,第二部分是说一下为什么 Tair 作为特征存储, 第三部分讲一下 Tair 作为特征存储的具体实践。
三、特征存储作用
搜推广的场景其实是推荐场景,例如去打开淘宝的首页,会看到各种各样的商品,这些商品都是因人而异的,是根据用户的特征去做具体的推荐。该功能通常是有几个模块组成的。
首先会有离线的计算平台,离线的计算平台里面会包含一些商品的信息,用户的信息,包括应用的日志等等各种原始的数据。离线的平台会对些非结构化或者半结构化的数据去做数据的清洗,完成离线数据的提取,提取出来的特征通常是商品的价格,商品的销量,用户的年龄,用户的平均客单价等等
,这些极限特征特点是变化不频繁的,而且这些提取出来的特征会去存储到特征的存储系统里面去。第二块是实时的特征,实时的特征通常是由用户的前端去产生的,之后添加到特征程度中。这些实时特征例如:用户的点击信息,用户在各个页面的停留时间,用户下单的商品,这些实时特征的特点是需要很快做出反馈。例如用户在给用户推荐的一批商品的页面上面停留的时间就代表他对些商品的关注度,下一页推荐的商品就可以去根据这些信息去做调整。实时特征的特点是变化很快。同时这些特征会有模型的训练系统来把这些特征数据去训练模型。
这里以 tensorflow 为例 ,tensorflow 会去特征存储系统里面去拉取离线的以及在线的特征数据来训练出模型,这样的推理服务就可以去通过模型去推荐出某个用户关注关心的商品,当用户打开他的手机登录后,向推理服务去请求,这时候推理服务器去依赖用户的 id 去拿到用户的特征。
依据模型就可以知道用户需要哪些推荐哪些商品,然后去把商品的信息返回给用户的前端,这样就完成了推荐的服务。在搜推广场景下面有很重要的东西:特征存储。特征存储会去把离线以及在线系统去做打通。通常特征存储会去用到两层的架构,用内存的缓存层去做加速,它具备很高的吞吐并且它的延时也很低,同时会去用依赖磁盘存储的数据层去做数据的兜底,特点是容量非常大,能够完成数据的持久化。但是可以依赖 Tair 去替换掉两层的架构。因为 Tair 使用持久内存,既可以去具备缓存层的高吞吐延时的特性具备磁盘存储的大容量化的特性。
四、为什么要用 Tair 去作为里特征存储
首先讲一下特征存储在收推广里面的要求。首先,搜推广场景有很多个系统,例如历史特征的提取,模型训练的实时训练,包括模型回归等等各个系统。
这些系统都依赖到特征数据,这需要有数据化的存储系统去将些数据去全部做打通,让这些系统能够相互的共享数据,让数据在系统之间流动起来。
Tair 作为中心化的存储去将所有的周边系统去做打通,第二是系统会做多地域部署,这就涉及到多地域之间数据的同步的问题,Tair 通过全球多活功能可以做到各个地域之间特征数据的双向的同步,从而保证每个地域的特征数据都是相同的。特征存储的第二个是要有非常高的性能。要有大容量,同时成本还很低。离线特征是会去定期去做计算和数据清洗,然后把它导入到特征数据里面去,这时就要求需要有很快的导入数据。因为离线特征通常数据量非常大。Tair 使用持久内存,单块的QPS 大约在10万,批量导入 QPS 可以大于30万。通过集训化的部署可以让 Tair 集群的 QPS 达到千万级别,而缓存加数据层的部署,磁盘的单 QPS 通常是在千级别。第二块是当用户登录,需要去尽快的返回到推荐的商品,这样就要求推荐系统和特征存储之间的延时要非常低,特征存储要能够提供很低的读写延时。而 Tair 的平均延时是在200余s,它的99延时也能低于一毫秒。通常内存缓存层的平均延时和Tair 是一致的,也在200余s,当缓存不命中的时候去访问下面的磁盘存储的时候,平均延时就会到一毫秒,而磁盘还会发生抖动,这是由于开始命中或不命中,或者一些磁盘 IO 次数来决定的。磁盘的99延时通常会在十毫秒左右。第三个要求是特征存储的数据量非常大,这就要求要具备很大的容量,同时还要在大容量的前提下面去具备较低的成本。Tair 使用持久内存可以去支持 tb 级别的容量,同时做了很多优化去避免的像 Redis 那样,在大容量下面去复刻,导致卡顿的一些问题。同时它的成本是 Redis 的0.7,如果使用缓存加数据层的架构,数据是有冗余的,因为同一份数据在缓存当中以及在磁盘当中是同时存在的。这就付出了双份的成本。业务还要去考虑到两层架构下面数据一致性的问题,这也带来了额外的开发成本。
特征存储第三个特点是要求数据安全、系统稳定。因为搜推广场景其实和以前直接相关的场景。例如推荐的商品的转换率,包括广告的转换率是直接关系到了营收的,所以要求系统能够保证数据安全并且系统十分的稳定。Tair 使用持久内存,这能够保证数据的实时持久化。当业务写入到 Tair 的时候,首先会在主节点上面去完成持久化,将数据同步到备节点,等待数据同步完成之后,再回复给客户。当一个客户端写入成功以后,在数据组和备上面都完成了持久化。当组和备都异常当机的时候,数据也不会丢失的。第二是 Tair 具备数据闪回功能,因为业务经常发布,这难免会产生一些各种各样的问题,这些业务的问题可能会去对现场的数据去进行污染。举例来说:现在写入了5个k,k1-k5,这是正常的情况。这时候发布了异常的应用,应用对k去做了删除,或者是将k写成的错误的值,这样就污染到了线上的数据,对业务及时产生影响。业务程序本身可以通过快速的回退来达到正常的情况,被污染的数据可以通过 Tair 的数据闪回功能将数据回退到任意实验点去完成,例如回退到应用发布前的状态去完成问题的修复。第三要求特征存储系统本身也要具备很高的稳定性。Tair 是通过代理去屏蔽掉下面的示例中断切换的问题。在实际的生产环境当中难免会需要去做一些扩缩冗或者是遇到机器 down 机需要去做切换的情况,这时 Tair 会去对中断的请求去做自动的重定向,这样对于业务的表现的延时会有增加,但是请求并不会发生错误,这样就增强了线上的稳定。综上而言,使用Tair 去打通各个系统之间的数据流,同时又具备高性能、低延时以及大容量、低成本的特点,也具备数据安全、系统稳定,所以用 Tair 去做搜推广上面的特征存储。
五、Tair 作为特征存储实践
一个搜推广景下面有很多个模块,有一些模块是需要去读写特征数据,例如离线计算模块,Hadoop,实时特征提取模块 flink ,模型训练模块 TensorFlow,实时推进模块 RedisSDK,这些模块都需要使用特征数据,这只需要在这些模块里面去嵌入到SDK 就可以去完成特征数据的读写。Tair 本身是完全兼容 Redis 的,可以直接使用RedisSDK 去连接 Tair Redis SDK,它的生态也十分的丰富,支持非常多的语言,这样不管应用是使用什么语言去开发的,都可以找到对应的 SDK 去连接 Tair,这里以SDK为例去连接 Tair,只需要去依赖接进式的二方包,去创建连接池,去填上Tair 的地址以及密码就能很方便的链接到 Tair。从连接池里去拿连接去执行具体的读取命令,完成之后把连接归还到连接池。简单的几行代码就可以完成对Tair 的读写。如果是使用其他语言的,类似的可以去读写 Tair 。打通了多个模块之间的数据流,在实际部署的情况下面会存在多地域部署的情况。例如一个全国性的电商,会在北京、上海或者深圳等多地去部署了搜推广的服务 。用户能够就近的去接入到推荐服务,能够拿到得到更好的用户体验。每个推荐服务后都是有特征存储系统的。可以去开通 Tair 的全球多活能力,让多个地域之间的特征存储之间的数据去做双向同步,这样,在北京或者是上海还是深圳里面的特征存储的数据都是完全一样的。这样推理服务就不用去关心数据的细节,能够大大简化业务的开发,同时做到异地的多活。
在具体的特征存储的使用当中如何去去提升性能?
特征数据通常是 kv 结构或者 kkv 结构,以 kv 结构为例,会用例如说商品的 id ,用户的 id 加上它的特征数据。
用 set id Feature 或者 get id 的方式就能去完成数据的读写。也可以用用 mset 或者MGET批量接口去一次性读取多个特征或者写入多个特征来达到加速的效果 。对于某些用户的特征非常多,例如说用户的年龄、性别等很多特征,可以用kkv 的结构去存储用户的所有特征。这样的好处是通过 hmset,一个 id 后面带上一系列特征,可以通过一个请求就将一批特征写入到 Tair 中,也可以通过一批特征给读取出来,达到加速的效果。但是在实际的实践当中,要去避免大 key 和热 key 的情况,具体的k 对于具体的k 请求总是会落到具体的 Tair 分片上面的,那如果某 k 的特征有万,或者上百万个,就会导致 Tair 的分辨的容量和流量会得到很大的膨胀,为了避免种情况,就要去避免种超级大的k ,建议的最大的 kkv 的大小不要超过1万,如果已经出现了流量的话,可以在控制台上使用缓存的离线分析去发现异常的大key 或者 key,之后修改应用逻辑来规避问题,另一块是使用特征存储时怎么降低容量,提升性能。例如 kv,k 是商品的描述信息,如果商品描述信息特别长,那么字符串也会特别长,就会让容量得到膨胀,性能就会较低。
如果对整个字符串去做 hash,将 hash 作为 k 存入,就会显著的降低容量,从而提升性能。另一块是特征数据,有的特征数据非常短,不需要压缩,例如:数字或简单字符串,有的特征特别复杂,例如:json 的对象或结构体等,对于大的特征数据,要对特征做压缩,snnap、Gzip 等各种压缩算法都对数据进行压缩,压缩之后存储到 Tair 里,最终会显著的去降低容量,提升性能。
第三是快速导入离线特征。离线特征需要定期导入到 Tair 中,快速的导入离线特征有很多方法,例如:使用 Pipeline 快速导入数据和使用 HashTag 或将 Key 分类来快速导入。
使用 Pipeline 快速导入数据。在读写 Tair 时使用 pipe,同时 set 100个 kv,最后全部发送。这样就会显著加速延时。 使用 HashTag 或将 Key 分类来快速导入
在 MSET epkv 时,代理程序会对 MSET 做拆分,因为 MSET 里面的k可能属于不同的 Tair 分片,代理必须要做拆分。这样就涉及到损耗问题,所以要去避免代理去做拆分。可以通过 HashTag 保证 MSET 里的 k 都是属于同一分片,或者提前对 k 做CRC16的计算。在 MSET 里使用的k 全部都是在同一 Slot 里的,通过 HashTag 或预计算 Slot,可以保证 MSET 里的所有k都是在同一 Tair 分片,这样就避免的代理的拆分,从而达到加速的效果。通过以上两个方式可以快速把离线的特征数据导入到Tair 里。接下来是在实际场景下面如何保证高可靠实践。这里最重要的是客户端的最佳时间。建议第一是使用连接池,同时要具备断线重连逻辑。因为 reduce 在异常时会做重搭,但客户端必须要做重点的操作才能达到恢复的效果。第二是设置合理的连接池大小以及合理的超时时间。如果超时时间设置得太长,就会导致业务故障持续的时间久。第三个是订阅告警。主要是要订阅 QBS、容量、延迟方面的告警,这样就可以及时发现水位不足的问题。第四个是监控查看。在业务发布后,要观察水位的变化情况。因为业务的逻辑会发生变化,从而导致 QBS 或者容量的膨胀,所以要及时去观察监控进而发现风险。第五个是扩缩容。在大促期间要去预估业务的峰值,然后提前去扩容 Tair 来避免峰值期间水位不够的问题。不要在出现问题以后再去扩容 Tair 。第六个是数据闪回。如果业务在发布的时候出现了问题,例如线上数据被污染,通过控制台上的数据闪回功能,就能将数据恢复到之前的稳定的情况。最后是自运维。Tair 是可以自运维,数据自动持久化,故障自动恢复。