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

简介: 今天,你的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消息的快速到达
  • 如何将消息的玩法和底层能力分离
  • 离线推送中如何通过用户找到对应的设备

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

相关文章
|
6月前
|
存储 监控 数据可视化
链路追踪所需要了解的知识
【2月更文挑战第29天】链路追踪,或称调用链监控,用于记录跨服务的逻辑请求信息,协助开发者优化性能和定位问题。它捕获异常、错误和有价值的数据。
|
3月前
|
监控 Java 应用服务中间件
分布式链路监控系统问题之Eagleeye的traceId设计的问题如何解决
分布式链路监控系统问题之Eagleeye的traceId设计的问题如何解决
|
3月前
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
|
6月前
手动模式配置链路聚合
手动模式配置链路聚合
37 1
|
6月前
|
存储 监控 Cloud Native
初探分布式链路追踪(下)
初探分布式链路追踪(下)
127 2
|
6月前
|
存储 数据采集 消息中间件
初探分布式链路追踪(上)
初探分布式链路追踪(上)
155 2
|
存储 缓存 运维
进阶篇丨链路追踪(Tracing)很简单:链路成本指南
进阶篇丨链路追踪(Tracing)很简单:链路成本指南
|
消息中间件 数据可视化 JavaScript
什么是链路追踪?分布式系统如何实现链路追踪?
什么是链路追踪?分布式系统如何实现链路追踪?
|
6月前
|
存储 监控 搜索推荐
链路追踪(Tracing)其实很简单——链路成本进阶指南
广义上的链路成本,既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销,也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解,本小节将聚焦在狭义上的链路追踪机器资源成本,人力成本将在下一小节(效率)进行介绍。
325 0
链路追踪(Tracing)其实很简单——链路成本进阶指南
|
Java API Spring
异步线程中链路追踪方案
异步线程中链路追踪方案
919 0