本文由阿里闲鱼技术团队逸昂分享,原题“消息链路优化之弱感知链路优化”,有修订和改动,感谢作者的分享。
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、网站建设、桂东网络推广、小程序开发、桂东网络营销、桂东企业策划、桂东品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供桂东建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
闲鱼的IM消息系统作为买家与卖家的沟通工具,增进理解、促进信任,对闲鱼的商品成交有重要的价值,是提升用户体验最关键的环节。
然而,随着业务体量的快速增长,当前这套消息系统正面临着诸多急待解决的问题。
以下几个问题典型最为典型:
1) 在线消息的体验提升;
2) 离线推送的到达率;
3) 消息玩法与消息底层系统的耦合过强。
经过评估,我们认为现阶段离线推送的到达率问题最为关键,对用户体验影响较大。
本文将要分享的是闲鱼IM消息在解决离线推送的到达率方面的技术实践,内容包括问题分析和技术优化思路等 ,希望能带给你启发。
(本文已同步发布于: )
本文是系列文章的第6篇,总目录如下:
《 阿里IM技术分享(一):企业级IM王者——钉钉在后端架构上的过人之处 》
《 阿里IM技术分享(二):闲鱼IM基于Flutter的移动端跨端改造实践 》
《 阿里IM技术分享(三):闲鱼亿级IM消息系统的架构演进之路 》
《 阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠投递优化实践 》
《 阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践 》
《 阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化 》(* 本文)
从数据通信链接的技术角度,我们根据闲鱼客户端是否在线,将整体消息链路大致分为强感知链路和弱感知链路。
强感知链路由以下子系统或模块:
1) 发送方客户端;
2) idleapi-message(闲鱼的消息网关);
3) heracles(闲鱼的消息底层服务);
4) accs(阿里自研的长连接通道);
5) 接收方客户端组成。
整条链路的核心指标在于端到端延迟和消息到达率。
强感知链路中的双方都是在线的,消息到达客户端就可以保证接收方感知到。强感知链路的主要痛点在消息的端到端延迟。
弱感知链路与强感知链路的主要不同在于: 弱感知链路的接收方是离线的,需要依赖离线推送这样的方式送达。
因此弱感知链路的用户感知度不强,其核心指标在于消息的到达率,而非延迟。
所以当前阶段,优化弱感知链路的重点也就是提升离线消息的到达率。换句话说, 提升离线消息到达率问题,也就是优化弱感知链路本身 。
下图一张整个IM消息系统的架构图,感受下整体链路:
如上图所示,各主要组件和子系统分工如下:
1) HSF是一个远程服务框架,是dubbo的内部版本;
2) tair是阿里自研的分布式缓存框架,支持 memcached、Redis、LevelDB 等不同存储引擎;
3) agoo是阿里的离线推送中台,负责整合不同厂商的离线推送通道,向集团用户提供一个统一的离线推送服务;
4) accs是阿里自研的长连接通道,为客户端、服务端的实时双向交互提供便利;
5) lindorm是阿里自研的NoSQL产品,与HBase有异曲同工之妙;
6) 域环是闲鱼消息优化性能的核心结构,用来存储用户最新的若干条消息。
强感知链路和弱感知链路在通道选择上是不同的:
1) 强感知链路使用accs这个在线通道;
2) 弱感知链路使用agoo这个离线通道。
通俗了说,弱感知链路指的就是离线消息推送系统。
相比较于在线消息和端内推送(也就是上面说的强感知链路),离线推送难以确保被用户感知到。
典型的情况包括:
1) 未发送到用户设备:即推送未送达用户设备,这种情况可以从通道的返回分析;
2) 发送到用户设备但没有展示到系统通知栏:闲鱼曾遇到通道返回成功,但是用户未看到推送的案例;
3) 展示到通知栏,并被系统折叠:不同安卓厂商对推送的折叠策略不同,被折叠后,需用户主动展开才能看到内容,触达效果明显变差;
4) 展示到通知栏,并被用户忽略:离线推送的点击率相比于在线推送更低。
针对“1)未发送到用户设备”,原因有:
1) 离线通道的token失效;
2) 参数错误;
3) 用户关闭应用通知;
4) 用户已卸载等。
针对“3)展示到通知栏,并被系统折叠”,原因有:
1) 通知的点击率;
2) 应用在厂商处的权重;
3) 推送的数量等。
针对“4)展示到通知栏,并被用户忽略”,原因有:
1) 用户不愿意查看推送;
2) 用户看到了推送,但是对内容不感兴趣;
3) 用户在忙别的事,无暇处理。
总之: 以上这些离线消息推送场景,对于用户来说感知度不高,我们也便称之为弱感知链路。
我们的弱感知链路分为3部分,即:
1) 系统;
2) 通道;
3) 用户。
共包含了Hermes、agoo、厂商、设备、用户、承接页这几个环节。具体如下图所示。
从推送的产生到用户最终进入APP,共分为如下几个步骤:
步骤1 :Hermes是闲鱼的用户触达系统,负责人群管理、内容管理、时机把控,是整个弱感知链路的起点。;
步骤2 :agoo是阿里内部承接离线推送的中台,是闲鱼离线推送能力的基础;
步骤3 :agoo实现离线推送依靠的是厂商的推送通道(如:苹果的 apns通道 、Google的fcm通道、及 国内各厂商的自建通道 。;
步骤4 :通过厂商的通道,推送最终出现在用户的设备上,这是用户能感知到推送的前提条件;
步骤5 :如果用户刚巧看到这条推送,推送的内容也很有趣,在用户的主动点击下会唤起APP,打开承接页,进而给用户展示个性化的商品。
经过以上5个步骤,至此弱感知链路就完成了使命。
弱感知链路的核心问题在于:
1) 推送的消息是否投递给了用户;
2) 已投递到的消息用户是否有感知。
这对应推送的两个阶段:
1) 推送消息是否已到达设备;
2) 用户是否查看推送并点击。
其中: 到达设备这个阶段是最基础的,也是本次优化的核心。
我们可以将每一步的消息处理量依次平铺,展开为一张漏斗图,从而直观的查看链路的瓶颈。
漏斗图斜率最大的地方是优化的重点,差异小的地方不需要优化:
通过分析以上漏斗图,弱感知链路的优化重点在三个方面:
1) agoo受理率:是指我们发送推送请到的数量到可以通过agoo(阿里承接离线推送的中台)转发到厂商通道的数量之间的漏斗;
2) 厂商受理率:是指agoo中台受理的量到厂商返回成功的量之间的漏斗;
3) Push点击率:也就通过以上通道最终已送到到用户终端的消息,是否最终转化为用户的主动“点击”。
有了优化方向,我们来看看优化手段吧。
跟随推送的视角,顺着链路看一下我们是如何进行优化的。
用户的推送,从 Hermes 站点搭乘“班车”,驶向下一站: agoo 。
这是推送经历的第一站。到站一看,傻眼了,只有不到一半的推送到站下车了。这是咋回事嘞?
这就要先说说 agoo 了,调用 agoo 有两种方式:
1) 指定设备和客户端,agoo直接将推送投递到相应的设备;
2) 指定用户和客户端,agoo根据内部的转换表,找到用户对应的设备,再进行投递。
我们的系统不保存用户的设备信息。因此,是按照用户来调用agoo的。
同时: 由于没有用户的设备信息,并不知道用户是 iOS 客户端还是 Android 客户端。工程侧不得不向 iOS 和 Android 都发送一遍推送。虽然保证了到达,但是,一半的调用都是无效的。
为了解这个问题: 我们使用了agoo的设备信息。将用户转换设备这一阶段提前到了调用 agoo 之前,先明确用户对应的设备,再指定设备调用 agoo,从而避免无效调用。
agoo调用方式优化后,立刻剔除了无效调用,agoo受理率有了明显提升。
至此: 我们总算能对 agoo 受理失败的真正原因做一个高大上的分析了。
根据统计: 推送被 agoo 拒绝的主要原因是——用户关闭了通知权限。同时,我们对 agoo 调用数据的进一步分析发现——有部分用户找不到对应的设备。 优化到此,我们猛然发现多了两个问题。
那就继续优化呗:
1) 通知体验优化,引导打开通知权限;
2) 与agoo共建设备库,解决设备转换失败的问题。
这两个优化方向又是一片新天地,我们择日再聊。
推送到达 agoo ,分机型搭乘厂商“专列”,驶向下一站:用户设备。
这是推送经历的第二站。出站查票,发现竟然超员了。
于是乎: 我们每天有大量推送因为超过厂商设定的限额被拦截。
为什么会这样呢?
实际上: 提供推送通道的厂商(没错, 各手机厂商的自家推送通道良莠不齐 ),为了保证用户体验,会对每个应用能够推送的消息总量进行限制。
对于厂商而言,这个限制会根据推送的类型和应用的用户规模设定——推送主要分为产品类的推送和营销类的推送。
厂商推送通道对于不同类型消息的限制是:
1) 对于产品类推送,厂商会保证到达;
2) 对于营销类推送,厂商会进行额度限制;
3) 未标记的推送,默认作为营销类推送对待。
我们刚好没有对推送进行标记,因此触发了厂商的推送限制。
这对我们的用户来说,会带来困扰。闲鱼的交易,很依赖买卖家之间的消息互动。这部分消息是需要确保到达的。
同样: 订单类的消息、用户的关注,也需要保证推送给用户。
根据主流厂商的接口协议,我们将推送的消息分为以下几类,并进行相应标记:
1) 即时通讯消息;
2) 订单状态变化;
3) 用户关注内容;
4) 营销消息这几类。
同时,在业务上,我们也进行了推送的治理——将用户关注度不高的消息,取消推送,避免打扰。
经过这些优化,因为超过厂商限额而被拦截的推送实现了清零。
通过优化agoo受理率、厂商受理率,我们解决了推送到达量的瓶颈。但即使消息被最终送达,用户到底点击了没有?这才是消息推送的根本意义所在。
于是,在日常的开发测试过程中,我们发现了推送的两个体验问题:
1) 用户点击Push有开屏广告;
2) 营销Push也有权限校验,更换用户登陆后无法点击。
对于开屏广告功能,我们增加了Push点击跳过广告的能力。
针对Push的权限校验功能,闲鱼根据场景做了细分:
1) 涉及个人隐私的推送,保持权限校验不变;
2) 营销类的推送,放开权限校验。
以上是点击体验的优化,我们还需要考虑用户的点击意愿。
用户点击量与推送的曝光量、推送素材的有趣程度相关。推送的曝光量又和推送的到达量、推送的到达时机有关。
具体的优化手段是:
1) 在推送内容上:我们需要优化的是推送的时机和相应的素材;
2) 在推送时机上:算法会根据用户的偏好和个性化行为数据,计算每个用户的个性化推送时间,在用户空闲的时间推送(避免在不合适的时间打扰用户,同时也能提升用户看到推送的可能性)。
3) 在推送素材上:算法会根据素材的实时点击反馈,对素材做实时赛马。只发用户感兴趣的素材,提高用户点击意愿。
通过以上我们的分析和技术优化手段,整体弱推送链路链路有了不错的提升,离线消息的到达率相对提升了两位数。
本篇主要和大家聊的是只是IM消息系统链路中的一环——弱感知链路的优化,落地到到具体的业务也就是离线消息送达率问题。
整体IM消息系统,还是一个比较复杂的领域。
我们在消息系统的发展过程中,面临着如下问题:
1) 如何进行消息的链路追踪;
2) 如何保证IM消息的快速到达(见《 闲鱼亿级IM消息系统的及时性优化实践 》);
3) 如何将消息的玩法和底层能力分离;
4) 离线推送中如何通过用户找到对应的设备。
这些问题,我们在以前的文章中有所分享,以后也会陆续分享更多,敬请期待。
[1] Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
[2] 一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践
[3] 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等
[4] 一套亿级用户的IM架构技术干货(下篇):可靠性、有序性、弱网优化等
[5] 从新手到专家:如何设计一套亿级消息量的分布式IM系统
[6] 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
[7] 融云技术分享:全面揭秘亿级IM消息的可靠投递机制
[8] 移动端IM中大规模群消息的推送如何保证效率、实时性?
[9] 现代IM系统中聊天消息的同步和存储方案探讨
[10] 新手入门一篇就够:从零开发移动端IM
[11] 移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”
[12] 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结
[13] IM消息送达保证机制实现(一):保证在线实时消息的可靠投递
[14] IM消息送达保证机制实现(二):保证离线消息的可靠投递
[15] 零基础IM开发入门(一):什么是IM系统?
[16] 零基础IM开发入门(二):什么是IM系统的实时性?
[17] 零基础IM开发入门(三):什么是IM系统的可靠性?
[18] 零基础IM开发入门(四):什么是IM系统的消息时序一致性?
(本文已同步发布于: )
建议大家刚开始学一定要静下心来把基础打好,不要只看视频或者书籍,多动手去实践。正确的前端学习路线:html语法、格式,常用的标签极其作用,理解标签的嵌套,学习使用firefox+firebug或者chrom的调试工具。CSS重点看盒子模型,定位,层级,过渡,动画和 transform。知道原理和规则。大部分工作都是照着设计稿化。掌握上面几个99%还原也不难。接下来重点学习几种常见的布局。学完之后去学flex。最后sass、less,基本就差不多了。千锋软件开发培训课程的授课模式采用全程面授,讲师成本虽高,但是效果却是显著的,和学员面对面沟通,了解到学员在学习过程中遇到的问题,动态地调整授课方式。千锋教育就有线上免费的软件开发公开课,。
HTML、CSS学完可以制作出简单的静态页面。js的执行顺序,基本的编程基础(变量、运算、流程控制、数组、调用函数、自定义函数、对象)、json、js的dom操作、js的事件机制(委托、绑定、监听,冒泡和阻止冒泡,兼容性)了解ajax的xmlhttprequest及其创建方法(多浏览器兼容)、跨域,明白其工作原理,熟悉http协议。js学完可以实现运用js语言为页面增加动态效果,达到用户交互的目的。千锋教育集团目前已与国内4000多家企业建立人才输送合作,与500多所大学建立实训就业合作,每年为各大企业输送上万名移动开发工程师,每年有数十万名学员受益于千锋教育组织的技术研讨会、技术培训课、网络公开课及免费教学视频。
在通往人工智能的路上,Google一直在不停地买买买。而且Google在人工智能领域的收购其实从2006年就开始了。
DeepMind(2014年1月26日被Google收购)
Deepmind可以说是当下最火的人工智能初创公司,于2014年1月26日被Google收购。
虽然被谷歌收购,但是DeepMind一直是独立运营的,他们的目标是开发能够“独立思考”的软件。为了能够开发这种类型的人工智能软件,DeepMind在海量数据集合的帮助下使用机器学习等技术训练自己的人工智能去完成某些工作任务。
api.ai(2016年9月19日被Google收购)
api.ai的API可以透过语音辨识、意图辨识和上下文语境理解等技术,让电脑理解人类语言并转换为行动,协助开发者打造类似Siri的对话式智慧助理,可用于聊天机器人、App、智慧家电等。
api.ai已经证明他们可以协助开发者设计、开发和不断改进会话式界面。超过6万名开发者正使用API.ai的工具开发会话式体验。api.ai提供了业界领先的会话式用户界面平台,能够协助谷歌指导开发者持续开发优秀的自然语言界面。
Moodstocks(2016年7月6日被Google收购)
Moodstocks公司成立于2008年,作为一个小的创业公司,他们的规模并不大。
Moodstocks公司是以图像识别技术为主,并推出了智能手机的图像识别应用程序Moodstocks Notes。在加入谷歌在巴黎的研发团队之后,他们将继续研发自己的视觉图像识别工具。
Dark Blue Labs(2014年10月23日被Google收购)
Dark Blue Labs是一家深度学习公司,主要从事数据架构以及算法开发工作,被收购后并入DeepMind。
Jetpac(2014年8月17日被Google收购)
总部位于旧金山的Jetpac通过Instagram等社交图片分享工具制作城市导游服务。通过分析食品、装饰和人物图片,Jetpac的软件便可对城市的各种特点进行分析。
Jetpac被收购前有三款智能手机应用,包括一款城市导游助手、一款图片分析器和一款图片探测工具,被收购后并入Picasa中。
Emu(2014年8月6日被Google收购)
Emu是一个类似语音助手Siri但却是“通过文本消息服务的内置助手”。
它整合了类似Siri个人助理的功能,将会根据你的聊天记录,自动执行移动助理的任务。比如自动建立日程、设置时间提醒、甚至还能帮你预定餐馆。
Emu被Google收购后主要用于Google Hangouts以及Google Now中。
Flutter(2013年10月2日被Google收购)
Flutter2010年底由Navneet Dalal和Mehul Nariyawala创办,利用计算机视觉技术结合手势监测识别技术,使得用户可以用简单的手势来操控电脑和移动设备。
Flutter被Google收购后主要应用在Android以及Google X项目中。
Wavii(2013年4月23日被Google收购)
Wavii是一家成立于2009年3月的自然语言处理技术公司,总部位于西雅图。
Wavii主要做的是扫描网络、寻找新闻、然后进行总结,并附上文章来源的全文链接。
Wavii被Google收购后主要应用在Google Knowledge Graph(Google知识图谱)中。
DNNresearch(2013年3月12日被Google收购)
DNNresearch公司是由深度学习大神Geoffrey Hinton与他的两个研究生Alex Krizhevsky和Ilya Sutskever成立。由于谷歌在本次收购中没有获得任何实际的产品或服务,所以本次收购实际上属于人才性收购,收购的主体是为了这三人团队。
Viewdle(2012年10月1日被Google收购)
Viewdle是一家成立于2006年的乌克兰公司,被收购前主要做的是增强现实和面部识别。
Viewdle曾经推出的应用包括SocialCamera和Third Eye,Social Camera是其推出的首款应用,用户只需通过Faceprint教会你的相机识别好友,此后只要照片中出现了这些好友,SocialCamera就可以自动为他们打上标签。
Viewdle被Google收购后主要应用在Android中。
Clever Sense(2011年12月13日被Google收购)
Clever Sense是本地推荐应用Alfred的开发商。Alfred的独特之处在于它将人工智能和机器算法有机结合,为用户提供个性化的场所推荐,推荐的场所包括附近的餐馆、咖啡厅、酒吧和夜店。
Clever Sense被Google收购后主要应用在Android中。
PittPatt(2011年7月23日被Google收购)
PittPatt是一家由卡耐基梅隆大学孵化的专注于人脸识别和模式识别公司,其开发了一项能在照片、视频和其他媒介之中识别匹配人脸的技术,创造了一系列人脸检测、跟踪和识别的算法。
PittPatt的人脸检测和跟踪的软件开发工具包(SDK)能在照片中确定人脸的位置,在视频中跟踪人脸的移动情况。
PittPatt被Google收购后主要应用在Android中。
SayNow(2011年1月25日被Google收购)
SayNow是一家成立于2005年的语音识别公司,总部位于美国加州帕罗奥托(Palo Alto)市。
SayNow的平台可将语音通讯、一对一通话和集团通话整合到Facebook和Twitter等社交网站,以及Android和iPhone手机应用中。
SayNow被Google收购后主要应用在Google Voice中。
Phonetic Arts(2010年12月3日被Google收购)
Phonetic Arts公司是一家位于英国的语音合成技术厂商。被Google收购前Phonetic Arts公司的语音合成技术主要用在游戏中,但谷歌希望将该技术用于其电脑声音自动输出系统,以使机器合成的人声更像人类的声音以及更加流利。
Phonetic Arts被Google收购后主要应用在Google Voice和Google Translate中。
Metaweb(2010年7月16日被Google收购)
Metaweb是一家从事语义搜索(Semantic Search)技术开发的风险企业,目标是开发用于Web的语义数据存储的基础结构。
Metaweb被Google收购后主要应用在Google Search中。
Neven Vision(2006年8月15日被Google收购)
这个可以说是Google最早在人工智能领域的收购了,可以追溯到2006年。
Neven Vision是一家图像识别技术公司,其能自动从图片里提取信息、并且辨认图片的内容,被收购前主要应用于手机以及美国政府和执法部门的计量生物学应用中。
Neven Vision被Google收购后主要应用在Picasa以及Google Goggles中。
Uniapp目前比较成熟,而且用的是Vue语法,学习成本比较低,而且行业里面用的也比较广泛,而Flutter的话,学习成本略高,因为要学习新的语言,还有就是目前生态不是特别完备,等他再发展发展吧。黑马程序员官网有成套免费视频哦,有什么不懂的可以直接过去学习。您的采纳是对我成长的鞭策
你是在做企业信息化的初期调研吗,传统的实施方案,要么购买成品软件,要么定制开发。其实还有另一种,就是利用快速开发平台自己搭建,如华创信息管理平台。它无需编程、简单易用,能让用户自己搭建管理软件、自主实施信息化,能容纳并管理各种数据。其好处就是完全按自己的要求弄,可按轻重缓急逐步实施,不会有多余的没用的模块,且后期可随时根据自己需要调整。
有了平台,您就能做 ERP、CRM、HR、PM、OA ... 等各种系统,一个平台等值于多套传统软件,比较实用。