闲鱼消息发展回顾

闲鱼x-sign, x-mini-wua算法签名接口调用 闲鱼x-sign, x-mini-wua签名算法接口 阅读详情

简介: 转自闲鱼技术 作者:今朝 、有攸

OpenIMgithub开源地址:

https://github.com/OpenIMSDK/Open-IM-Server

OpenIM官网 :https://www.rentsoft.cn

OpenIM官方论坛:https://forum.rentsoft.cn/

引言

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

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

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

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

  1. 消息存储:会话、摘要、消息
  2. 消息同步:推、拉
  3. 消息通道:长连接、厂商推送

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

  1. 数据模型与底层存储依赖淘系私信体系进行建设;
  2. 消息数据获取上,客户端全量从服务端拉取消息数据
  3. 通讯协议使用来往SDK及mtop

总体架构如下图,以此模式完成快速交付保障了业务最小化可用
闲鱼消息2.0_域环同步.png

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

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

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

  1. 当用户需要查看消息数据时,数据拉取成功与否取决于网络、数据访问速度,偶发性的造成卡顿、白屏
  2. 中心化的数据存储,读远大于写,高并发下,服务端负载过大
    比如1W个用户同时在线聊天,按照当前架构并发拉取全量消息,估算5Wqps. 不妨假设,同时在线聊天用户数10W时,对服务端压力可想而知

基于上述问题,我们决定重建消息系统,以应对未来更大的用户增量。回归到IM系统的核心功能
闲鱼消息架构图.png
消息存储模型:
会话模型:由owner、itemid、user、sessionType 来标识唯一会话,增加扩展属性支持个性化
摘要模型:作为用户会话视图,同一会话的不同用户可个性化呈现,由userid、sid标识唯一摘要
消息模型:由sender、消息内容、消息版本、sid组成。sid+消息版本唯一确定一条消息
指令模型:是一种双端约定,由服务端下发,客户端执行的指令集。如免打扰指令、删除指令等
消息通道:
在线通道:使用淘宝无线ACCS长连接提供的全双工、低延时、高安全的通道服务。
离线通道:使用淘宝消息推送平台AGOO. 其屏蔽了各主流厂商对接的复杂度,直接对业务系统提供服务
消息同步模型:
1.客户端建立数据库,存储消息数据

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

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

下图为一条消息从发送到接收的过程以及服务端和客户端的执行流程
闲鱼消息2.0_域环同步.png

如图所示,假设Ua给Ub发送一条消息,消息写扩散至Ua和Ub的各自的域环中。
1.当客户端online时,接收到推送的消息位点=当前端上域版本+1,本地消息数据库merge即可
2.当客户端offline时,仅进行离线推送通知,当用户重新上线时,进行数据同步,由服务端判断触发增量同步还是全量同步

    如果域环版本差值小于阀值,增量同步后,进行本地消息数据库merge
     当域环版本差值大于阀值,进行全量消息拉取,做端上数据重建

整个同步逻辑基于闲鱼的消息域环,域环可以看作是有着固定容量的用户消息收件箱,给一个用户发送的所有消息都会同步到他的域环中。
域环存储:域环需要支持高并发数据读写,使用阿里分布式KV存储系统tair来实现
域环容量:为减少全量消息同步,以用户下次进入闲鱼需要同步的平均消息量来规划个人域环容量。同时利用FIFO循环覆盖历史数据
域环版本:用户当前消息位点,在消息进入个人域环时通过tair的counter实现域环版本严格连续递增,用于全量、增量同步判断

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

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

背景: 随着闲鱼业务生态的丰富,IM会话与消息内容类型不断扩展,同时在DAU的快速增长下,用户反馈消息收不到、消息延迟等舆情问题日渐突出。
闲鱼消息发展简述-消息系统3.0_业务快速发展下的技术问题.png

