闲鱼消息发展回顾

引言

闲鱼消息系统经过几代开发的建设,目前稳定的支撑亿级消息体量。在消息系统建设过程中,我们经历了从简单到复杂,从困扰到破局,每一次的技术改变都是为了更好的解决当下业务面临的问题。“忆昔午桥桥上饮,坐中多是豪英“,此文记录闲鱼消息系统技术变迁,以期在此基础上汲取更多经验。

闲鱼消息1.0:业务初创期,最小化可用

背景:14年启动闲置交易独立APP “闲鱼”,一期构建完成APP主链路,包含商品发布→搜索→商品详情→IM会话→交易。作为初创app,业务需尽快上线验证效果,技术建设上需要完成闲鱼消息从无到有的系统搭建。

作为即时通讯系统,最小化能力包含

  1. 消息存储:会话、摘要、消息

  2. 消息同步:推、拉

  3. 消息通道:长连接、厂商推送

与一般IM会话模型不同的是,闲鱼会话以商品为主体,人+人+商品为要素构建会话,因会话模型的差异,淘系已有的消息系统,短期内无法满足业务需求,而闲鱼完全自建消息系统耗时巨大。为了保障业务高效上线,技术选型上最大化复用已有系统能力,避免重复造轮子。所以,

  1. 数据模型与底层存储依赖淘系私信体系进行建设;

  2. 消息数据获取上,客户端全量从服务端拉取消息数据

  3. 通讯协议使用来往SDK及mtop

总体架构如下图,以此模式完成快速交付保障了业务最小化可用

闲鱼消息2.0:用户量高增速,重建闲鱼消息系统

背景

闲鱼用户量快速突破100W,消息服务调用量暴涨。常态性的,用户反馈消息数据获取卡顿、白屏,大量的push发送下,系统告警频发。

造成这些问题的原因:消息1.0 模式下,获取消息数据全量拉模式,客户端纯UI不做数据存储

  1. 当用户需要查看消息数据时,数据拉取成功与否取决于网络、数据访问速度,偶发性的造成卡顿、白屏

  2. 中心化的数据存储,读远大于写,高并发下,服务端负载过大 比如1W个用户同时在线聊天,按照当前架构并发拉取全量消息,估算5Wqps. 不妨假设,同时在线聊天用户数10W时,对服务端压力可想而知

基于上述问题,我们决定重建消息系统,以应对未来更大的用户增量。回归到IM系统的核心功能

消息存储模型

会话模型:由owner、itemid、user、sessionType 来标识唯一会话,增加扩展属性支持个性化 

摘要模型:作为用户会话视图,同一会话的不同用户可个性化呈现,由userid、sid标识唯一摘要 

消息模型:由sender、消息内容、消息版本、sid组成。sid+消息版本唯一确定一条消息 

指令模型:是一种双端约定,由服务端下发,客户端执行的指令集。如免打扰指令、删除指令等 

消息通道

在线通道:使用淘宝无线ACCS长连接提供的全双工、低延时、高安全的通道服务。

离线通道:使用淘宝消息推送平台AGOO. 其屏蔽了各主流厂商对接的复杂度,直接对业务系统提供服务 

消息同步模型

  1. 客户端建立数据库,存储消息数据 当消息数据存储在本地设备上,消息同步从全量拉取优化为全量+增量同步结合的模式。增量同步:客户端存储消息位点信息,通过与服务端最新位点比较,仅同步增量消息;全量同步:当用户卸载重装或位点gap过大时,客户端全量拉取历史消息数据,进行端上数据重建

  2. 服务端建设个人消息域环(收件箱模型),以和客户端进行增量数据同步。同时,消息1.0版本存在的读多写少的问题,通过个人域环的写扩散来平衡读写压力

下图为一条消息从发送到接收的过程以及服务端和客户端的执行流程

如图所示,假设Ua给Ub发送一条消息,消息写扩散至Ua和Ub的各自的域环中。

  1. 当客户端online时,接收到推送的消息位点=当前端上域版本+1,本地消息数据库merge即可

  2. 当客户端offline时,仅进行离线推送通知,当用户重新上线时,进行数据同步,由服务端判断触发增量同步还是全量同步     

    1. 如果域环版本差值小于阀值,增量同步后,进行本地消息数据库merge    

    2. 当域环版本差值大于阀值,进行全量消息拉取,做端上数据重建

