消息链路优化之弱感知链路优化

简介: 今天,你的push到了么

作者:闲鱼技术-逸昂

一、消息系统面临的问题

闲鱼的消息系统作为沟通买家与卖家的工具,增进理解、促进信任,对闲鱼的商品成交有重要的价值,是提升用户体验最关键的环节。
闲鱼消息系统面临的问题包括:在线消息的体验提升、离线推送的到达率、消息玩法与消息底层系统的耦合过强。
现阶段离线推送的问题最为关键,对用户体验影响较大,本文优先解决离线推送的到达问题。

二、消息系统现状

2.1 消息系统链路区分

根据闲鱼客户端是否在线,闲鱼的整体消息链路大致可以分为强感知链路和弱感知链路。
强感知链路由发送方客户端、idleapi-message(闲鱼的消息网关)、heracles(闲鱼的消息底层服务)、accs(阿里自研的长连接通道)、接收方客户端组成。整条链路的核心指标在于端到端延迟和消息到达率。强感知链路的双方都是在线的,消息到达客户端就可以保证接收方感知到。强感知链路的主要痛点在消息的端到端延迟。
弱感知链路与强感知链路的主要不同在于:弱感知链路的接收方是离线的,需要依赖离线推送这样的方式送达。因此弱感知链路的用户感知度不强。其核心指标在于消息的到达率,而非延迟。当前弱感知链路的重点是到达率仍有提升空间。

2.3 闲鱼的消息架构

这里放一张闲鱼消息系统的架构图,大家感受下整体链路:
图片.png
HSF是一个远程服务框架,是dubbo的内部版本。
tair是阿里自研的分布式缓存框架,支持 memcached、Redis、LevelDB 等不同存储引擎。
agoo是阿里的离线推送中台,负责整合不同厂商的离线推送通道,向集团用户提供一个统一的离线推送服务。
accs是阿里自研的长连接通道,为客户端、服务端的实时双向交互提供便利。
lindorm是阿里自研的NoSQL产品,与HBase有异曲同工之妙。
域环是闲鱼消息优化性能的核心结构,用来存储用户最新的若干条消息。

强感知链路和弱感知链路在通道选择上是不同的。强感知链路使用accs这个在线通道。弱感知链路使用agoo这个离线通道。

三、弱感知链路问题分析

链路这件事情,比较抽象。首先需要分析链路的核心指标、链路的环节、链路的瓶颈,然后才能着手优化。问题分析清楚,也就成功了一半。

3.1 何为弱感知

本期先带大家看看闲鱼的弱感知链路优化。弱感知链路是指闲鱼的离线推送系统。
相比较于在线消息和端内推送,离线推送难以确保被用户感知到。典型的情况包括:

  • 未发送到用户设备。因为离线通道的token失效、参数错误、用户关闭应用通知、用户已卸载等原因,推送未送达用户设备。这种情况可以从通道的返回分析。
  • 发送到用户设备但没有展示到系统通知栏。闲鱼曾遇到通道返回成功,但是用户未看到推送的案例。
  • 展示到通知栏,并被系统折叠。不同安卓厂商对推送的折叠策略不同,折叠的原因包括:点击率、应用在厂商处的权重、推送的数量等。推送被折叠后,需要用户主动展开才能看到推送内容,触达效果会明显变差。
  • 展示到通知栏,并被用户忽略。离线推送的点击率相比于在线推送更低,原因包括:用户不愿意查看推送;用户看到了推送,但是对内容不感兴趣;用户在忙别的事,无暇处理。

离线推送用户感知度不高,闲鱼称之为弱感知链路。

3.2 弱感知链路的构成

闲鱼的弱感知链路分为系统、通道、用户三个部分,包含Hermes、agoo、厂商、设备、用户、承接页这几个环节。

从推送的产生到用户最终进入闲鱼,共分为如下几个步骤:
Step 1. Hermes是闲鱼的用户触达系统,负责人群管理、内容管理、时机把控,是整个弱感知链路的起点。
Step 2. agoo是阿里内部承接离线推送的中台,是闲鱼离线推送能力的基础。
Step 3. agoo实现离线推送依靠的是厂商的推送通道,例如:苹果的apns通道、Google的fcm通道、以及国内各大厂商的自建通道。
Step 4. 通过厂商的通道,推送最终出现在用户的设备上,这是用户能感知到推送的前提条件。
Step 5. 如果用户刚巧看到这条推送,推送的内容也很有趣,在用户的主动点击下。会唤起闲鱼,打开承接页,进而给用户展示个性化的商品。到此,弱感知链路就完成了使命。

