消息点击率翻倍的背后——闲鱼无侵入可扩展IFTTT系统

作者:闲鱼技术-剑辛

一、面临问题

在闲鱼生态里,用户之间会有很多种关系。其中大部分关系是由买家触发,联系到卖家,比如买家通过搜索、收藏、聊天等动作与卖家产生联系;另外一部分是平台与用户之间的关系。对这些关系分析之后我们发现这些关系中存在两个问题:

  • 用户产生关系的层次不够丰富;
    现有系统只维护了一部分用户关系,包括收藏、点赞等,用户关系的层次还不够丰富。
  • 用户之间关系是单向且不够实时;
    在现有的玩法中,买家可以通过多种行为与卖家产生联系,但卖家不能主动与买家发生关系和互动;而且平台计算的关系都是离线的,对用户的吸引力不足。

上面提到的场景经过抽象归纳之后都是同一个范式:当某个条件被满足之后,就会触发相对应的动作。这个范式是IFTTT的基本理念,而闲鱼IFTTT就是对这些问题的解决方案。

二、IFTTT概念

IFTTT是一个被称为 “网络自动化神器” 的创新型互联网服务理念,它很实用而且概念很简单。IFTTT全称是 If this then that ,意思是如果满足“this”条件,则触发执行“that”动作。IFTTT由三部分构成,分别为Trigger、Action和Recipe。

可以看出IFTTT本身概念并不复杂,它的真正魔力在于“由简单组成的复杂”,也就是由众多简单的IFTTT流程相互衔接成跨越整个互联网、跨越多平台、跨越多设备的状态机。

2.1、闲鱼IFTTT

闲鱼IFTTT是基于闲鱼的业务场景与IFTTT理念结合后产生的,提供IFTTT标准协议封装,对业务无侵入可扩展的服务编排系统。

闲鱼IFTTT的两个特性对应上述两个问题,分别是:

  • 多维用户关系感知

多维指的是覆盖面,闲鱼IFTTT通过更多维度的挖掘,抽象并维护了更丰富的用户关系。基于用户关系数据,我们可以产出用户画像,并通过更有效的方式触达用户。

  • 实时用户双向互动

闲鱼IFTTT底层具有对用户关系大数据的高效存储和处理能力,以支持上层业务中用户关系实时处理;闲鱼IFTTT不仅支持买家到卖家关系,而且通过设计天生支持卖家到买家关系。

闲鱼IFTTT把之前平台与用户的互动、买家到卖家的联系,切换称闲鱼用户之间天然的关系互动,对用户骚扰更少且激活拉回的效果更好,我们基于这个场景设计闲鱼IFTTT的技术方案。

三、技术方案


首先按照IFTTT规范对业务进行建模,分为Channel、Trigger和Action层,其中Channel层是数据底层,将Trigger和Action关联后组成标准Recipe。

  • Channel
    Channel层在闲鱼IFTTT的作用是保存和管理用户关系数据,Channel层定义了用户关系的元数据结构,包括关系类型、源账户和目标账户。Channel层是闲鱼IFTTT的基石,Trigger和Action均基于用户关系数据进一步抽象业务逻辑。
  • Trigger
    Trigger是业务上自定义的触发事件,与业务息息相关,可能是关注的人上新、浏览宝贝降价或者是参加的百币夺宝活动开奖等。当Trigger触发后,闲鱼IFTTT会根据Trigger类型和配置的关系类型计算用户名单,并调用Action层进行处理。
  • Action
    Action层处理对象是Trigger触发后计算的用户名单,可以给名单里的用户发Push,发权益或者其他定制逻辑。Action本身是标准化、可插拔的组件,业务上可以利用Action组件对用户名单做AB测试,快速实验不同Action策略。

接下来我们说一下闲鱼IFTTT详细技术方案,方案如下:

整体技术方案按照业务建模的结构图细化,补充依赖的技术组件。整体流程不再细述,针对流程中重点模块详细说明。

3.1、场景快速接入

设计场景快速接入的目的是让业务对接入闲鱼IFTTT无感知,因为在最开始的设计中,场景接入是准备通过在业务逻辑里增加AOP切面,将业务数据和场景上报。但因为这种方式对业务本身有一定侵入,增加业务执行的RT而且不够灵活,最终被否决。

而现在的场景快速接入方案解决了这些问题,通过SLS接入所有应用的海量网络请求日志,记录请求的URL、参数和响应;将SLS作为Blink流计算任务的数据源;根据diamond动态下发的规则实时筛选网络请求URL和参数,把数据按照指定格式组装后上报给Channel层。

场景快速接入方案将业务逻辑与场景接入解耦,支持快速接入,灵活变更且延迟低,是针对大数据场景接入的高性能解决方案。

