1.介绍

 

 对于即时消息应用程序来说,消息ID(或序列号)是看似无关紧要但非常重要的事情之一。

 

 消息标识的使用贯穿于即时消息技术逻辑的所有方面,例如:

 

 1)确保聊天消息的顺序;

 2)当聊天消息服务质量被传递到保证机制时重复;

 3)特定聊天消息的精确搜索和匹配;

 4)聊天消息的已读和未读处理;

 5)聊天信息的送达回执;

 6)群聊信息的扩散阅读和拉动标记;

 7)......

 

 然而,由于即时消息系统的高度个性化特征(在设计上没有统一的标准和理念),包括生成聊天消息标识的算法,每个产品都有自己的想法和考虑。

 

 常见的消息标识生成策略有:

 

 1)UUID:这种方法简单直观,可以保证唯一性,但对于技术上干净的人来说,身份证长度会有点长,而且不规范;

 2)使用时间戳长整数:这是最懒的,可以用在吞吐量小的场景中,但是有重复的风险,不能保证分布式条件下的唯一性;

 3)使用twitter开源雪花算法:在分布式高并发的情况下,这也是一个不错的选择;

 4)根据用户的独立身份按照空间生成的顺序生成身份:例如,微信的消息序列号生成策略非常好。

 

 从某种意义上说,消息标识生成策略的优缺点决定了实现即时消息应用层某些功能的难度。设计良好的消息标识结构将使即时消息产品的开发更加顺畅,反之亦然。

 

 本文旨在分享融云即时通讯云产品中的聊天信息标识生成算法和策略。一个19字节的标识可以包含:时间戳、消息类型、会话标识、序列号、小标识和大用途,这是值得学习的!

 

 免责声明:本文由融云官方技术团队共享,仅用于技术交流、研究和调查目的。请不要将它用于非法目的。如果文章涉及商业秘密,请让我来处理!

 特别提示:即时通讯本网站仅出于技术研究的目的分享本文,不收取任何费用,因此本文不是广告,我也不是受托人。如果有什么问题,请告诉我们!

 2.主题目录

 

 这篇文章是题为“即时消息识别技术专题”系列文章的第三篇。专题的一般内容如下:

 

 "即时消息识别技术专题(一):微信群发即时消息序列号生成实践(算法原理)"

 "即时消息标识技术专题(二):微信群发即时消息聊天消息序列号生成实践(灾难恢复方案)"

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略(*本文)

 即时消息标识技术专题(四):美团分布式标识生成算法的深度解密

 即时消息标识技术主题(5):开源分布式标识生成器的技术实现

 

 3.技术背景

 

 对于分布式即时消息系统,要求每个消息的标识在集群中是全局唯一的,并根据生成时间进行排序。如何快速有效地生成消息数据的唯一标识是影响系统吞吐量的关键因素。

 

 那么,融云如何生成全球唯一的消息标识?

 

 首先,我们需要阐明身份生成的核心要求:

 

 1)全球独一无二;

 2)有序。

 

 4.设计理念

 

 融云消息数据的唯一标识长度是80位。

 

 每5位用32位编码,并转换成一个字符。字符范围为“2 ~ 9”和“A ~ B”。其中,数字0和1(剩余可用数字为8),字母0和1(剩余可用字母为24)已被删除,因此可用字符总数为32(仅可根据32位系统进行编码)。

 

 这样,80位可以转换成16个字符,加上三个分隔符(-),将16个字符分成四组,最后得到一个19个字符的唯一id,就像“BD8U-FCOJ-LDC5-L789”。通过这种设计,可以保证生成的标识有序且易于阅读。

 

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 如上图所示,80位被分成4段。

 

 1)第一段中的42位:用于存储时间戳,可以表示为2109,这足够开发人员目前使用。时间戳数据放在高位,这可以确保生成的唯一标识按照时间排序,这是消息标识必须满足的条件。

 

 2)第二段中的12位:用于存储自旋转标识。众所周知,时间戳的精确度高达毫秒。对于一个十亿级的即时消息系统来说,在同一毫秒内生成多条消息太正常了。这个自旋标识是同一毫秒内的自编号消息。12位意味着在同一毫秒内,一台主机最多可以识别4096条消息(2的12次方)。

 

 3)第三段4位:用于标识会话类型。4位最多可以识别16个会话,足以涵盖常见的会话类型,如单聊、群聊、系统消息、聊天室、客户服务和公共号码。

 

 4)第四段中的22位:会话标识。如群聊中的群组标识、聊天室中的聊天室标识等。结合第三种会话类型,它可以唯一地标识一个会话。其他一些身份生成算法保留两个段来标识数据中心号和主机号(如雪花算法)。我们不是这样做,而是使用这两个片段来识别会话。通过这种方式,身份生成可以直接集成到业务服务中,并且不需要关心服务所在的主机,从而实现无状态的扩展和收缩。

 5.代码实现

 

 消息标识总共占用80位,在计算中分为两部分:高位64位(记录为高位)和低位16位(记录为低位)。

 

 具体的代码实现过程大致如下。

 

 1)获取当前系统的时间戳,并将其分配给消息标识的高64位:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 2)获取自旋标识,将高位向左移动12位,并将自旋标识拼接到低位12位:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 其中,自旋标识是从0到4095依次递增的数字,生成规则如下:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 3)前一步中的高位向左移动4位,会话类型拼接到低位4位:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 4)取会话标识哈希值的低22位,并将其记录为会话标识:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 5)高位向左移位6位,会话号的高位6位拼接成高位的低位6位:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略_7.png

 

 6)将会话标识的低16位作为低位:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 

 17)拼接7)高位和低位以获得80位的消息标识,并将其编码为32位以获得唯一的消息标识:

 即时消息标识技术主题(3):在融云解密即时消息产品的聊天消息标识生成策略

 编码规则:从左到右,每5位转换成一个整数,相应的字符可以用这个整数作为下标在下表中找到。

 6.实际应用

 

 附言:如果你觉得上面两部分介绍的算法思想和代码实现有点抽象,你可以直接看看融云即时消息产品中消息标识的生成。

 

 例如,从融云的演示产品中,在相似的时间内,从同一个用户处获得了三个聊天消息标识样本:

 123 BD8U-DG1U-5UI5-L789 BD8U-DU6D-2205-L789 BD8U-FCOJ-LDC5-L789

 

 

 例如,您可以直接登录融云的网络产品,并在浏览器端研究其消息标识的生成:

 即时消息标识技术专题(3):_WX20190919-120024@2x.png融云即时消息产品聊天消息标识生成策略解密


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?