问题分析:
1.闲鱼app进程无有效保活机制,app退到后台后进程很快就会被系统挂起,导致长连接中断。此时消息推送走厂商通道,而厂商通道的实时性较差,且对消息推送的优先级设定有差异,从而造成用户感知消息延迟
2.accs在线消息推送时,平均延时较短,但存在假连情况,而且目前的消息推送链路无ack机制,造成服务端以为消息发出去了但实际上客户端并没有收到,用户下次打开app后才能看到消息,用户感知消息延迟。造成假连接的原因:用户退到后台,accs长连中断,但是设备状态更新有延时。
3.目前消息同步的推模式(accs push)、拉模式(mtop),客户端未做隔离,异步进行处理,导致在某些极端情况下消息数据库处理异常,引发消息丢失。比如某用户上线后连续收到多条消息,其中一条触发域黑洞,在进行消息同步端上数据重建时,小概率处理出错。
4.大部分线上消息问题发现靠舆情反馈,如消息错乱,出问题后系统无感知、无补救措施且排查困难,仅能跟随版本做修复
5.业务不断丰富,孵化出基于消息系统的服务号及小程序内容营销、消息群组等,各类消息发送链路共用域环与数据存储,造成稳定性问题。如个人域环的消息包括IM聊天和营销消息,IM聊天由用户触发,需要保证强到达;而营销消息一般是由系统通过班车等方式批量发送,消息量级大,tps高,影响IM服务稳定性

基于上述分析,我们进行专项解决:
消息重发与推拉隔离
闲鱼消息发展简述-第 7 页.png
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进行时…

OpenIM官网 :https://www.rentsoft.cn

OpenIM官方论坛:https://forum.rentsoft.cn/

更多原创技术文章:

开源OpenIM:高性能、可伸缩、易扩展的即时通讯架构
https://forum.rentsoft.cn/thread/3

【OpenIM原创】简单轻松入门 一文讲解WebRTC实现1对1音视频通信原理
https://forum.rentsoft.cn/thread/4

【OpenIM原创】开源OpenIM:轻量、高效、实时、可靠、低成本的消息模型

https://forum.rentsoft.cn/thread/1

OpenIM服务发现和负载均衡golang插件:gRPC接入etcdv3

https://forum.rentsoft.cn/thread/2

【OpenIM原创】简单轻松入门 一文讲解WebRTC实现1对1音视频通信原理

https://forum.rentsoft.cn/thread/4

【OpenIM原创】C/C++调用golang函数,golang回调C/C++函数

https://forum.rentsoft.cn/thread/36