整个同步逻辑基于闲鱼的消息域环,域环可以看作是有着固定容量的用户消息收件箱,给一个用户发送的所有消息都会同步到他的域环中。 

域环存储:域环需要支持高并发数据读写,使用阿里分布式KV存储系统tair来实现 

域环容量:为减少全量消息同步,以用户下次进入闲鱼需要同步的平均消息量来规划个人域环容量。同时利用FIFO循环覆盖历史数据 

域环版本:用户当前消息位点,在消息进入个人域环时通过tair的counter实现域环版本严格连续递增,用于全量、增量同步判断

上述建设完成后,闲鱼具备了自己独立的消息系统,当下遇到的问题得到了缓解,用户体验度有大幅提升。

闲鱼消息3.0:业务快速发展下,系统稳定性保障

背景

随着闲鱼业务生态的丰富,IM会话与消息内容类型不断扩展,同时在DAU的快速增长下,用户反馈消息收不到、消息延迟等舆情问题日渐突出。

问题分析

1.闲鱼app进程无有效保活机制,app退到后台后进程很快就会被系统挂起,导致长连接中断。此时消息推送走厂商通道,而厂商通道的实时性较差,且对消息推送的优先级设定有差异,从而造成用户感知消息延迟 

2.accs在线消息推送时,平均延时较短,但存在假连情况,而且目前的消息推送链路无ack机制,造成服务端以为消息发出去了但实际上客户端并没有收到,用户下次打开app后才能看到消息,用户感知消息延迟。造成假连接的原因:用户退到后台,accs长连中断,但是设备状态更新有延时。

3.目前消息同步的推模式(accs push)、拉模式(mtop),客户端未做隔离,异步进行处理,导致在某些极端情况下消息数据库处理异常,引发消息丢失。比如某用户上线后连续收到多条消息,其中一条触发域黑洞,在进行消息同步端上数据重建时,小概率处理出错。

4.大部分线上消息问题发现靠舆情反馈,如消息错乱,出问题后系统无感知、无补救措施且排查困难,仅能跟随版本做修复 

5.业务不断丰富,孵化出基于消息系统的服务号及小程序内容营销、消息群组等,各类消息发送链路共用域环与数据存储,造成稳定性问题。如个人域环的消息包括IM聊天和营销消息,IM聊天由用户触发,需要保证强到达;而营销消息一般是由系统通过班车等方式批量发送,消息量级大,tps高,影响IM服务稳定性

基于上述分析,我们进行专项解决。

消息重发与推拉隔离

ACK: 保障消息及时到达。服务端下行accs消息时,将消息加入重试队列并延迟重试,客户端在收到accs消息并处理成功后,给服务端回一个ack,服务端收到ack后更新消息到达状态,并终止重试,以此避免设备假连或网络不稳定的情况。

重发:根据延迟重发策略决定何时重发消息,保障消息确定性到达。自适应延迟重发策略是指新消息先通过4次固定N秒的短延迟来探测设备的网络状况,然后根据网络状况来递增固定步长M的延迟策略,这种策略可以保障在最短的时间内,使用最少的重发次数将消息投递成功。

消息队列:端上引入消息队列,按顺序处理消息,保证消息处理的准确性。同时进行推拉隔离,保障队列有序消费,解决了复杂状况下并发处理消息数据合并出错的问题。

数据存储拆分 

闲鱼每天发送的消息中有一半以上是营销消息,营销消息的发送具有明显的波峰波谷流量,高峰期会导致消息数据库抖动,影响IM消息。对消息、摘要、域环存储做业务隔离,以适应不同业务场景对稳定性不同的要求。

  1. IM消息需要极高的稳定性保证,其消息及摘要继续使用mysql存储

  2. 营销消息存储周期短,稳定性要求低于IM,采用Lindorm存储。Lindorm是一种多模型的云原生数据库服务,具有成本低、自定义TTL、容量横向扩展等优势

  3. 域环做实例级别隔离,保证IM域环的容量不会被其他消息占用,从而影响到消息同步

