首页 > 其他分享 >微信也在用的消息时序性技术,你知道多少?

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

时间:2024-09-27 11:51:18浏览次数:9  
标签:序列化 群聊 微信 多少 消息 节点 时序 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!

标签:序列化,群聊,微信,多少,消息,节点,时序,ID
From: https://blog.51cto.com/u_16237826/12127488

相关文章

  • 从对微信支付一无所知,到成为“专家”原来只需要1天
    摘要:本文通过一个为企业网站接入微信支付的例子,引导大家利用AI解决工作中的问题,提高效率。未来,程序员需要专注于提升创造力,积累经验才是无价的。对于现在想入行的程序员朋友,笔者建议早日放弃这个想法,直接投身于AI领域。放下这种认为AI永远不及人类聪明的偏见,认为AI所做的事情都......
  • thinkphp6调用微信商户支付-非工厂模式代码开发
    通过前面10多篇的微信支付开发-支付工厂代码开发我们发现,不管是jsapi支付、app支付、h5支付、native支付或是小程序支付,固定参数基本不变,且又是一家开发。个人建议,最实用的代码输出方式还是采用工具集封装最简单、最直接、最实用。一、支付产品流程图二、微信支付工具集代码......
  • 微信小程序授权弹框
    点击查看代码wx.getSetting({success(res){//判断已授权的scope是否含有保存到相册的授权if(!res.authSetting['scope.writePhotosAlbum']){//没有授权过,走完整的授权逻辑wx.authorize({scope:'scop......
  • 【Golang】双节点集群etcd未组成集群vip切换时序
    目录1、背景2、时序图1、背景在vip(虚拟ip)可以从一个节点切换到另一个节点,但etcd未组成集群的环境中,与etcd的连接会断开重连,但同一个key在不同节点的版本可能会不一样导致etcd服务器不向客户端推送数据,也就是客户端watch失效了,具体解决方法参考之前的重连方法。下面......
  • 【C++】你对vector的了解又有多少呢?
    【C++】你对vector的了解又有多少呢?一.vector的介绍二.vector的使用1.vector的构造代码举例:2.vector空间增长问题resize机制:reserve扩容机制:3.vector增删查改代码举例一:代码举例二:一.vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vect......
  • 云服务器100g流量可以支撑多少ip访问
    云服务器的100G流量可以支撑多少IP访问取决于多种因素,包括每个IP访问的平均数据量、访问模式、服务器的优化程度以及提供的服务类型。以下是一些影响因素和估算方法:影响因素:页面大小:每次页面访问所需的数据量。例如,一个简单的文本页面可能只有几十KB,而一个包含大量图片和视频的页面......
  • 加入优质微信群,开启机遇之门
    在当今数字化的时代,社交网络的发展让人们的交流方式发生了翻天覆地的变化。微信群作为一种便捷的社交工具,已经深入到我们生活的方方面面。而优质微信群,更是如同隐藏的宝藏,为我们带来了诸多意想不到的机遇。优质微信群往往汇聚了一群有共同目标、兴趣爱好或者专业领域的人。这......
  • 使用java做一个微信机器人
    Java实现微信小号做机器人随着人工智能技术的发展,机器人在各行各业扮演着越来越重要的角色。在社交领域,微信机器人也逐渐受到人们的关注。本文将介绍如何使用Java实现一个简单的微信小号做机器人的功能。请求参数Header参数exportinterfaceApifoxModel{"X-GEWE-TOKEN":st......
  • UniApp组件与微信小程序组件对照学习
    UniApp只是一个第三方的开发工具,借鉴各种平台的能力,UniApp的组件也借鉴了微信小程序的组件,我们学习时,可以进行对照学习,我们在用UniApp开发微信小程序时,UniApp也只是将代码转成了微信小程序的代码,还是需要了解微信小程序开发,才能开发出微信小程序的。下面我们来进行对应学习1......
  • 微信小程序如何调起H5页面的支付?
    做过微信公众号支付(JSAPI)的同学,会比较熟悉,调起微信支付所需要的六个必须参数:appId、timeStamp、nonceStr、package、signType。JSAPI官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_7&index=6我们再来看一下小程序支付的官方介绍:https://pay.weixin.qq.co......