item_get - 获得闲鱼商品详情API item_get - 商品ID获得闲鱼商品详情 测试网址:注册测试 Result Object: --------------------------------------- { "item": { "prodct_array": { "num_iid": "606764782215", "title": "苹果", "desc_short": "", "price": "22.80", "total_price": 0, "suggestive_price": 阅读详情

相关推荐

互联网的诞生与发展:历史篇章的回顾

本文深入探讨了互联网从诞生到发展至今的历史脉络,着重介绍了互联网发展中的重要里程碑事件和关键人物。文章从ARPANET的创建者劳伦斯·罗伯茨,到TCP/IP协议的共同开发者罗伯特·卡恩和温顿·瑟夫,再到万维网的创造者蒂姆·伯纳斯-李,展示了他们如何推动了互联网技术的进步。此外,文章还详细叙述了互联网四代网站的演变,以及互联网如何从一个纯粹的科研工具演变成如今全球性的信息交流平台。

weixin_28809949的博客 1924

闲鱼x-sign参数

据说淘宝的x-sign程序已经人手一份了,闲鱼的好像不太多。 最近研究了下闲鱼以x sign为代码的请求参数,包括x-sign, x-mini-wua, x-umt等等参数。 效果如下,可以看到基本的请求参数和请求包数据都已经在里面了。 上面的是post包,下面是请求头数据,基本参数都在了。 {'x-extdata': 'openappkey%3DDEFAULT_AUTH', 'x-features': '27', 'umid': 'lw4A2w1LPFeWngJ8bdOv1Cr6e.

bugtraq的博客 7077

二手东芝J72配套赠送的系统光盘 1of 2

二手东芝J72配套赠送的系统光盘 1of 2

微信、陌陌等著名IM软件设计架构详解

本文由作者jinglijun编写修改,出处链接:https://blog.youkuaiyun.com/justinjing0612/article/details/38322353 OpenIMgithub开源地址: https://github.com/OpenIMSDK/Open-IM-Server OpenIM官网 :https://www.rentsoft.cn **OpenIM官方论坛:**https://forum.rentsoft.cn/ 对微信、陌陌等进行了分析,发出来分享一下(时间有些久了) 电量:

OpenIM的博客 1966

NW710 V3.5(RTL8196E+8192ER)编程器固件

NW710 V3.5(RTL8196E+8192ER方案)。编程器固件。

2019年6月新东方六级词汇..pdf

六级词汇

产品分析报告要点

1. 行业背景闲鱼的前身——淘宝二手上线的时间在2013年6月,我们先来看看当时的市场状况。首先来看分享经济的发展市场。Uber刚刚进入中国,分享经济在中国还处在一片蓝海的时代,闲鱼在此抢占了先机。2008年金融危机之后,伴随信息技术及其创新应用进入迸发期, 分享经济快速成长,2014 年以来呈现出井喷式发展态势。分享经济在中国的发展虽然分享经济在中国兴起的时间很短,但闲置资源交易市场在中国的规模...

张小杰博客 9516

幸狐RV1106开发板实战:5分钟搞定Yolo8模型部署(附避坑指南)

本文详细介绍了在幸狐RV1106开发板上快速部署YOLOv8模型的实战流程。通过RKNN-Toolkit2工具链,将ONNX模型转换为RV1106 NPU专用的RKNN格式,并完成交叉编译与上板运行。文章重点分享了环境搭建、模型转换的关键步骤以及常见的避坑指南,帮助开发者高效实现边缘AI目标检测应用。

weixin_28677451的博客 912

开业两月有余的转转二手集市怎么没有声音了?

今年8月,转转首家二手线下门店于上海开业,彼时正值台风“利马奇”登录,转转自诩“利马奇”号称将像台风一样席卷一片。此时,两个月过去了,关于转转二手集市的消息似乎越来越少,...

老胡说科技 514

stm32 Can通讯过滤器寄存器设置(实验验证)

起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。 解决: 在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:type

u013984214的专栏 3288

STM32F103C8T6 Bootloader开发实战:串口IAP固件升级与Keil工程配置详解

本文详细介绍了STM32F103C8T6 Bootloader开发实战,重点讲解串口IAP固件升级的实现方法与Keil uVision5工程配置。通过Flash分区管理、USART1通信协议设计及应用程序跳转机制等核心技术,帮助开发者掌握嵌入式系统固件升级方案,提升设备维护效率。

weixin_29165725的博客 436

5G消息能取代IM?一文读懂5G消息的前世今生!

本文引用了公众号“鲜枣课堂”的《5G消息(RCS),到底是什么?》和公众号“InfoQ”的《5G消息来了,它会干掉微信还是变成另一个飞信?》两篇文章的部分内容,感谢原作者的分享。 1、引言 上个月3大运营商(移动、电信、联通)发布了《5G消息白皮书》(此白皮书PDF版▶ 点此附件下载),宣布将共同启动5G消息业务。 简单理解,5G消息相当于是原先短消息服务的全新升级。与以...

hellojackjiang2011的博客 1310

智能车新手必看:如何用PID和差速转弯让小车跑得更稳(附代码示例)

本文详细介绍了智能车控制系统中PID算法和差速转弯的实现方法,包括位置式与增量式PID的选择、参数整定技巧以及编码器反馈的关键作用。通过代码示例和实战经验,帮助新手快速掌握智能车稳定行驶的核心技术,提升赛道表现。

mmm90的博客 122

历史回顾:移动开发技术的这几年发展

之前朋友访谈内容,分享出来

曲折旅程,艰难人生 1193

STM32串口通信实战:从CubeMX配置到printf重定向全解析

串口通信是嵌入式系统中最基础且广泛使用的数据交换方式,它基于异步串行通信原理,通过TX(发送)和RX(接收)两根信号线实现设备间的全双工通信。其技术价值在于协议简单、硬件成本低、可靠性高,是单片机与上位机调试、传感器数据采集、设备控制等场景的首选方案。在STM32等ARM Cortex-M系列MCU中,USART外设通过硬件自动处理时序,大大减轻了CPU负担。本文聚焦于嵌入式竞赛与开发中的高频需求,以STM32G431RBT6为例,详解通过CubeMX配置USART1、实现按键触发数据发送、并完成print

weixin_30603633的博客 545

在 SAP GUI Editor 中使用 OpenAI 自动生成 ABAP 代码 —— 技术实践与思考

在传统 SAP GUI Editor 场景下融入OpenAI开发者表达意图,模型负责实现。随着的持续演进,以及Joule等官方 Copilot 的加入,未来 ABAP 开发形态必将更加专注业务逻辑与架构设计,而把样板式编码交给 AI 自动完成。现在就动手试试,让你的下一段 ABAP 由 AI 来书写吧!

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 708

从故纸堆里,回顾下Web技术的发展历程

通过对比这些年的计算机图书来让大家感受下前些年Web技术的发展历程。 Web开发框架,目前是Spring Boot+JPA,我正好出过本书,从中大家能感受到现在的技术。 《Spring Boot+Vue.js+分布式组件全栈开发训练营(视频教学版)》以企业应用开发为目标,全面讲述Spring Boot整合分布式组件进行全栈项目开发的实战技能。 全书分为三部分。第一部分(第1~9章)主要讲述Spring Boot的相关技能,包括搭建Spring Boot开发环境、Spring Boot框架基础.

hsm_computer的博客 1182

C# WPF上位机实战:从零开发空压机监控系统(含实时监控+故障预警+数据追溯)

在工业生产场景中,空压机作为核心动力设备,常面临这些痛点:压力/温度异常导致停机、油耗超标未及时发现、设备故障追溯无数据支撑、人工巡检效率低且易遗漏。而基于C# WPF开发的空压机监控系统,能通过实时采集设备运行参数、智能分析运行状态、联动故障预警,实现“状态监控-异常告警-数据追溯-远程管控”全流程自动化,完美解决传统管理模式的弊端。今天就带大家落地这套空压机监控系统,基于C# + .NET 8 + WPF + Modbus TCP/RTU协议,整合压力、温度、油耗、运行时长等核心参数监控,搭配WPF的数

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1102

六年安卓开发的技术回顾和展望

六年安卓开发,从入门到大厂,我得出这些经验

张拭心的博客 shixinzhang 1万+

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4466

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Space 回顾|Sui 和 Walrus 2025 年的发展规划

欢迎阅读!

Sui_Network的博客 1237

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

回顾2020年5G消息,那些不能错过的重要事件!

在过去不到一年的时间里,5G消息从三大运营商《5G消息白皮书》的发布,正式由“RCS富媒体消息”更名为更符合中国特色的“5G消息”,作为最有可能成为5G规模化落地的第一个杀手级应用,被市场寄予厚望。此后,三大运营商在5G消息合作伙伴招募、 5G消息中心构建、5G消息平台联调测试和行业客户chatbot案例打造等各层面,快速推进“5G消息”的实际应用与落地,更进一步探索商用模式。在这一年中,有哪...

cover_se的博客 1

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

2024 前端生态发展回顾

从前端的发展现状来看,未来理想的前端技术架构应该是每一层都是可组装的,框架这种重型组合的适用场景会越来越局限。原因在于各部件不可拆卸会增加架构的升级代价同时会限制应用的灵活性。举个例子,我有一套面向pc端的后台管控平台的架构,view层采用angular开发,哪天我要迁移到移动端来,angular性能不行啊,我换成vue就好了。哪天觉得ajax的写法太挫,把http层替换成fetch就好了。又有一天后端的GranphQL平台搭好了,我把ngResource换成relay就OK了。

2401_84152126的博客 934

回顾2012,展望2013

一直都很想给自己写篇总结的文章,年中的时候想写,但是太懒了,也不知道要怎么写。2013终于来临了。利用时间好好想想写写吧。作为自己2012年的一年记录。在写这篇文章前,我仔细看了一下自己去年写的《回顾2011,展望2012》。自己展望的2012很多东西都没有做。没有实现。觉得文章是白写了。但是想想这一年中总不能什么也不留下吧,以后如何来回忆自己的这一年是怎么过得呢。为此,小弟我又敲起了键盘。哪怕给

Carson IT之旅 6661

一文回顾深度学习十年发展

公众号关注“视学苏案发”设为 “星标”,DLCV消息即可送达!转自 | 大数据文摘出品来源 |leogao.dev随着21世纪第二个十年行将结束,我们有必要回顾一下这十年来在深度学习...

zandaoguang的博客 1297
上一篇: [VLDB2019]DLM:微信大规模分布式n-gram语言模型系统
下一篇: 微信、陌陌等著名IM软件设计架构详解
OpenIM
博客等级 码龄5年 295粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值