线上问题发现与恢复 

保障稳定性的关键要素是做好各种核心指标的监控,而监控首先要有数据来源,对服务端+客户端的关键链路节点埋点,基于集团UT、SLS,通过blink进行实时清洗、计算,最终形成统一规范的日志数据落至SLS,以供实时监控及链路排查。

消息系统的核心目标是保障用户消息发的出、收得到且及时收到,所以我们通过计算发送成功率、到达率、消息延迟来监控系统的稳定性。此外,为了解决用户舆情排查困难的问题

  1. 我们设计了一套指令集,通过约定指令协议,服务端向指定用户下发指令,客户端执行对应指令进行异常数据上报,提高排查效率

  2. 扩展了强制全量同步、数据校正等指令,定向修复用户消息数据问题,相较以往出现严重bug只能让用户卸载重装解决,这种方式显然对用户是更友好的

经过一系列专项治理,技术类舆情下降50%,从0到1建设了消息稳定性体系,用户体验进一步提升。

庞大的用户体量下,追求极致的NPS

闲鱼作为电商交易APP, 其中IM是交易的前置链路,IM的产品体验极大影响用户交易效率 前段时间进行用户调研,从闲鱼IM NPS低于预期(NPS是用户忠诚度衡量指标 = 推荐者%-贬损者%),从用户反馈来看:

  1. 部分用户对产品功能有较强烈的诉求,诸如消息搜索、分组等

  2. 大部分用户对发送消息过程中的违规问题难以理解

  3. 仍有较多舆情反馈消息收不到或延迟

映射到目前闲鱼的消息系统上,我们的系统架构依然有很多需要持续改进的地方。典型的如同步协议冗余,在需求迭代过程中容易引发问题、有效保活机制的缺失对消息即时送达的影响、小众机型离线消息收不到、多年的数据积累在线库臃肿等问题,影响着闲鱼业务迭代速度与NPS。将提升NPS作为核心目标,闲鱼消息4.0进行时。

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

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

相关文章

电商搜索里都有啥?详解闲鱼搜索系统(长文)

搜索是电商平台的核心流量入口,承载着平台主要的成交引导、意图收敛、活动投放。一个稳定、高效、可扩展的搜索系统是电商平台得以生存发展的基石。本文探讨如何构建完善的商品搜索系统, 并根据闲鱼二手交易的差异化特性介绍闲鱼搜索系统的时效性优化。 …

闲鱼关键词,实现闲鱼APP的特定关键字商品检索

最近碰上个需求 需要根据关键词检索出所有商品,可以指定价格范围,地点,和最新排序,去发现有某位大佬的一个项目刚好符合这个需求。放到这里分享一下给大家。因为系统不便公开需要的可以找我 任务设置页面 可以设置关键词&#xf…

闲鱼商品选投实时性优化

马赫是闲鱼的选品和投放系统,闲鱼业务中多数商品都是孤品即单库存商品,所以商品的实时变更需要即刻反馈到选品和投放链路中,为了满足业务诉求马赫设计之初就把实时性作为最重要的技术目标,随着系统的运行数据的膨胀实时性也遇到了…

闲鱼已售商品信息查询系统。手搓市场定价/行情查询利器

前段时间自己手搓出来一个闲鱼已售商品查询接口,最近有时间,就把接口搞成了软件。 软件作用: 可以方便地查询闲鱼已经成交的商品信息,包括成交价格、成交时间、挂单后多少天成交(成交效率)、以及商品信息&a…

产品优化策略,有效提升产品自身竞争力,我赌你一定没用过

新媒体时代自移动互联网诞生之日便处于不断变化的事态之中,为了迎合时代发展要求,大数据、云计算等移动互联网技术获得了迅猛发展,智能手机也已经成为人们生活、工作中不可或缺的元素。在智能手机中,各种类型的APP占据了智能手机很…

2022届计算机毕业论文(设计)学生选题参考合集推荐收藏

大四的同学马上要开始毕业设计啦,大家做好准备了没! 给大家详细整理了计算机毕设最新选题,对选题有任何疑问,都可以问我哟~ 1基于JavaEE的问卷调查系统的设计与实现2基于SSM的山西工商学院校园跑腿代取系统的设计与实现3基于Web的…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列一

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于requests多线程…

