微信也在用的消息时序性技术,你知道多少?

简介: 本文由程序员小米撰写,探讨了在个人项目中如何保证消息的时序性。文章详细介绍了消息时序性的概念及其重要性,并提出了三种方案:ID设计(借鉴微信号段与跳跃式生成)、单聊场景下的单点序列化同步,以及群聊场景中的单点序列化处理。此外,还提供了多种优化方法,如消息时序对齐、本地时序记录等,帮助读者更好地解决消息乱序问题。适合所有关心即时通讯和社交应用技术细节的开发者阅读。



哈喽,大家好,我是小米,一个29岁,喜欢研究技术和分享经验的码农!今天我想和大家聊聊一个非常有趣的话题——如何在个人项目中保证消息的时序性

随着即时通讯、社交应用的普及,消息的时序性问题成为了一个非常关键的技术难点。如果不加以处理,消息的乱序可能会导致用户体验崩溃。今天,我将分享一些在实际项目中保证消息时序性的思路和优化方法,希望对大家有所帮助。

什么是消息时序性?

首先,我们来简单解释一下什么是消息时序性

在聊天应用中,我们发送的每一条消息都有明确的时间顺序。例如,在你和朋友的对话中,理想情况下,A发的第一条消息应该显示在B发的消息之前。但在实际的网络环境中,由于延迟、丢包等问题,消息的传输顺序并不总是和发送顺序一致,这就出现了消息乱序的问题。

如何解决这个问题呢?其实可以借助几种技术手段来保证消息时序性,下面我们来逐步拆解这些方案。

方案1:ID设计——借鉴微信号段 + 跳跃方式,保证趋势递增

问题背景:

首先,消息的ID设计很重要!如果ID是无序的,那么在分布式系统中,我们就很难准确地判断消息的先后顺序。我们可以借鉴微信号段和跳跃式生成ID的方法,来保证消息ID的趋势递增。

方案设计:

  • 微信号段的思路:微信的每个用户ID都通过一个区间号段进行分配,例如在同一个区间内的ID保证相对递增,类似这样的设计可以应用在消息的ID生成上。我们可以为每个用户或每个会话分配一个消息号段,这样可以保证消息ID的趋势是递增的。
  • 跳跃式ID生成:为了进一步优化ID的生成效率,可以在号段的基础上,使用跳跃式的递增方法生成ID。通过控制每个节点的跳跃步长和初始值,可以避免同一时刻ID的重复,同时保证ID是全局趋势递增的。

优点:

  • 高效分配:通过划分号段,可以快速地为每个用户分配ID,避免冲突。
  • 全局递增:无论消息来自哪个用户或会话,ID的趋势递增可以保证消息按顺序处理。

方案2:单聊场景——借鉴数据库设计,单点序列化同步到其他节点

问题背景:

在单聊场景中,消息通常需要在多个节点之间传递。为了保证时序性,简单地依靠网络传输顺序是不可靠的。一个经典的解决方案是数据库的单点序列化设计

方案设计:

  • 单点序列化:我们可以为每个单聊会话设立一个主节点,所有的消息都通过这个节点进行处理。这个节点负责为每条消息分配唯一的、递增的序列号,从而保证消息的时序性。
  • 同步到其他节点:为了保证多机环境下的时序性,可以通过同步机制将主节点的消息序列号同步到其他节点。这种方式可以有效避免消息乱序,确保每条消息在多个节点上都是按照同样的顺序进行处理。

优点:

简单高效:通过单点序列化,保证了每条消息的顺序。

可靠同步:同步机制使得在多节点环境下依然能保证时序一致。

方案3:群聊场景——单点序列化保证各发送者消息相对时序

问题背景:

群聊场景比单聊复杂得多,因为群聊中有多个发送者同时发消息。为了保证每个发送者的消息都按顺序显示,我们可以通过单点序列化来处理。

方案设计:

  • 单点序列化的引入:每个群聊消息都通过一个群聊服务节点进行序列化处理。这个节点为群内的每条消息分配一个全局唯一的序列号,保证同一群聊中的消息按发送时间顺序显示。
  • 相对时序性:由于消息来自不同的发送者,绝对时序可能难以保证,但我们可以通过调整每个发送者的消息,确保在同一群聊中的相对时序是一致的,也就是同一用户的消息按照他发送的时间排序。

优点:

  • 消息相对顺序:每个用户的消息在群内的展示顺序是一致的,确保了用户体验的连贯性。
  • 全局有序:群聊消息通过单点序列化,使得整个群聊中的消息时序保持稳定。

在前面的方案基础上,我们还可以进行一些优化,来解决具体场景中可能出现的时序问题。

优化1:服务器单点序列化时序问题

