在此消息系统的建设过程中,我们经历了从简单到复杂、从困扰到破局,每一次的技术改变都是为了更好的解决当下业务所面临的问题。
本文分享的是闲鱼即时消息系统架构从零开始的技术变迁之路,以期更多的同行们在此基础上汲取经验,得到有价值的启发。
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》- 开源IM框架源码:
《阿里IM技术分享(一):企业级IM王者——钉钉在后端架构上的过人之处》
《阿里IM技术分享(二):闲鱼IM基于Flutter的移动端跨端改造实践》
《阿里IM技术分享(三):闲鱼亿级IM消息系统的架构演进之路》(* 本文)
《阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠性投递技术实践》(* 稍后发布)
2014年启动闲置交易独立APP “闲鱼”,一期构建完成APP主链路,包含商品:发布→搜索→商品详情→IM会话→交易。
作为初创app,业务需尽快上线验证效果,技术建设上需要完成闲鱼消息从无到有的系统搭建。
因会话模型的差异,淘系已有的消息系统,短期内无法满足业务需求,而闲鱼完全自建消息系统耗时巨大。
为了保障业务高效上线,技术选型上最大化复用已有系统能力,避免重复造轮子。
闲鱼用户量正快速突破100万,即时消息服务的调用量暴涨。在这样的背景下,用户反馈消息数据获取的卡顿、白屏成为常态,大量的消息Push发送下,系统告警频发。
1.0版的架构模式下,获取消息数据全量拉模式,客户端纯UI不做数据存储。
比如1W个用户同时在线聊天,按照当前架构并发拉取全量消息,估算5万QPS。不妨假设,同时在线万时,对服务端压力可想而知。4.2 技术方案
1)会话模型:由owner、itemid、user、sessionType 来标识唯一会话,增加扩展属性支持个性化;
2)摘要模型:作为用户会话视图,同一会话的不同用户可个性化呈现,由userid、sid标识唯一摘要;
3)消息模型:由sender、消息内容、消息版本、sid组成。sid+消息版本唯一确定一条消息;
4)指令模型:是一种双端约定,由服务端下发,客户端执行的指令集。如免打扰指令、删除指令等。
1)在线通道:使用淘宝无线ACCS长连接提供的全双工、低延时、高安全的通道服务;
2)离线通道:使用淘宝消息推送平台AGOO. 其屏蔽了各主流厂商对接的复杂度,直接对业务系统提供服务。
当消息数据存储在本地设备上,消息同步从全量拉取优化为全量+增量同步结合的模式。增量和全量同步具体指的是:
(收件箱模型):以和客户端进行增量数据同步。同时,1.0版本架构中存在的读多写少的问题,通过个人域环的写扩散来平衡读写压力。
1)域环存储:域环需要支持高并发数据读写,使用阿里分布式KV存储系统tair来实现;
2)域环容量:为减少全量消息同步,以用户下次进入闲鱼需要同步的平均消息量来规划个人域环容量。同时利用FIFO循环覆盖历史数据;
3)域环版本:用户当前消息位点,在消息进入个人域环时通过tair的counter实现域环版本严格连续递增,用于全量、增量同步判断。
上述建设完成后,闲鱼具备了自己独立的即时消息系统,当下遇到的问题得到了缓解,用户体验度有大幅提升。
随着闲鱼业务生态的丰富,IM会话与消息内容类型不断扩展,同时在用户量的快速增长下,用户反馈消息收不到、消息延迟等舆情问题日渐突出。
闲鱼app进程无有效保活机制im新闻,app退到后台后进程很快就会被系统挂起,导致长连接中断。此时消息推送走厂商通道,而厂商通道的实时性较差,且对消息推送的优先级设定有差异,从而造成用户感知消息延迟。
accs在线消息推送时,平均延时较短,但存在假连情况。而且目前的消息推送链路无ack机制,造成服务端以为消息发出去了但实际上客户端并没有收到,用户下次打开app后才能看到消息,用户感知消息延迟。
造成假连接的原因主要是用户退到后台,accs长连中断,但是设备状态更新有延时。
目前消息同步的推模式(accs push)、拉模式(mtop),客户端未做隔离,异步进行处理,导致在某些极端情况下消息数据库处理异常,引发消息丢失。
某用户上线后连续收到多条消息,其中一条触发域黑洞,在进行消息同步端上数据重建时,小概率处理出错。
大部分线上消息问题发现靠舆情反馈,如消息错乱,出问题后系统无感知、无补救措施且排查困难,仅能跟随版本做修复。
业务不断丰富,孵化出基于消息系统的服务号及小程序内容营销、消息群组等,各类消息发送链路共用域环与数据存储,造成稳定性问题。
个人域环的消息包括IM聊天和营销消息,IM聊天由用户触发,需要保证强到达;而营销消息一般是由系统通过班车等方式批量发送,消息量级大,tps高,影响IM服务稳定性。5.3 解案决方案
a. ACK:保障消息及时到达。服务端下行accs消息时,将消息加入重试队列并延迟重试,客户端在收到accs消息并处理成功后,给服务端回一个ack,服务端收到ack后更新消息到达状态,并终止重试,以此避免设备假连或网络不稳定的情况;
b. 重发:根据延迟重发策略决定何时重发消息,保障消息确定性到达。自适应延迟重发策略是指新消息先通过4次固定N秒的短延迟来探测设备的网络状况,然后根据网络状况来递增固定步长M的延迟策略,这种策略可以保障在最短的时间内,使用最少的重发次数将消息投递成功;
c. 消息队列:端上引入消息队列,按顺序处理消息,保证消息处理的准确性。同时进行推拉隔离,保障队列有序消费,解决了复杂状况下并发处理消息数据合并出错的问题。
闲鱼每天发送的即时消息中有一半以上是营销消息,营销消息的发送具有明显的波峰波谷流量IM电竞,高峰期会导致消息数据库抖动,影响IM消息。我来对消息、摘要、域环存储做业务隔离,以适应不同业务场景对稳定性不同的要求。
Lindorm是一种多模型的云原生数据库服务,具有成本低、自定义TTL、容量横向扩展等优势。
保障稳定性的关键要素是做好各种核心指标的监控,而监控首先要有数据来源,对服务端+客户端的关键链路节点埋点,基于集团UT、SLS,通过blink进行实时清洗、计算,最终形成统一规范的日志数据落至SLS,以供实时监控及链路排查。
消息系统的核心目标是保障用户消息发的出、收得到且及时收到,所以我们通过计算发送成功率、到达率、消息延迟来监控系统的稳定性。
经过一系列专项治理,技术类舆情下降50%,从0到1建设了消息稳定性体系,用户体验进一步提升。
闲鱼作为电商交易APP, 其中IM是交易的前置链路,IM的产品体验极大影响用户交易效率。
前段时间进行用户调研,从闲鱼IM的NPS低于预期(NPS是用户忠诚度衡量指标 = 推荐者%-贬损者%)。
同步协议冗余,在需求迭代过程中容易引发问题、有效保活机制的缺失对消息即时送达的影响、小众机型离线消息收不到、多年的数据积累在线库臃肿等问题,影响着闲鱼业务迭代速度与NPS。作为技术团队,下一步将提升NPS作为核心技术目标,闲鱼的即时消息系统4.0版架构正在路上 ......
[1] 更多阿里巴巴的技术资源:《阿里钉钉技术分享:企业级IM王者——钉钉在后端架构上的过人之处》《现代IM系统中聊天消息的同步和存储方案探讨》《阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史》《阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路》《来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享》《钉钉——基于IM技术的新一代企业OA平台的技术挑战(视频+PPT) [附件下载]》《阿里技术结晶:《阿里巴巴Java开发手册(规约)-华山版》[附件下载]》《重磅发布:《阿里巴巴开发手册(规约)》[附件下载]》《作者谈《阿里巴巴Java开发手册(规约)》背后的故事》《《阿里巴巴开发手册(规约)》背后的故事》《干了这碗鸡汤:从理发店小弟到阿里P10技术大牛》《揭秘阿里、腾讯、华为、百度的职级和薪酬体系》《淘宝技术分享:手淘亿级移动端接入层网关的技术演进之路》《难得干货,揭秘支付宝的2维码扫码技术优化实践之路》《淘宝直播技术干货:高清、低延时的实时视频直播技术解密》《阿里技术分享:电商IM消息平台,在群聊、直播场景下的技术实践》《阿里技术分享:闲鱼IM基于Flutter的移动端跨端改造实践》《阿里IM技术分享(三):闲鱼亿级IM消息系统的架构演进之路》[2] 有关IM架构设计的文章:《浅谈IM系统的架构设计》《简述移动端IM开发的那些坑:架构设计、通信协议和客户端》《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》《一套原创分布式即时通讯(IM)系统理论架构方案》《从零到卓越:京东客服即时通讯系统的技术架构演进历程》《蘑菇街即时通讯/IM服务器开发之架构选择》《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》《微信后台基于时间序的海量数据冷热分级架构设计实践》《微信技术总监谈架构:微信之道——大道至简(演讲全文)》《如何解读《微信技术总监谈架构:微信之道——大道至简》》《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》《移动端IM中大规模群消息的推送如何保证效率、实时性?》《现代IM系统中聊天消息的同步和存储方案探讨》《微信朋友圈千亿访问量背后的技术挑战和实践总结》《子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践》《微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)》《一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践》《社交软件红包技术解密(一):全面解密QQ红包技术方案——架构、技术实现等》《从游击队到正规军(一):马蜂窝旅游网的IM系统架构演进之路》《从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结》《从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践》《瓜子IM智能客服系统的数据架构设计(整理自现场演讲,有配套PPT)》《IM开发基础知识补课(九):想开发IM集群?先搞懂什么是RPC!》《阿里技术分享:电商IM消息平台,在群聊、直播场景下的技术实践》《一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等》《一套亿级用户的IM架构技术干货(下篇):可靠性IM电竞、有序性、弱网优化等》《从新手到专家:如何设计一套亿级消息量的分布式IM系统》《企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等》《融云技术分享:全面揭秘亿级IM消息的可靠投递机制》《IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计》《阿里IM技术分享(三):闲鱼亿级IM消息系统的架构演进之路》 更多同类文章 ……本文已同步发布于“即时通讯技术圈”公众号。同步发布链接是:
财联社10月27日电,波音公司称,如果许可没有得到续期,那么将取消737 MAX-7 和-10机型的进一步开发进程。
财联社10月26日电,沙特阿美CEO表示,沙特阿美正在考虑(投资)日本和韩国的氢能源市场。
靠自己创业赚够斯坦福两百万学费,这位“非典型学霸”说,不要浪费任何一场苦难