湖北专升本数据结构

绪论 1.线性结构:是一一对应的关系。 2.集合结构:相当于一个班级,一个圈里面有很多。 3.“树”的数据结构:一对多的关系。 4.“图”的数据结构:多对多的关系。 名词解释 数据:是客观事实的符号表示,是所有能输入到计算机的符号的名称。 数据元素:…

英语四六级过了专升本可以加分吗?天津专升本英语四级加分取消

2021-2022年天津专升本考试中,全国大学英语四六级过了,那么天津专升本考试可以加分吗?天津专升本英语四级加分是不是与2020年取消了? 全国大学英语四、六级考试成绩的话题,又双叒叕登上了微博热搜 每到查分时&#xff…

专升本英语6套学习笔记和三套模拟试卷

第一部分 词汇背诵 1. literature [lit(ə)rətʃə] n. 文学;文献 I love literature since I was young. 从小我就热爱文学。 There is now a vast literature on the subject. 现在有关这个学科的文献特别多。 2. garment [gɑ:m(ə)nt] n. 衣服 The garm…

江苏专转本英语提分技巧

说专转本得英语者得天下,英语是所有专转本专业类别的必考科目,也是拉分科目。之前有转本人问老师,基础不好,短时间怎么把分数提上去?综合来看,“阅读理解”是最好提分的一个题型。“阅读理解”是很多省份英…

河南省专升本考试技巧与选择题

标题解释: 我并未涉及过任何大数据项目的开发,题目叫做大数据分析,是为了做seo。 如果我把标题写成数据统计,的确更贴合我这篇文章的意思 那大概这篇文章就石沉大海了。 我对大数据的理解只有很浅薄的一层,但是对于做…

C语言案例(安徽专升本常考)

案例目录 数学类程序完数(完全数)求亲密数水仙花数(阿姆斯特朗数)求自守数求勾股数求三角形面积最大公约数小公倍数一元二次方程求根素数(质数、哥德巴赫猜想)猴子吃桃斐波那契数列(兔子生崽&am…

专升本C语言

程序设计题 两个月的坚持,终不负所望,希望我自己写的题库能为你们寻求一些帮助(针对湖北专升本C语言),希望你们也能不负所托。题的 排名不分先后 文章目录 程序设计题判断是否是质数(素数)最大…

重庆专升本历年考试真题+答案解析,长期更新

重庆专升本历年真题 数学篇 2005年重庆专升本《高等数学》真题及答案解析 2006年重庆专升本《高等数学》真题及答案解析 2007年重庆专升本《高等数学》真题及答案解析 2008年重庆专升本《高等数学》真题及答案解析 2009年重庆专升本《高等数学》真题及答案解析 2010年重…

2022年9月各大学网络教育统考大学英语B考试复习题库

2022年起,网考办不再组织全国统一考试,网络教育统考将由各高校自行组织;2022年9月部分高校已经下发了统考通知,2022年9月份统考的部分院校有:2022年9月电子科技大学网络教育统考、2022年9月江南大学网络教育统考 、202…

专升本英语——应试题型突破——翻译——固定搭配【学习笔记】

全部知识点请进入:专升本英语——学习笔记【知识点全轻松学习】!!! https://blog.csdn.net/liu17234050/article/details/104576823 目录: 一:would rather do .....than do..... 宁愿......而不......…

2022年9月各大学网络教育统考《大学英语B》考试复习题库

凡就读“各高校网络教育”、“奥鹏教育”的“高起本”以及“专升本”学生,需参加网络教育统考(符合免考条件的学生可不用参加),根据就读层次以及所学专业的不同,统考科目也将不同(除了艺术专业和英语专业外…

C语言专升本编程题复习

1.求100以内的素数 int main( ) { int i,j,count0;for(i1;i<100;i){for(j2;j<i;j){if(i%j0)break;}if(ij){count; printf("%d ",i);if(count%50)printf("\n");}} }2.求1000以内的完数 * 完数&#xff1a;等于其因子&#xff08;不含本身&…