马赫是闲鱼的选品和投放系统,闲鱼业务中多数商品都是孤品即单库存商品,所以商品的实时变更需要即刻反馈到选品和投放链路中,为了满足业务诉求马赫设计之初就把实时性作为最重要的技术目标,随着系统的运行数据的膨胀实时性也遇到了瓶颈,本文将介绍近一年来在提升马赫实时性上的相关工作,目标是选品实时性延迟控制在秒级别。如果有对马赫不了解的同学可以回顾公众号内马赫相关文章。

选投实时链路

马赫整个选品和投放的过程中数据流转如下图所示主要分为三个部分,第一部分是选品数据接入,数据是马赫选品的根本,数据的实时是整个马赫流程能有效运转的基础。第二部分是选品规则计算,规则计算是马赫的核心,计算的实时性保证了马赫能把选品结果同步到各个下游节点。第三部分是商品投放,商品投放是与用户距离最近的部分,实时的反馈能给用户带来更好的体验。

马赫实时性性能优化也是从这三部分入手,下面将针优化过程进行详细介绍。

选品数据实时性能优化

马赫选品依赖的选品宽表数据,主要由两类数据构成,一类是商品基础数据,商品基础数据指用户发布的商品信息包括:商品类型、商品状态、商品价格、商品描述、商品图片;该类数据通过订阅商品数据库的变更已经实现了实时性。另外一类是基于商品衍生出的统计和预测数据,这类的数据一般都是通过ODPS(阿里内部离线计算平台)离线计算,产出时间与商品基础相比大多是天级别或小时级别延迟,该类数据原有的接入方案如下,无论是小时级别延迟还是天级别延迟产出的数据,都是进行统一的处理,每天把所有的数据JOIN到一起后输出到一个离线数据表中,然后把该数据通过BLINK 和 MetaQ消息通道与马赫的数据统一接入层对接。该方案的优点是所有的离线产出数据只需要处理一次方便运维,同时每天一次回流整个过程的数据量可控。缺点也是显而易见,首先每天汇总数据产出时间取决于上游耗时最长的数据,如果有数据延迟将会影响整个流程的耗时,其次明明是H+1产出的数据却要等到T+1才可使用,这严重影响了选品能力。

问题已经明确那剩下来的就是解法,首先要解决的汇总数据依赖上游最长耗时的问题,常规的解法是汇总数据定时产出,到了定时时间,上游各个节点数据已经产出那么就使用,如果没有产出就使用上一次产出的数据,最初解决时也确实采用了该方案,该方案会造成部分数据要T+2才可以进入选品宽表。虽然不是很好的解法但是解法简单,作为过渡方案在马赫里面也运行了一段时间。下面介绍这个问题马赫采用的最终解法,如下图所示:

首先把数据按照产出周期进行分类,H+1产出的数据量级在万,T+1产出的数据量级在亿,对于H+1的数据直接利用BLINK读取后,利用MetaQ数据通道输出到数据统一接入层,保证了数据产出即用。对于T+1的数据同样直接利用BLINK读取,由于该部分数据过大,如果直接输出QPS将会达到百万级别对于下游压力过大,所以马赫利用BLINK的滑动窗口的聚合能力,把商品ID作为KEY对窗口内的数据进行聚合,聚合后再输出到马赫数据统一接入层。滑动窗口越小那么实时性将会越高,但是同样系统压力也会越大,目前马赫的滑动窗口时间为6个小时。该方案解决了商品算法和统计数据接入实时性的问题,但整个系统流量增加了4倍,这也是设计系统时候常常纠结的时间成本与空间成本的权衡问题,在本次优化中选择了用空间换时间并有节制的控制了两个的平衡,优化后效果从天级别延迟缩短至小时级别。

选品规则计算实时性优化

选品规则计算包含两个部分一部分是运营创建选品规则时在马赫选品宽表中运算选并产出结果集称为离线选品规则执行引擎,另一部分是当商品信息变更时需要重新计算当前商品命中的选品规则称为在线选品规则执行引擎。