3.2、计算用户名单

计算用户名单模块采用责任链模式设计,因为在不同Trigger场景中,业务对用户名单的计算和筛选逻辑都是不同的。通过责任链模式,将主流程与业务筛选逻辑解耦,并支持各业务灵活定制筛选逻辑,互不干扰。

3.3、PushAction

Action层是闲鱼IFTTT中最重要的一环,会直接触达到用户,Action的逻辑会直接影响用户对平台的直观感受和活跃率。消息Push是Action中最常见的逻辑,更要防止用户被骚扰,PushAction逻辑如下:

  • 敏感人群过滤;
  • 疲劳度校验;
  • 对发送人群进行AB实验;
  • 组装消息;
  • 将Action各节点日志同步到SLS,方便检索和排查问题;
  • 统计消息发送数据及点击数据,为业务后续决策提供依据;

3.3.1、疲劳度

疲劳度是防止用户被骚扰的关键,我们针对疲劳度进行了分层设计,分为三层,第一层为用户级别疲劳度,控制一个用户在一个周期内收到消息数量;第二层是业务维度,控制用户在一个周期内收到某个业务的消息数量;第三层是目标级别,控制用户在一个周期内收到同一个发送者消息数量。

在业务维度层面,支持灵活控制多个业务联合疲劳度,保证用户不会被消息过度骚扰。

3.4、用户关系存储

用户关系数据是闲鱼IFTTT的基石,它的特点是存储量级大,达到TB级别;而且对存储和查询的性能要求高,TPS和QPS的峰值都在一万以上。经过调研,我们发现集团内部开发的Lindorm可以满足需求。

Lindorm是阿里内部基于Hbase自研的高性能KV存储数据库,对Hbase的性能和稳定性均有一定优化。闲鱼IFTTT采用Lindorm作为用户关系数据存储,经性能测试验证数据读取QPS达到7万,数据存储TPS在10万以上。Lindorm本身性能优异,为闲鱼IFTTT高性能奠定基础。

四、效果验证

闲鱼IFTTT自上线以来,已支持关注上新、浏览宝贝降价和租房小区上新等多个业务场景,提供买卖双方实时双向互动能力,平均每天处理关系数据数亿条,处理Trigger量达到上千万,处理Action量达到亿级别,消息点击率较离线push提高1倍以上。

闲鱼IFTTT目前支持的是用户互动场景,后续我们将结合闲鱼自身业务特点,对IFTTT进行更高维度抽象,封装标准Recipe接口,将闲鱼IFTTT打造成提供流程编排、管理能力的服务平台。

在我看来,IFTTT从2010年推出以来,在国外有很大的热度,在互联网和物联网领域都有专门的公司和团队在研发,IFTTT的概念虽然简单,却通过标准化协议满足用户的强需求-让各种互联网产品为用户服务。这其实也给我们互联网从业者一些思考:在新机遇面前,究竟是快速投入比较重要还是抽象标准协议解决一类问题更加有效?


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019阿里云618大促主会场全攻略

2019阿里云618大促活动已经于6月16日正式开启,从已开放的活动页面来看,整场大促活动由爆款拼团、满额最高返6000、上云接力赛分享集赞赢6.18万大奖三大活动组成。 在618这个年中的大幅度优惠促销日,怎样才能花最少的钱配置最特惠的云服务&am…

Redis-6.2.5 安装 Linux环境(单机)

文章目录1. 安装依赖环境2. 升级GCC3. 在线下载4. 解压5. 编译6. 安装7. 前台启动8. 后台启动9. 配置开机启动10. 常用命令11. 评析1. 安装依赖环境 yum install -y gcc-c autoconf automaker2. 升级GCC 这里说明一下,在编译之前:在编译之前需要升级gcc…

Java-递归

