00:00
本文深度剖析即时通讯I'M消息乱序的问题,梳理I'M客户端时间出不可信、多端并发、群消息删除、重试三大核心陷阱,拆解市面上主流大厂I'M产品的持续设计方案,并从锚点设计、多端去交错、密等兜底、可观测性等维度给出'M项目消息持续性保证的落地优化策略,以消信息乱序问题的由来在一般的I'M项目,消息持续的坑集中在三处,客户端始终不可信、多端并发、发送删出与重试乱序三个陷阱单独看都不致命,叠加起来,对方收到的顺序就和发送方以为的顺序对不起了,因你最伤信任的体验问题不是丢消息,是顺序错,丢一条可以补,顺序错了,整段对话读不通。2消息实序的三个可验证设计目标先把对方收到的顺序正确翻译成三个能写进特试用例的目标,一同一绘画内墙宝旭2跨绘画弱宝序。三多端最终一致第三点要留意分布式系统没办法保证所有端在任意时刻顺序都一样,能保证的是收敛几等消息到期后各端排序一致,把目标定成任意时刻都一样,会掉进永远填不平的坑。三线阱一不可信的客户端时间戳一些人做消息排序,第一反应几乎都一样,消息体不是大al了chamline cham吗?拿它so的一下。现实是客户端始终不在服务端控制范围内,拿它做排序主件,等于把决定权交给一个随时漂移的对抗性环境。锚点挪到服务端,要先想清楚用什么字段ste服务端时间戳和MSG绘画内单调序号各管一段,主流toy m两个都打。STEM用于跨绘画排序,MSGS用于绘画内强保序,只用ste不够。
01:51
服务端多,实例间本地时钟也有几毫秒到几十毫秒漂移,这是陷阱2的伏务笔4。陷阱二,多端并发的时序裁决。用户A同时登录PC和手机,PC上敲完一句话,按回车,几乎同一瞬间,手机务处发出一条语音,两条几乎同时到达服务端,哪条先到?直觉是在网关接收那一刻打时间戳,谁小谁先,但PC走WiFi,手机走4g,两条消息很可能落到两个不同的网关实例上,实例间本地时钟差几毫秒到几十毫秒,打的本地时间根本没有可比性,退回去用客户端时间戳,陷阱又在等着。多端并发场景里谁先发本身就不成立,没有任何一只表能权威回答他我。陷阱三,群消息删出后的副本乱序单聊的多端问题解决了,群聊还有一道更隐蔽的卡写扩散模型,下一条群消息到服务端会被拆成案一个成员副本,删出账单本。
02:51
记得一篇算过,这一个副本命运各自独立,走不同partition被不同消费线程处理,经过不同网络路径,一条副本失败,重头被丢到队尾,而在等于6期早就先到接收方单成员视角下的乱序就这么产生。解法分两层,第一层服务端保证同会化,同partition同消费线程,第二层接收端做兜底重拍六大厂如何实现消息顺序的?通过四家主流I'M大厂公开技术资料显示,他们都不信客户端时间戳分歧在锚点的力度和形态。某信的序列号生成器S每天万亿级调用,核心性质是每个用户拥有独立的64位ence空间,分配出去的序列号稳定递增不回退。某定的及时消息服务DTI走用户维度,其某信的模型一句话,每个用户一条独立消息流,同一条消息的多份副本分存在每个接收者的流利留内,每条消息有单调递增的赛贡献很扎心,4家多不拿。
03:51
客户端时间戳做主排序都把锚点收敛到用户收件箱力度分歧只在锚点,用序号还是时间戳,按用户还是按绘画维度,没有标准答案,取决于群规模多端形态和团队能扛多重的工程复杂度。其保证消息持续的优化方法中小规模透I按想把消息顺序做扎实,从来不是某一处改个时间戳能解决的。多端发送的乱序某定用户维度位点加同步队列值得借鉴。落地时客户端收到回执时带回服务端打的MSG赛多端在通过同步通道互相通知,手机端拿到权威S,就能把PC端消息插进对的位置陷阱三代格重头扰乱序是个隐蔽杀手根本解法一句话,把消息身份和消息序号绑死,同一个compos的IDMSGZ在任何环节只代表同一条逻辑消息,在完善的服务端持续保证到客户端只要排序逻辑写错一行就立刻清零。
04:51
接收端是用户体感的最后一道防线,最值得做的是I'MSGS重排加空洞,主动拉持续故障,最难的不是修,是发现一条乱序,从用户感知到研发定位,可能横跨好几小时。三个最值得加的指标,接受端SK空洞率、序号分配、P99延迟、MQ重投率、分童消息顺序这件事的工程哲学是让所有人都同意一个并不完美但确定的顺序,而不是去追那个永远抓不到的真实顺序。
我来说两句