首先介绍第一部分离线选品规则执行引擎的优化,运营创建的选品规则会映射成SQL在马赫选品宽表ADB上进行执行,ADB是全索引数据表这里主要是用空间去换时间,但是有一类问题很难解决就是文本的全字段匹配,举一个例子选品宽表中有个从商品基本数据表中映射字段ATTRIBUTE,从名字就不难看出该字段是当时商品设计中预留出的扩展字段,其内容以kv对分号分隔的形式进行存储,运营在进行选品时最终映射到该字段的规则SQL是用LIKE关键字进行在十几亿的数据中检索在其性能可想而知。所以针对该类字段做了多值映射即把kv对映射成数字进行存储,该方案虽然不复杂但是解决了创建规则时商品量计算以及商品预览的时效性问题不做过多赘述,优化后商品计算从6分钟级别降至30秒,具体效果如下:

下面介绍第二部分在线规则执行引擎的优化,在线引擎是在BLINK中实现的,商品的变更信息作为输入源,在执行引擎中计算出当前商品命中的商品池,把商品和对应命中的商品池作为结果输出到下游。原有的流程如下所示:

在BLINK中主要完成了马赫关键的MERGE 和 DIFF操作,MERGE是把BLINK内存中的数据与输入进来的数据取字段上的最大的更新时间戳为最新数据把商品信息整合。然后把整合后的数据在所有的选品规则上运行,运行结果与上一次结果做对比,筛选出两次结果不同的数据作为结果输出这步操作称为DIFF。这样做的好处是内存存储商品最新数据减少读取的IO减少时间消耗,同时输出结果时只输出DIFF,减少数据量的传输再次节省时间。该方案也有着明显的弊端整个数据都在内存中存储,如果发生不可预期的异常内存中的数据将会丢失,从系统开始运行到优化前从没有停机过,其中付出的运维成本可想而知,同时不可停机导致系统无法升级和使用新版本的BLINK能力。下面针对不可停机问题进行如下解法:

在BLINK接受到商品信息时首先从本地拉取数据,如果拉取不到则从商品信息库中读取对应数据,在结果输出时在输出原有的信息同时增加输出商品信息与全量的规则命中信息,作为备份存储方便停机恢复,其中为了减少存储空间和数据的IO在传输和存储过程中对数据都进行了压缩处理。最终方案整个逻辑不是很复杂,复杂的是如何从原有的方案平滑切换到现在的方案,其中涉及到数据同步、数据转换、数据校对,这里面踩了不少坑,该部分不是本文的重点就不赘述了。最终在解决不可停机的问题同时也升级了BLINK版本,升级后数据延迟从原有的2分钟降低至2秒,让整个在线规则引擎运行更快更平稳。

商品投放的实时优化

商品投放是与用户侧距离最近的能力,运营圈选商品后形成商品池,然后利用商品池搭建页面投放给用户,在用户请求时把商品从商品池中召回然后展现给用户,具体流程如下图所示。

在这个过程中与马赫发生深层关系的是在召回的部分,目前马赫支持搜索召回和算法召回两种召回方式,搜索召回中把商品池的实时变更同步给搜索引擎做增量的迭代,天然支持实时召回的能力只需要保证增量的稳定即可;算法召回利用的是用户属性召回相关商品,用户和商品的关系是T+1产出,这与马赫场景中强调的实时性相悖,为了解决算法召回的实时性问题,马赫做出如下解法:

首先我们看一下召回流程:当接受到一个用户请求,我们会得到两个信息一个是用户的ID和商品池的ID,首先利用用户ID查询用户与商品关系表进行个性化召回,然后利用商品池的ID查询选品池与商品关系数据表进行通用性召回,最后把两部分数据进行去重合并这里统称为个性召回,召回后的数据JOIN商品与商品池关系表,只保留符合该商品池ID下的商品这里称为召回过滤,如果此时商品数量满足召回要求则返回,如果不满足召回要求则查询商品池与商品关系数据表召回的兜底数据这里统称为兜底召回,通过召回流程后再经过RANK和信息补充就把数据呈现给用户了。

