揭秘!闲鱼拉新投放系统如何设计

简介: 短!平!快!准!狠!

作者:闲鱼技术-长玖

背景

闲鱼目前已经是国内最大的闲置物品交易平台。随着闲鱼体量的增长和用户规模不断扩大,闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片,每天都可能被数以千万计的人看到。

为了更好地服务好广大的用户群体,更加个性化的内容推荐和更加精细化的素材投放就显得尤为必要了。今天我们来聊一聊如何设计一个可以精准触达用户、运营快速试错、解放开发生产力的投放系统。

思路分析

投放是什么?举例来说,往城市广场的一块广告牌上在不同时段不同场景下更换广告画就是一种投放,当然互联网技术带来了人的维度,不同用户看到的广告画可能也是不一样的。我们来看下这样一个系统应该包含哪些功能。

1、我们把“城市广场上的那块广告牌”叫资源位,那么需要一个服务端接口来获取需要透出的素材。
2、不同资源位需要透出的素材格式可能是不一样的,可能是banner,可能是feeds,可能是运营自定义的手填数据,可能是任何合理的数据结构。
3、同一个资源位,不同时段,针对不同平台、不同人群,透出的素材可能是不一样的,那么就需要有一个服务来在一堆素材中筛选出适合资源位的内容。在资源位命中了多个素材的时候,还需要有一些机制来裁决出最终透出的那一个。

详细设计

我们设计的投放系统扮演的是前端实体资源位和后端多种数据源之间的桥梁的角色。它负责从各个业务数据源中根据一定规则筛选出在特定资源位上需要透出的数据,基本的数据流如下图所示:

undefined

资源位

所谓资源位,在我们这个体系内,是指前端页面上的实体坑位。是技术同学在产品开发中创建的。理所当然,资源位需要消费的数据结构是在开发阶段就确定了,比如banner、feeds或者结构非常灵活的手填数据等。

在我们这个体系里,我们用一个 schema 描述资源位需要消费的数据结构。

undefined

这个 schema 是用 json 描述的。技术同学在前端页面上开发实体资源位后,需要在我们的系统中创建对应的虚拟资源位,并通过一个图形化的 json schema 编辑器来定义这个资源位需要消费的数据结构

undefined

投放物料

上述 schema 定义了一个资源位所需要消费的数据的格式。但是光有 schema 是不够的,因为资源位要消费的数据,而不是数据结构本身。在我们的系统中,我们用一个动态表单模块根据schema生成动态的表单,产品运营同学通过动态表单生产的数据,我们称之为投放物料。资源位消费的就是投放物料。

对于一些手填数据,表单直接产生的数据就是资源位可用的了。但是对于 Feeds 之类的,表单往往只能定义 Feeds 的一些诸如选品等特征字段。对于这类特殊类型的数据源,服务端就不能简单的直接返回数据了,需要根据这些特征字段,做一些数据查询和数据解析工作,再返回给前端一个完整规范的数据。

undefined

投放单元

前述文章说到,同一个banner,可能对新用户投放的是红包,对年轻男孩子投放的是手机数码内容,对年轻女孩子投放的是美妆服饰。我们把这个连接了资源位、投放物料与多个投放因子的桥梁叫做投放单元。

那么投放单元需要有多少个投放因子呢?其实是视业务而定的,我们认为基础的投放因为应该包含 投放时段、投放人群、投放平台、投放AB配置等。

当资源位向投放系统发起请求拉取数据时,投放系统在这个资源位上挂载的所有投放单元中根据投放因子筛选出命中的投放单元,最后将命中的投放单元上挂载的投放物料返回给前端的投放资源位。当命中了多个投放单元时,需要有些方法来裁决出最终胜出的那一个。这个方法简单点做,可以在投放单元中配一个权重,筛选时最后选择权重高的那个,也可以引入算法决策,根据投放的 ctr 数据做排序。

undefined

投放计划

投放计划是产品运营对多个资源位管理形式。简单来说,一个投放计划下,可以挂载多个关联的资源位。试想一下,一次大促活动可能涉及到几十个资源位的投放,将这些资源位组织到同一个投放计划中进行管理,可以更加方便操作以及查看投放效果。

端侧接入

对于前端来说,我们希望通过提供一个封装的npm包,通过简单调用,传入resourceId(资源位ID) 即可获取数据。

undefined

这种调用方式对业务调用方来说是比较优雅的,但是对页面性能来说却是不省心的。因为一个页面往往由很多个资源位组成,每个资源位单独发起请求就会形成大量的并发请求,不仅页面性能会降低,还会对服务器产生比较大的qps压力。

针对这种情况,我们做了一个小优化。服务端提供一个批量查询的接口,前端SDK内部,每10ms 对模块的请求调用做一次聚合,将单个资源位的数据获取转化成批量的查询。负面影响是对部分资源位的数据加载造成最大10ms的延时,优点是提升了页面整体的性能,有效减小了服务端QPS压力。