在服务器单点处理时,可能会出现一个问题:服务器接收到消息的时序和发出消息的序列并不一致。为了解决这个问题,我们可以:

  • 消息时序对齐:在处理消息时,我们不仅仅考虑服务器接收到的顺序,还要结合发送者本地的时间戳信息,进行时序对齐,确保在用户界面上展示时,消息依然按发送顺序排列。

优化2:加上发送方A本地的绝对时序,确保接收方B的展现时序

在A发送消息给B时,为了避免接收方B看到的消息顺序错乱,可以在消息中附加一个发送方A的绝对时序,即在消息中包含A本地的一个时间戳或序列号。

  • 本地时序记录:A在发送消息时,附带一个本地的消息序列,这样即使服务器的接收顺序有变化,B依然可以按照A的本地时序显示消息。

优化3:群聊消息的全局递增瓶颈

在群聊场景中,如果我们尝试为每个群聊分配一个全局递增的消息ID,可能会遇到性能瓶颈。为了优化这一点,可以通过将群聊消息分配到不同的service节点,并通过本地递增的方式处理每个群的消息。

  • 群聊落地到单个service节点:我们可以让每个群聊只在一个service节点上处理,这样就避免了全局递增ID的性能瓶颈。然后,通过在这个节点上使用本地递增的方式,依然可以保证消息的时序性。

END

以上便是几种常见的消息时序性处理方案,既可以应用于单聊,也适用于群聊场景。核心思路是通过单点序列化本地时序记录以及跳跃式ID生成,来确保消息的顺序一致。希望这些方案和优化可以帮助你在个人项目中更好地处理消息的时序性问题。

如果你有任何问题或更好的想法,欢迎留言和我一起讨论!一起学习,共同进步~

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
7月前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中PWA技术的应用,PWA结合Web的开放性和原生应用的性能,提供离线访问、后台运行、桌面图标和原生体验。开发者可利用Service Worker实现离线访问,Worker处理后台运行,Web App Manifest添加桌面图标,CSS和JavaScript提升原生体验。实践中需注意兼容性、性能优化和用户体验。PWA技术能提升小程序的性能和用户体验,助力开发者打造优质小程序。
208 0
|
15天前
|
监控 算法 测试技术
即时通讯技术文集(第45期):微信、QQ技术精华合集(Part2) [共14篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第45 期。
29 3
|
5月前
|
小程序
跨端技术问题之为什么在微信小程序中静态转义出didUpdate生命周期可靠程度低
跨端技术问题之为什么在微信小程序中静态转义出didUpdate生命周期可靠程度低
|
22天前
|
存储 编解码 监控
即时通讯技术文集(第44期):微信、QQ技术精华合集(Part1) [共14篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第44 期。
21 2
|
1月前
|
存储 监控 算法
社交软件红包技术解密(三):微信摇一摇红包雨背后的技术细节
本文将由微信团队工程师张文瑞分享微信春节摇一摇红包技术背后的方方面面,希望能给同行们带来启发。
51 1
|
27天前
|
人工智能 小程序 算法
微信小程序地图定位的核心技术与实际应用详解
在移动互联网时代,微信小程序凭借其轻量化和普及性,成为室内地图导航的理想平台。本文探讨了微信小程序在室内定位领域的创新应用,包括蓝牙iBeacon定位、高精度地图构建及AI路径规划等核心技术,及其在购物中心、医院、机场火车站和景区等场景的应用,展示了其为用户带来的高效、智能的导航体验。
115 0
|
3月前
|
存储 监控 容灾
微信技术总监谈架构:微信之道——大道至简(演讲全文)
在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。 周颢把微信的成功归结于腾讯式的“三位一体”策略:即产品精准、项目敏捷、技术支撑。微信的成功是在三个方面的结合比较好,能够超出绝大多数同行或对手,使得微信走到比较前的位置。所谓产品精准,通俗的讲就是在恰当的时机做了恰当的事,推出了重量级功能,在合适的时间以最符合大家需求的方式推出去。他认为在整个微信的成功中,产品精准占了很大一部分权重。
99 1
微信技术总监谈架构:微信之道——大道至简(演讲全文)
|
2月前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
69 5
|
4月前
|
小程序 前端开发 JavaScript
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。
微信小程序结合PWA技术,提供离线访问、后台运行、桌面图标及原生体验,增强应用性能与用户交互。开发者运用Service Worker等实现资源缓存与实时推送,利用Web App Manifest添加快捷方式至桌面,通过CSS3和JavaScript打造流畅动画与手势操作,需注意兼容性与性能优化,为用户创造更佳体验。
117 0
|
5月前
|
安全 API Windows
支付系统13------支付系统的资料在技术库里的在线支付当中,怎样获取微信平台证书那?怎样获取微信平台证书那?第一步打开我们的微信支付平台的文档中心
支付系统13------支付系统的资料在技术库里的在线支付当中,怎样获取微信平台证书那?怎样获取微信平台证书那?第一步打开我们的微信支付平台的文档中心