上面流程中提到多个数据表,那么这些数据表是如何产出又为什么这么设计下面详细介绍。首先介绍在个性召回中使用的BE用户和商品关系数据表的产出逻辑,这部分数据不依赖马赫的任何信息,仅仅是通过用户在闲鱼的点击浏览等用户偏好行为对用户喜欢的商品进行预测,每个用户相关商品规模在2000个是T+1产出。然后介绍个性召回中使用的BE选品池和商品关系数据,这部分数据是依赖马赫离线引擎同步产出的,这里的产出逻辑是首先根据各项指标对选品池中的商品进行排序,排序后保留前5000个作为通用召回是T+1产出,使用依赖这两个表完成了个性召回步骤。然后是召回过滤中BE商品与选品池关系数据,这部分数据是利用在线同步引擎实时更新的,之所以设计这步召回过滤是为了防止个性召回的T+1的商品,当前已经不在商品池中了。所以理所当然的就有了召回兜底逻辑,该部分数据是由马赫的同步引擎保证实时更新存储在IGRAPH中,可以用商品池的ID召回当前池子中最新的2000个商品作为兜底。通过以上的逻辑保证了用户在算法进行召回时的实时性。

总结

本文从马赫选品到马赫投放实时性优化做了全面的介绍,每一步优化呈现的都是最终方案,为了保证系统的平滑过渡优化中中踩了很多坑不过最终都平稳落地,优化后的马赫从选品到投放整个实时链路时延有一个质的变化,选品数据从T+1变为H+1,选品流程从6分钟变为30秒,投放流程从2分钟变为2秒,系统更健壮也更实时,从整体功能看马赫还是属于一个工具级别系统,还远没有达到产品级别系统级。

如上图所示,未来会把重点放在选品能力与整体运维能力上,在优化原有系统的同时增加新的能力,逐步把马赫打造成产品化系统。