undefined

效果

上述投放系统在我们的拉新业务实践中run得非常好,已为闲鱼应用内的数百个资源位提供投放能力支持,每天服务数以千万记的闲鱼用户。既实现了资源位的精细化投放,提高了单个资源位的利用率,又赋能运营更自由地进行各种拉新投放实验,减小试错成本,还减少了技术同学频繁参与运营实验改造的开发工作量,解放了技术同学的生产力。

总结

上述文章介绍了一个简易的投放系统的设计思路,本质上是一个连接前端实体资源位和服务端多种数据源的桥梁的设计。

其中有很多能力是依赖了团队内部其它同学努力的成果,比如:
1、描述资源位数据结构的 json schema如何设计
2、根据json schema动态生成的表单怎么实现
3、人群校验的服务和能力
4、AB测试的能力
5、feeds 的选品服务
4、个性化动态banner能力

还有很多可以优化的点,比如数据回流如何做得更好,怎样引入算法能力对策略筛选进行优化。。。持续优化、持续为业务创造价值是我们一直坚持努力的方向。

想要了解更多细节,就请关注闲鱼技术公众号吧。青山不改,绿水长流~

相关文章
|
7月前
|
存储 移动开发 前端开发
线上直播拍卖APP源码,开发实现竞拍模式的逻辑和技术
探讨"东莞梦幻网络科技"在线拍卖软件源码的实时竞拍功能以及为这一拍卖模式提供技术支持,以下是深入研究的重点详细信息。
|
移动开发 前端开发 IDE
手淘双11最新实践:PopLayer弹层领域研发模式升级
近年来,各大APP内的弹层需求逐渐增多,以手机淘宝为例,日常的弹层上线频率为单端每月50次左右,而在大促期间可以达到240次以上。在手淘内,各类弹层业务都会通过PopLayer中间件的能力进行投放。但业务往往会遇到开发弹层难、慢、稳定性差的种种困难。对比于往年业务研发成本较高的现状,PopLayer在今年提出了【低研发搭投模式】来解决这类问题,形成一套快速搭建+可视化+多端多场景通用的解决方案,在日常与大促期间得到了广泛应用:
|
机器学习/深度学习 移动开发 前端开发
淘宝直播零代码弹窗生产方案总结
本文将介绍,淘宝直播前端团队为提升业务触达效率而设计的零代码弹窗动态化方案。
436 0
淘宝直播零代码弹窗生产方案总结
|
SQL Java 数据处理
Pick!闲鱼亿级商品库中的秒级实时选品
作者:闲鱼技术-剑辛 一、业务背景 在电商运营工作中,营销活动是非常重要的部分,对用户增长和GMV都有很大帮助。对电商运营来说,如何从庞大的商品库中筛选出卖家优质商品并推送给有需要的买家购买是每时每刻都要思索的问题,而且这个过程需要尽可能快和实时。
10493 0
|
机器学习/深度学习 算法 数据可视化
闲鱼触达平台的大杀器-HermesX
基于用户+基于行业+免打扰
349 0
闲鱼触达平台的大杀器-HermesX
|
存储 消息中间件 SQL
闲鱼商品选投实时性优化
从天级别延迟到小时级别延迟,从小时级别延迟到分钟级别延迟,从分钟级别延迟到秒级别延迟,闲鱼实时选投系统这样做
541 0
闲鱼商品选投实时性优化
|
移动开发 前端开发 IDE
手淘双11最新实践:PopLayer弹层领域业务研发模式升级
背景 近年来,各大APP内的弹层需求逐渐增多,以手机淘宝为例,日常的弹层上线频率为单端每月50次左右,而在大促期间可以达到240次以上。在手淘内,各类弹层业务都会通过PopLayer中间件的能力进行管理。但业务往往会遇到开发弹层难、慢、稳定性差的种种困难。对比于往年业务研发成本较高的现状,PopLayer在今年提出了【低研发搭建模式】来解决这类问题,形成一套快速搭建+可视化+多端多场景通用的解决
1276 0
手淘双11最新实践:PopLayer弹层领域业务研发模式升级
|
SQL 前端开发 JavaScript
|
数据安全/隐私保护 UED
直播带货源码开发的直播页面怎么做才能满足用户需求
直播带货源码开发的直播页面是开发的核心功能,在直播页面提升用户体验感受,能够提高流量的变现效率。本文为大家盘点一下,如何从直播入手,开发一款用户喜欢的直播带货源码。
直播卖货系统开发买家端与卖家端的不同功能分析
我们都知道,直播卖货系统开发针对不同性质的用户有不同的功能,本文来带大家盘点一下,直播卖货系统开发的卖家端与买家端有哪些不同功能。
直播卖货系统开发买家端与卖家端的不同功能分析