做者:闲鱼技术-长玖前端
闲鱼目前已是国内最大的闲置物品交易平台。随着闲鱼体量的增加和用户规模不断扩大,闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片,天天均可能被数以千万计的人看到。算法
为了更好地服务好广大的用户群体,更加个性化的内容推荐和更加精细化的素材投放就显得尤其必要了。今天咱们来聊一聊如何设计一个能够精准触达用户、运营快速试错、解放开发生产力的投放系统。npm
投放是什么?举例来讲,往城市广场的一块广告牌上在不一样时段不一样场景下更换广告画就是一种投放,固然互联网技术带来了人的维度,不一样用户看到的广告画可能也是不同的。咱们来看下这样一个系统应该包含哪些功能。json
一、咱们把“城市广场上的那块广告牌”叫资源位,那么须要一个服务端接口来获取须要透出的素材。
二、不一样资源位须要透出的素材格式多是不同的,多是banner,多是feeds,多是运营自定义的手填数据,多是任何合理的数据结构。
三、同一个资源位,不一样时段,针对不一样平台、不一样人群,透出的素材多是不同的,那么就须要有一个服务来在一堆素材中筛选出适合资源位的内容。在资源位命中了多个素材的时候,还须要有一些机制来裁决出最终透出的那一个。后端
咱们设计的投放系统扮演的是前端实体资源位和后端多种数据源之间的桥梁的角色。它负责从各个业务数据源中根据必定规则筛选出在特定资源位上须要透出的数据,基本的数据流以下图所示:服务器
所谓资源位,在咱们这个体系内,是指前端页面上的实体坑位。是技术同窗在产品开发中建立的。理所固然,资源位须要消费的数据结构是在开发阶段就肯定了,好比banner、feeds或者结构很是灵活的手填数据等。数据结构
在咱们这个体系里,咱们用一个 schema 描述资源位须要消费的数据结构。并发
这个 schema 是用 json 描述的。技术同窗在前端页面上开发实体资源位后,须要在咱们的系统中建立对应的虚拟资源位,并经过一个图形化的 json schema 编辑器来定义这个资源位须要消费的数据结构编辑器
上述 schema 定义了一个资源位所须要消费的数据的格式。可是光有 schema 是不够的,由于资源位要消费的数据,而不是数据结构自己。在咱们的系统中,咱们用一个动态表单模块根据schema生成动态的表单,产品运营同窗经过动态表单生产的数据,咱们称之为投放物料。资源位消费的就是投放物料。性能
对于一些手填数据,表单直接产生的数据就是资源位可用的了。可是对于 Feeds 之类的,表单每每只能定义 Feeds 的一些诸如选品等特征字段。对于这类特殊类型的数据源,服务端就不能简单的直接返回数据了,须要根据这些特征字段,作一些数据查询和数据解析工做,再返回给前端一个完整规范的数据。
前述文章说到,同一个banner,可能对新用户投放的是红包,对年轻男孩子投放的是手机数码内容,对年轻女孩子投放的是美妆服饰。咱们把这个链接了资源位、投放物料与多个投放因子的桥梁叫作投放单元。
那么投放单元须要有多少个投放因子呢?实际上是视业务而定的,咱们认为基础的投放由于应该包含 投放时段、投放人群、投放平台、投放AB配置等。
当资源位向投放系统发起请求拉取数据时,投放系统在这个资源位上挂载的全部投放单元中根据投放因子筛选出命中的投放单元,最后将命中的投放单元上挂载的投放物料返回给前端的投放资源位。当命中了多个投放单元时,须要有些方法来裁决出最终胜出的那一个。这个方法简单点作,能够在投放单元中配一个权重,筛选时最后选择权重高的那个,也能够引入算法决策,根据投放的 ctr 数据作排序。
投放计划是产品运营对多个资源位管理形式。简单来讲,一个投放计划下,能够挂载多个关联的资源位。试想一下,一次大促活动可能涉及到几十个资源位的投放,将这些资源位组织到同一个投放计划中进行管理,能够更加方便操做以及查看投放效果。
对于前端来讲,咱们但愿经过提供一个封装的npm包,经过简单调用,传入resourceId(资源位ID) 便可获取数据。
这种调用方式对业务调用方来讲是比较优雅的,可是对页面性能来讲倒是不省心的。由于一个页面每每由不少个资源位组成,每一个资源位单独发起请求就会造成大量的并发请求,不只页面性能会下降,还会对服务器产生比较大的qps压力。
针对这种状况,咱们作了一个小优化。服务端提供一个批量查询的接口,前端SDK内部,每10ms 对模块的请求调用作一次聚合,将单个资源位的数据获取转化成批量的查询。负面影响是对部分资源位的数据加载形成最大10ms的延时,优势是提高了页面总体的性能,有效减少了服务端QPS压力。
上述投放系统在咱们的拉新业务实践中run得很是好,已为闲鱼应用内的数百个资源位提供投放能力支持,天天服务数以千万记的闲鱼用户。既实现了资源位的精细化投放,提升了单个资源位的利用率,又赋能运营更自由地进行各类拉新投放实验,减少试错成本,还减小了技术同窗频繁参与运营实验改造的开发工做量,解放了技术同窗的生产力。
上述文章介绍了一个简易的投放系统的设计思路,本质上是一个链接前端实体资源位和服务端多种数据源的桥梁的设计。
其中有不少能力是依赖了团队内部其它同窗努力的成果,好比:
一、描述资源位数据结构的 json schema如何设计
二、根据json schema动态生成的表单怎么实现
三、人群校验的服务和能力
四、AB测试的能力
五、feeds 的选品服务
四、个性化动态banner能力
还有不少能够优化的点,好比数据回流如何作得更好,怎样引入算法能力对策略筛选进行优化。。。持续优化、持续为业务创造价值是咱们一直坚持努力的方向。
原文连接
本文为云栖社区原创内容,未经容许不得转载。