3.3 弱感知链路面临的问题

弱感知链路的核心问题在于:

  • 推送的消息是否投递给了用户。
  • 用户是否有感知

这对应推送的两个阶段:

  • 推送到达设备
  • 用户查看推送并点击

其中,到达设备这个阶段是最基础的,也是本次优化的核心。
我们可以将每一步的消息处理量依次平铺,展开为一张漏斗图,从而直观的查看链路的瓶颈。漏斗图斜率最大的地方是优化的重点,差异小的地方不需要优化。
图片.png
通过分析闲鱼的漏斗图,弱感知链路的优化重点在三个方面:

  • agoo受理率。agoo受理率是闲鱼发送推送的数量到可以通过agoo(阿里承接离线推送的中台)转发到厂商通道的数量之间的漏斗。
  • 厂商受理率。厂商受理率是agoo中台受理的量到厂商返回成功的量之间的漏斗。
  • Push点击

有了优化方向,我们来看看优化手段吧。

四、弱感知链路优化

我们跟随推送的视角,顺着链路看下闲鱼的优化。

4.1 agoo受理率优化

用户的推送,从 Hermes 站点搭乘“班车”,驶向下一站: agoo。这是推送经历的第一站,到站一看,傻眼了,只有不到一半的推送到站下车了。这是咋回事嘞?
这就要先说说 agoo 了,调用 agoo 有两种方式:

  • 指定设备和客户端,agoo直接将推送投递到相应的设备
  • 指定用户和客户端,agoo根据内部的转换表,找到用户对应的设备,再进行投递。

闲鱼不保存用户的设备信息。因此,闲鱼是按照用户来调用agoo的。同时,因为由于没有用户的设备信息,并不知道用户是 iOS 客户端还是 Android 客户端。工程侧不得不向 iOS 和 Android 都发送一遍推送。虽然保证了到达,但是,一半的调用都是无效的。
为了解这个问题,我们使用了agoo的设备信息。将用户转换设备这一阶段提前到了调用 agoo 之前,先明确用户对应的设备,再指定设备调用 agoo,从而避免无效调用。
图片.png
agoo调用方式优化后,立刻剔除了无效调用,agoo受理率有了明显提升。至此,我们总算能对 agoo 受理失败的真正原因做一个高大上的分析了。根据统计,推送被 agoo 拒绝的主要原因是:用户关闭了通知权限
同时,对 agoo 调用数据的进一步分析发现。有部分用户找不到对应的设备。
优化到此,我们猛然发现多了两个问题。那就优化呗:

  • 通知体验优化,引导打开通知权限
  • 与agoo共建设备库,解决设备转换失败的问题

这两个优化方向又是一片新天地,我们择日再聊。

4.2 厂商受理率优化

推送到达 agoo ,分机型搭乘厂商“专列”,驶向下一站:用户设备。这是推送经历的第二站。出站查票,发现竟然超员了。于是乎,闲鱼每天有大量推送因为超过厂商设定的限额被拦截。
提供推送通道的厂商,为了保证用户体验,会对每个应用能够推送的消息总量进行限制。这个限制会根据推送的类型和应用的用户规模设定。
推送主要分为产品类的推送和营销类的推送。对于产品类推送,厂商会保证到达;对于营销类推送,厂商会进行额度限制。未标记的推送默认作为营销类推送对待。
闲鱼刚好没有对推送进行标记,因此触发了厂商的推送限制。这对闲鱼的用户来说,会带来困扰。闲鱼的交易,很依赖买卖家之间的消息互动。这部分消息是需要确保到达的。同样,订单类的消息、用户的关注,也需要保证推送给用户。
根据主流厂商的接口协议,闲鱼将Push分为即时通讯消息、订单状态变化、用户关注内容、营销消息这几类,并进行相应标记。
同时,在业务上,我们也进行了推送的治理。将用户关注度不高的消息,取消推送,避免打扰。
经过这些优化,闲鱼因为超过厂商限额而被拦截的推送实现了清零。

4.3 Push点击优化

