简介: 简单事件采集 + 工作零碎 + 实时触达
作者:闲鱼技术 - 占先
一、业务背景
闲鱼作为一款 C2X 的 app,与淘宝、天猫等 B2C 的业务模式存在人造不同。集体卖家也是一般的消费者,很多集体卖家相比业余卖家,并不分明如何卖出本人的商品,问题次要体现在以下两个方面:
1、商品信息有余。闲鱼采纳轻公布模式,用户只须要上传几张照片,简略形容一下商品信息,即可在一分钟之内实现公布流程。轻公布模式投合了用户疾速公布的体验,但也导致了商品信息有余的问题。
2、商品定价不合理。有些卖家用户误判了本人商品的市场行情,导致定价和买家预期存在偏差,升高了买家的购买志愿。
所以问题来了,如何在既保证轻公布的同时,晋升商品的无效信息量,减少商品宝贝的吸引力,促成成交呢?
二、解决思路
在上述问题背景下,咱们想到了做工作的形式疏导用户。具体做法是:在轻公布的前提下,通过做工作的形式疏导卖家补全商品信息或疏导商品提价,从而促成成交。
一方面,商品要害属性的信息补全了,价格变得正当了,就有更多的买家违心浏览商品并成交。
另一方面,也帮忙咱们技术小二更好的了解商品的特色,从而更精准地举荐给须要的买家。
三、技术实现与零碎积淀
在这个解决思路下,咱们发明了 Tellus- 基于用户 & 商品的工作零碎。
有些同学可能问了:“公司外部难道没有相似的零碎吗?工作零碎应该比拟常见吧?”通过调研,发现已有的外部零碎大部分是基于用户的工作零碎,而闲鱼的工作零碎是基于用户 & 商品维度的,这样的特点导致咱们无奈复用现有的工作零碎,只能通过自研。
整体零碎结构图
工作的生命周期分为创立工作、展现工作和实现工作。
工作创立模块:
创立工作的难点在于之前提到的数据起源简单的问题,因为工作创立的起源较多,为了升高接入老本,Tellus 的工作创立模块应用音讯队列来做事件解耦。Tellus 应用 MetaQ 作为音讯队列。MetaQ 是一款阿里自研分布式、队列模型的消息中间件(RocketMQ)。基于公布订阅模式,有 Push 和 Pull 两种生产形式,反对严格的音讯程序,亿级别的沉积能力,反对音讯回溯和多个维度的音讯查问。通过音讯定制,所有的数据源对立发送创立工作的音讯,Tellus 零碎监听此类音讯并且依据业务逻辑创立对应的工作,很好地解决了简单音讯源的问题。
工作展现模块:
当工作创立后,如何展现工作呢?展现流程如下:
咱们通过 AB 试验进行了全方位的摸索,Tellus 零碎反对了丰盛的工作类型,咱们尝试了单个工作和组合工作:
单个工作展现
组合工作展现
还反对基于用户维度 (例如间断擦亮工作) 的和基于商品维度 (例如选商品成色) 的工作。Tellus 零碎同时也实现了工作频次的定制,工作能够一次性实现,也能够反复做,能够依照特定程序实现组合工作,也能够乱序实现,给业务提供了灵便的可配置型。
工作实现模块
工作的实现模块分为被动实现逻辑和被动实现逻辑,被动实现可分为工作胜利和工作失败,被动实现属于用户的某些 app 行为触发了实现工作的逻辑,从而在不知情的状况下实现了工作,比方在从新编辑商品的时候增加了商品成色,那么增加成色的工作就主动实现了。不同工作还能够实现个性化的激励步骤,Tellus 通过策略模式的设计,将接口凋谢给业务方开发,每个工作的实现,用户都能够获取到肯定的激励,这些激励依据业务的不同而不同,通过接口凋谢,业务方开发只须要恪守接口的协定,便能够实现定制化开发,实现不同的工作激励机制。
在整个工作的生命周期过程中,还有一个始终都绕不开的难题,就是数据该如何存储,工作数据次要分为两类:一类为工作的具体数据;另一类为工作的元数据。
针对工作的具体数据,首先要思考的是关系型数据库还是非关系型数据库,关系型数据库反对事务,能够进行简单的联表查问,这些对于工作零碎并非必须和必要的,工作系统对数据的关联性要求不高(工作数据之间简直是互相独立的),然而对于数据的存储量级要求较高(百亿级别)。反对海量数据存储的 Table store 进入了咱们的视线。
表格存储(Table Store)是阿里云自研的 NoSQL 多模型数据库,提供海量结构化数据存储以及疾速的查问和剖析服务。表格存储的分布式存储和弱小的索引引擎可能反对 PB 级存储、千万 TPS 以及毫秒级提早的服务能力。除此之外,Table Store 还兼具以下长处:
1、Table Store 还是一种全托管的数据库。应用表格存储只需专一于业务研发,无需放心软硬件预置、配置、故障、集群扩大、平安等问题,在保障高服务可用性的同时,极大地缩小了治理及运维老本,这样能够使咱们把精力全副放在业务的开发上。
2、查问能力强。除了反对主键查问,表格存储还反对多元索引、全局二级索引。
3、高可用。表格存储将数据的多个备份存储在不同机架的不同机器上,并会在备份生效时进行疾速复原,提供 99.99999999%(10 个 9)的可靠性。
4、数据强统一。表格存储保证数据写入强统一,并保证数据 3 正本均写入磁盘,且所有数据保持一致。写操作一旦返回胜利,应用程序就能立刻读到最新的数据。
基于上述长处,Table Store 比拟好的满足了咱们数据存储的需要。
针对工作的元数据,思考到应用频率,咱们也创立了缓存进行读写,对于工作零碎的元数据,咱们选取了 guava cache 作为缓存。起因是 guava cache 申请疾速且简略易用。工作元数据数据量较小,即便每个节点都存储一份缓存,开销也不大,这种情景应用分布式缓存比拟重,意义不大。
四、业务成果
Tellus 因为其性能反对的多样性,可拓展性,以及可配置性的多种特点,在短时间内能够反对大量不同业务场景的上线,这里咱们以超级曝光和存量诊断也为为例,具体阐明一下。
超级曝光针对新发商品在商品公布时弹出一个弹窗,疏导用户进入组合工作页面实现工作,实现后用户可取得超级曝光特权。存量诊断针对存量商品,在宝贝下方透出第一个工作信息,疏导用户进入组合工作页面,实现组合工作。上线后,组合工作大幅提高了工作完成率。
五、开发效率晋升
对于 Tellus 来说,比拟大的一个挑战是新增工作数量较多,较短时间内须要反对数百个工作,这简直是不可实现的工作。为了反对业务的疾速试错,并且升高开发成本,Tellus 次要做了两个方面的优化,一个是工作模版化,另一个是反对工作的可配置化。
先说说工作的模版化:咱们发现工作从表现形式上能够形象为单选类、多选类、确认类、跳转类等等。将每类工作定制为一个模版,视觉同学针对模板进行视觉形象,固定展现款式,服务端依据展现款式形象模板类型,前端齐全基于服务端数据驱动,前后端的协定格局举例如下:
新增工作时,只须要套模版即可,缩小了很多反复开发的工作量。
再说下工作的可配置化:在工作模版化的根底上,咱们发现对于某些工作,工作的逻辑基本一致,只是对应的工作文案不同。Tellus 针对这些简略工作,反对了工作可配置化的开发,目前 1.0 曾经开发实现,本来须要改代码才能够新增一个工作,现在只须要改配置文案即可。后续 2.0 版本将做经营页面的开发,经营同学只须要在页面上配置即可,不再须要开发人员染指,从而大幅提高开发经营效率。
六、瞻望
Tellus 后续打算与 Omega 和 Hermes 平台对接。Omega 是闲鱼一个实时事件采集零碎,通过日志采集用户行为事件,通过规定计算,对符合条件的用户调用 Hermes 精准触达。Hermes 是闲鱼的触达零碎,之前的公众号文章也有介绍。举个例子:用户公布商品,能够通过 omega 实时采集这一事件,而后实时生成该商品对应的某些工作,这样相较于音讯的形式设计更正当,前期可拓展性更高;和 Hermes 的联动,更多地体现在通过 push 等形式去促使用户实现工作,减少工作的曝光。
Tellus 还打算减少一系列激励措施,激励用户做工作,最近咱们在和闲鱼币的同学进行对接,对于实现某类工作的用户,通过给与一定量的闲鱼币,从而激励用户更多地实现工作。