public class Demo05 {public static void main(String[] args) {System.out.println(f(5));}// 5! 5*4*3*2*1 阶乘public static int f(int n){if (n1){return 1;} else {return n*f(n-1);}} }递归特别消耗资源,如果嵌套太多层就不建议使用了 https://www.bilibi…

为什么说优秀架构师往往是一个悲观主义者?

阿里妹导读:18年前,200家企业由于在事故中信息系统遭到严重破坏而永远地关闭了。这样的事故引发了后人深思,对于工程师而言,不仅要求设计的系统足够强壮,还需要具备考虑失败的能力,当失败场景悉数被考虑周全…

石锤!今年Python要过苦日子了? 程序员:我疯了!

Python的好日子到头了?Python终于要回归现实了?所有程序员,刚刚一份报告把Python的真相撕开了!不信你看:Python今年要跑路?三份报告炸出真相....「人生苦短,钱多事少,快用Python」&a…

安装 kivy

系统:Windows10 64位 python 3.7.6 最好管理员身份打开 命令行窗口pip安装 kivy 依赖 ——在 windows 命令行中,执行以下命令 pip3 install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew -i http://pypi.douban.com/simple --trusted-h…

Java-数组的声明与创建

public class ArrayDemo01 {// 变量的类型 变量的名字 变量的值;public static void main(String[] args) {// 数组定义方式有两种,但是推荐第一个int[] nums; // 1. 声明一个数组 // int nums1[];nums new int[10]; // 2. 创建一个数组// …

云上快速搭建Serverless AI实验室

Serverless Kubernetes和ACK虚拟节点都已基于ECI提供GPU容器实例功能,让用户在云上低成本快速搭建serverless AI实验室,用户无需维护服务器和GPU基础运行环境,极大降低AI平台运维的负担,显著提升整体计算效率。 如何使用GPU容器实…

十分钟上手 ES 2020 新特性

作者 | 浪里行舟责编 | 郭芮ES2020 是 ECMAScript 对应 2020 年的版本。这个版本不像 ES6 (ES2015)那样包含大量新特性。但也添加了许多有趣且有用的特性。本文的代码地址:https://github.com/ljianshu/Blog本文以简单的代码示例来介绍 ES2020新特性。这样&#xff…

时延敏感业务低概率超时问题分析

前言 作为阿里云底层提供的基础设施,内部的物理网络和许多网络产品在数据平面给客户的可操作性并不高,从一定程度上来说是个黑盒。当然,在传统的IDC环境,业务和物理网络之间也存在同样的隔阂。所以在遇到业务卡顿、延迟、不通等问…

Java-数组 三种初始化及内存分析

声明的时候数组并不存在,创建的时候数组才真正的存在 数组初始化 除了八大基本类型,其他都是引用类型 public class ArrayDemo02 {public static void main(String[] args) {// 静态初始化: 创建 赋值int[] a {1,2,3,4};System.out.print…

十分钟上线 - 函数计算构建支付宝小程序的后端

阿里云函数计算服务(FunctionCompute,FC)是一个事件驱动的全托管计算服务。通过函数计算与云端各个服务的广泛集成,开发者只需要编写函数代码,就能够快速地开发出弹性高可用的后端系统。接下来我们使用FC,来快速实现一个图片转换服…

用Java开发自己的Kubernetes控制器,想试试吗?

作者 | Nicolas Frnkel译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国在本文中,我们将开始开发自己的Kubernetes控制器。 技术栈可以是Python、NodeJS或Ruby。因为这个博客被命名为为“ Java极客”,因此选择Java是很正常的。 作为一个用例&…

SpringBoot 扫描包

文章目录1. 默认扫描2.指定扫描3.指定扫描21. 默认扫描 默认扫描: 在启动类WikiApplication上的SpringBootApplication注解,默认SpringBoot 扫描范围是当前包(com.gblfy.wiki)以及子包controller包等等 2.指定扫描 扫描项目包但不能扫描第三方的包&a…

揭秘阿里云背后神秘而富有能量的一群人

作为某创业公司CTO兼CTO兼CFO,带领众子弟行走于云端计算,累计犒赏已达757157.09银两,江湖人称紫龙,就是众多阿里云大使中低调内敛的一位。其话不多,一个典型的技术男,但又热心钻研传播推广,不到…

Java-数组下标越界及小结

https://www.bilibili.com/video/BV12J41137hu?p54&spm_id_frompageDriver

如何给女朋友解释什么是撞库、脱库和洗库?

来源 | 漫话编程最近,安全圈又有一个大新闻,微博名为安全_云舒的微博用户在发文称:“很多人的手机号码泄露了,根据微博账号就能查到手机号……已经有人通过微博泄露查到我的手机号码,来加我微信了。”并且,…

OceanBase数据库实践入门——性能测试建议

概述 本文主要分享针对想压测OceanBase时需要了解的一些技术原理。这些建议可以帮助用户对OceanBase做一些调优,再结合测试程序快速找到适合业务的最佳性能。由于OceanBase自身参数很多、部署形态也比较灵活,这里并没有给出具体步骤。 数据库读写特点 …

Istio 在阿里云容器服务的部署及流量治理实践

目标 在阿里云容器服务 Kubernetes 集群上部署 Istio 服务网格实践灰度发布、故障注入、熔断等 Istio 流量管理特性 准备工作 安装和设置 kubectl 客户端,请参考不同的操作系统,如果已经安装请忽略: macOS curl -LO https://kubectl.oss-cn…