欢迎您关注《大数据成神之路》
微博(Weibo)是一种通过关注机制分享简短实时信息的广播式社交网络平台。微博用户通过关注来订阅内容,在这种场景下,推荐系统可以很好地和订阅分发体系进行融合,相互促进。微博两个核心基础点:一是用户关系构建,二是内容传播,微博推荐一直致力于优化这两点,促进微博发展。如图 1 所示:
图 1 微博推荐的使命
在微博推荐发展的过程中遇到体系方向的变化、业务的不断更迭、目标的重新树立,其产品思路、架构以及算法也随之进行变迁。本文主要阐述在这个过程中推荐架构的演进,从产品目标、算法需求以及技术发展等维度为读者呈现一个完整的发展脉络,同时也希望通过这个机会跟大家一起探讨业务与技术的相互关系。
为了便于理解微博推荐架构演进,在介绍之前需要陈述一下微博推荐在流程上的构成,其实这个和微博本身没有关系,理论上业内推荐所存在的流程基本都是相同的。如图 2 所示,推荐是为了解决用户与 item 之间的关系,将用户感兴趣的 item 推荐给他/她。那么,一个 item 被推荐出来会经过候选、排序、策略、展示、反馈到评估再改变候选等等形成一个完整的回路。
图 2 推荐的链路
在上述整体流程的基础上,微博推荐架构经历了如图 3 所示的三个阶段:
通常架构的产生都会来自于团队和业务环境,源于环境因素而致力于解决环境中的问题,架构形成会带着较为强烈的特点,在其实施中会产生交给针对性的效果。本文将从环境因素、架构组成与特点以及实施效果这三个方面进行阐述微博推荐的三个阶段。
影响架构形成的环境因素可以分为内部环境因素以及外部环境因素。内部因素主要是团队及其成员相关内容,而外部因素主要来自于外部门、整个公司或者整个行业领域。
微博推荐 1.0 的这段时间是从 2011 年 7 月份到 2013 年 2 月份左右,其主要的目标就是实现当前的业务需求。对于独立式的解释:每一个业务项目都是一套完整架构流程,架构之间相对独立,甚至包括技术栈。之所以称之为独立式其内部因素有几点:
当然起决定性因素的还是外部环境,是因为内部原因还是比较好协调和进化的。当时的外部环境因素包括:
由于上述的那些原因,通常我们面对一个接一个的项目时,都会根据自己的理解使用熟悉的技术栈来搭建流程,这样形成了一个又一个的独立架构。
上节中提到了独立架构形成的原因,大家可能觉得架构组成没有必要去描述了,这是不对的,事实上后来的分层以及平台架构的基础恰恰都来源于这个阶段,没有这个阶段团队不断踩坑总结就没有因地制宜产生的后续进化。因此,我们需要为大家剖析一下推荐 1.0 的架构组成与特点。
1) 技术目标
参考图 2 所示,以业务实现为主要目标的微博推荐 1.0,没有建立起完整的反馈以及评估体系,同时排序也是被策略取代,那么讲主要的重点体现到了候选、策略以及展现上。上述推荐流程被转化为:候选à策略à展现简单形态。
2) 架构组成
如图 4 所示,我们试图将每个项目的架构能够在图中表达出来,在真正的实施过程中,每一个项目负责人会选择使用 apache+mod_python 作为服务架构同时,使用 redis 作为存储选型。在一些特定的项目中,引入了复杂运算从而诞生了 c/c++ 的服务框架 woo;同时,对于数据的存储要求特型化的项目中又自己研发了一系列的 db,比如早期存储静态数据的 mapdb,存储 key-list 的 keylistdb 等等。当然,在部署中会比下图更加随意一些,一个项目几台服务器部署好微博服务提供 http 请求,然后再找几个服务器安装 redis 作为数据支撑,来源数据和业务方定好规则使用 rsync 传输就 OK 了,大部分策略在 python 中实现。
图中可以看到主要的技术栈:
图 4 微博推荐 1.0 架构简图
3) 架构特点 将架构特点划分为优点和缺点进行描述。那么优点是:
而不足是:
尽管存在诸多的缺点,但是在其发展的过程中,也给后面的架构优化奠定了基础,其成果如下:
上一节介绍完独立的 1.0,按照架构发展的道路,我们到了分叉路口,一边是流行的 LAMP 架构,另一边是符合广告、搜索的 CELL 架构。LAMP 架构数据策略分离,脚本语言作为业务开发主要语言,项目快速开发和迭代的首选。CELL 结构强调本地流程处理,数据与业务耦合性强,自研的服务以及数据库较多出现,适用于高性能效果型产品。最终我们选择兼容两者,倾向于业务的架构体系。为何如此呢?让我们再来看看当时的环境。
微博推荐 2.0 的时间段是 2013 年 3 月份到 2014 年年底,这段时间内部环境因素是:
1) 当前团队成员合作已经很长时间,彼此相互熟悉,同时对于技术选型有了一定的共识。
2) 团队产品进行了聚焦,针对内容/用户/垂直类三类推荐进行了整理,同时对于场景分别进行了重点划分:feed 流内、正文页以及 PC 首页右侧。这种聚焦有利于进行架构统一,同时也为技术争取了时间。
而外部因素是:
1) 公司对于推荐有了比较明确的定位,提高关系达成以及内容传播效率,同时为推荐型广告打好技术探索、场景介入以及用户体验的基础。
2) 推荐领域里,各个公司都纷纷有了对于架构的产出,对于微博推荐有了很好的指导意义。
团队在执行核心业务实现的时候,不断演进工具以及框架,构建 2.0 的目标呼之欲出。 1) 技术目标
与 1.0 不同,仅仅实现业务需求已经不是 2.0 的技术目标了,针对完整的推荐流程,我们需要解决:
2) 架构组成 微博推荐 2.0 的架构如图 5 所示,它不再是一个个独立的系统,也不是会让开发人员使用不同的技术解决相似的问题。这个架构图主要包括几个部分的内容:
图 5 微博推荐 2.0 架构示意图
图 6 基础服务系统的 UI
3) 特点
优点是:
而不足是:
微博推荐 2.0 的诞生产生很好的收益,其成果如下:
1) 微博推荐的核心业务均在该体系下完成:正文页推荐、趋势用户推荐、趋势内容推荐、各个场景下的用户推荐、粉丝经济的粉条、账号推荐等等产品
2) 诞生了 lab_common_so 的基础框架,并进行了开源
3) 诞生了静态存储集群解决方案 lushan,并进行了开源
4) RUF 框架的诞生极大提升了业务生产效率,同时也为 openresty 社区做出一定贡献
上节中描述 2.0 的时候提到了一个重要不足是“和推荐核心有一定的距离,并没有完全为推荐量身定做”,我们希望能够在推荐 3.0 中解决它,这个不足会带来什么问题,以及为何在已经满足业务需求的同时推荐的架构再次往前发展呢?那么接下来为各位展现微博推荐平台式的 3.0 设计,我们还是先看看所处的环境。
微博推荐 3.0 的时间段是 2014 年底至今,当前的内部环境因素是:
1) 推荐产品不在扩张,对效果更为看重,将工作重点从业务开发和迭代转化为以效果为目标的技术迭代。
2) 新项目或者迭代推荐业务的时候发现重复的事情很多,而架构没有解决,工作存在冗余。
而外部因素是:
1) 公司也从业务扩展转变为效率为先,提升用户体验以及内容质量上来。
2) 微博推荐在推荐技术环节距离领域内有一定距离,当下有条件进行追赶。
当前的环境也能体现出 3.0 的技术目标:
1) 技术目标
与 2.0 不同,全覆盖推荐流程已经不是 3.0 的目标,其目标是:
2) 架构组成
如图 7 所示,是微博推荐 3.0 的架构,也是当前实行的架构体系,大家其实可以发现,这是基于 2.0 发展起来的,既然还保留了大量 2.0 中使用的分层体系以及工具框架。在这里重点描述几个差异:
图 7 微博推荐 3.0 的架构示意图
3) 特点 主要描述其优势:
微博推荐 3.0 的诞生,其成果如下:
1) 微博推荐的核心业务会逐步迁移到该体系下,以算法数据作为驱动,提升效果
2) 诞生了 EROS 的训练流程,提出了训练的标准方法
3) 针对推荐设定了标准的输入输出方法
4) 针对候选,产生了具有抽象意义的推荐方法集合
上文中对微博推荐架构演进做了较为详实的介绍,在这个演进的过程团队以及个人收益很大,技术与业务的关系在架构中得到了很好的体现。有几点可以跟大家分享的是:
1) 技术来源于业务同时提升业务发展,业务发展又反过来推动技术的前进,他们是一个相互影响相互促进的关系。和业务共同发展的技术才是有生命力的。
2) 技术架构的选型建议是寻找当前最短路径,然后进行不断优化迭代,一口气吃撑是不现实的,也是不合理的。
3) 推广某个框架和工具最好的方式不是行政命令也不是请客吃饭,而是的大家都是参与者,如同开源项目,每个人都是它的主人,这样人人维护,人人使用。
4) 团队崇尚简单可依靠,它说起来容易做起来难,不过有一个好方法就是懂得自己不应该做什么,而不是应该做什么。
5) 说到推荐这个特殊领域上来,设定目标,跟踪目标很重要,把数据和目标摆出来,产品、架构以及算法都会想办法去解决的。
— THE END —