在日常的开发测试过程中,闲鱼的工程师们发现了推送的两个体验问题:

  • 用户点击Push有开屏广告
  • 营销Push 也有权限校验,更换用户登陆后无法点击

对于开屏广告功能,闲鱼增加了Push点击跳广告的能力。针对Push的权限校验功能,闲鱼根据场景做了细分。涉及个人隐私的推送,保持权限校验不变。营销类的推送,放开权限校验。
以上是点击体验的优化,我们还需要考虑用户的点击意愿。
用户点击量与推送的曝光量、推送素材的有趣程度相关。推送的曝光量又和推送的到达量、推送的到达时机有关。通过优化agoo受理率、厂商受理率,我们解决了推送到达量的瓶颈。在推送内容上,我们需要优化的是推送的时机和相应的素材。
在推送时机上,算法会根据用户的偏好和个性化行为数据,计算每个用户的个性化推送时间,在用户空闲的时间推送。避免在不合适的时间打扰用户,同时也能提升用户看到推送的可能性。
在推送素材上,算法会根据素材的实时点击反馈,对素材做实时赛马。只发用户感兴趣的素材,提高用户点击意愿。

五、链路优化效果

通过分析链路的瓶颈并进行相对应的优化,整体链路有了不错的提升,到达率相对提升了两位数。

六、聊后续

今天主要和大家聊一下消息链路中的一环:弱感知链路的优化。
消息系统整体,还是一个比较复杂的领域。闲鱼在消息的发展过程中,面临着如下问题:

  • 如何进行消息的链路追踪
  • 如何保证IM消息的快速到达
  • 如何将消息的玩法和底层能力分离
  • 离线推送中如何通过用户找到对应的设备

在后续的文章中,我们会和大家一一讨论这些主题。预知后事如何,且听下回分解。

相关文章
|
1月前
|
存储 监控 数据可视化
链路追踪所需要了解的知识
【2月更文挑战第29天】链路追踪,或称调用链监控,用于记录跨服务的逻辑请求信息,协助开发者优化性能和定位问题。它捕获异常、错误和有价值的数据。
|
2月前
|
存储 数据采集 消息中间件
初探分布式链路追踪(上)
初探分布式链路追踪(上)
54 2
|
2月前
|
存储 监控 Cloud Native
初探分布式链路追踪(下)
初探分布式链路追踪(下)
43 2
|
10月前
|
存储 缓存 运维
进阶篇丨链路追踪(Tracing)很简单:链路成本指南
进阶篇丨链路追踪(Tracing)很简单:链路成本指南
|
12月前
|
消息中间件 数据可视化 JavaScript
什么是链路追踪?分布式系统如何实现链路追踪?
什么是链路追踪?分布式系统如何实现链路追踪?
|
Java API Spring
异步线程中链路追踪方案
异步线程中链路追踪方案
682 0
|
3天前
|
存储 运维 监控
链路追踪(Tracing)其实很简单——链路成本进阶指南
作者:夏明(涯海) 创作日期:2022-11-06 专栏地址:【稳定大于一切】【稳定大于一切】广义上的链路成本,既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销,也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解,本小节将聚焦在狭义上的链路追踪机器资源成本,人力成...
链路追踪(Tracing)其实很简单——链路成本进阶指南
|
3天前
|
运维 监控 算法
链路追踪(Tracing)其实很简单——链路功能进阶指南
作者:夏明(涯海) 创作日期:2022-10-24 专栏地址:【稳定大于一切】【稳定大于一切】经过前面两章的学习,小玉已经熟练掌握分布式链路追踪的基础用法,比如回溯链路请求轨迹,定位耗时瓶颈点;配置核心接口黄金三指标告警,第一时间发现流量异常;大促前梳理应用上下游关键依赖,联系相关方协同备战等等。随...
链路追踪(Tracing)其实很简单——链路功能进阶指南
|
3天前
|
SQL 运维 测试技术
链路追踪(Tracing)其实很简单——链路拓扑
作者:夏明(涯海) 创作日期:2022-07-26 专栏地址:【稳定大于一切】【稳定大于一切】最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉...
链路追踪(Tracing)其实很简单——链路拓扑
链路追踪学习三:跨服务,跨进程追踪
链路追踪学习三:跨服务,跨进程追踪
147 0
链路追踪学习三:跨服务,跨进程追踪