闲鱼商品选投实时性优化相关推荐

  1. 闲鱼商品理解和选品,究竟是怎么做的?

    简介:为了更懂你,我们始终在努力 闲鱼技术-仝辉 背景   闲鱼在这几年的高速发展中,积累了几亿件在线商品,而这些商品稂莠不齐,可能会带来买家不好的购物体验.因此,我们希望引入闲鱼商品理解的能力,选取 ...

  2. 系列文章|闲鱼商品理解之精品库建设

    现状 闲鱼是一个基于C2C场景的闲置交易平台,每个用户既是买家也是卖家,并随着这些年的高速发展,一方面闲鱼的商品越来越丰富,在自由享受交易乐趣的同时也存在商品良莠不齐的问题,另一方面这些年闲鱼一直在深 ...

  3. 69.深度解密网络项目七:利用闲鱼进行互联网有效果性创业的整体操作步骤

    网络营销推广技术.技巧深度解密(网络项目七)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解关于利用闲鱼进行创业的网络项目. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. ...

  4. 闲鱼商品详情抓取系统开发/测试完毕,可自动采集闲鱼商品详情信息

    原来开发的闲鱼工具,一直采集的是闲鱼的搜索列表页,在采集字段上浅显地使用基本没有问题,但对于浏览量.收藏.用户销售量.以及一些用于智能判断商品质量.用户是否涉嫌造假的字段数据上,并没有采集到,因为这些 ...

  5. 谈谈Linux内核的实时性优化

    1.实时系统的概念 1.1什么是实时操作系统 什么是实时操作系统?接触过嵌入式的小伙伴可能会知道,实时操作系统是指在嵌入式领域广泛应用的各类RTOS(Real Time Operating Syste ...

  6. 浅谈Linux内核的实时性优化

    实时系统的概念 1.1什么是实时操作系统 什么是实时操作系统?接触过嵌入式的小伙伴可能会知道,实时操作系统是指在嵌入式领域广泛应用的各类RTOS(Real Time Operating System) ...

  7. java爬取闲鱼商品信息(三)

    这一篇距离前两篇更新的时间有点久了,最近忙着刷题- -. 好了,上次说到没办法获取到动态加载的部分. 我用了phantomjs尝试了一下,多获取到的部分是复杂的js代码,代码量太大了,没找到我们需要的 ...

  8. java爬取闲鱼商品信息(三)_java爬取闲鱼商品信息(三)

    这一篇距离前两篇更新的时间有点久了,最近忙着刷题- -.又笔试了两轮猪厂一轮鹅厂,结果还没出来,不过感觉都凉了. 好了,上次说到没办法获取到动态加载的部分. 我用了phantomjs尝试了一下,多获取 ...

  9. java爬取闲鱼商品信息(一)

    闲鱼真是一个很神奇的地方,= =能让我等学生狗不用花很多钱就能体验科技的乐趣,当然,前提是别翻车. 好了,这当然是题外话,这阵子总结了自己学习的一些技能,就写一个对闲鱼的数据抓取来练练手. 预计达到的 ...

  10. 闲鱼java系统_java爬取闲鱼商品信息(一)

    闲鱼真是一个很神奇的地方,= =能让我等学生狗不用花很多钱就能体验科技的乐趣,当然,前提是别翻车. 好了,这当然是题外话,这阵子总结了自己学习的一些技能,就写一个对闲鱼的数据抓取来练练手. 预计达到的 ...

最新文章

  1. Velocity的中文问题
  2. BU_DATE_CHAR abap screen 日期字段搜索帮助
  3. PHP 设计模式之原型模式
  4. php函数scandir_PHP函数glob:扫描目录文件更好的方式
  5. Nvidia Jetson TX2+Intel Realsense D435i跑ORB_SLAM3
  6. MTK 驱动---(8)emmc 介绍
  7. 机器学习常见的六大错误
  8. sql注入------基于时间延迟benchmark函数注入脚本
  9. 图像处理农业应用sci_SCI/SSCI期刊征稿信息3月8日更新
  10. 兔子吃萝卜java游戏下载_巴迪兔子吃萝卜
  11. pta计算个人所得税
  12. 高薪职业,英年早秃?关于程序员,多的是你不知道的事……
  13. 华为H5快游戏如何接入广告服务
  14. 身份证号码含义及最后一位校验算法(ISO 7064:1983.MOD 11-2)
  15. App一键切换url环境、一键打包__Android拓展篇(Java)
  16. 关于app运营的这几个考核指标你不能不了解!
  17. 开源OA协同办公搭建教程:使用认证鉴权对服务访问进行限制(invoke)
  18. 容联云AI科学院研发先进KBQA能力,问鼎大规模中文知识图谱问答权威性测评
  19. 注册地址从零开始学建站-域名篇
  20. oracle闪回区满了,一次快速闪回区满导致数据库不能启动的解决过程

热门文章

  1. 【NLP】Seq2Seq与Attention(Neural Machine Translation by Jointly Learning to Align and Translate)回顾
  2. 学习推荐!吴恩达 AI 课程及学习路线最全梳理
  3. 电脑出问题解决办法(Win7)
  4. springboot疫情防控下基于微信小程序的食堂订餐系统毕业设计源码261620
  5. 如何从0搭建公司后端技术栈?
  6. 读书笔记11 《蔡康永的说话之道2》 蔡康永
  7. ajax php 源码,ThinkPHP Ajax 实例源代码_ThinkPHP教程
  8. php 5.0入门系列教程 pdf,thinkphp5.0基础视频教程
  9. codeforces GYM 101431B (后缀数据结构)
  10. 用鲁棒学习提升无监督图像聚类