默认

IM消息ID技术专题(一):微信的海量IM聊天消息序列号生成实践(算法原理篇)

查看数: 324073 | 评论数: 33 | 收藏 22
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-10-10 12:14

正文摘要:

1、点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量)、消息多端同步、消息顺序保证等,是典型的IM技术难点。 就像即时通讯网整理的以下IM开发干货系列一样: 《IM消息送达保 ...

评论

janice0721 发表于 15 天前
引用:ArtanisL 发表于 2024-07-11 20:58
我觉得楼上的分析过程有问题。这个seq是服务端生成并且服务端自己使用的,客户端发消息不会给这条消息附 ...

哥,能详细讲一下嘛,这块我好像也有点晕
ArtanisL 发表于 4 个月前
引用:ayuan9900 发表于 2023-10-09 16:54
这个是由客户端发起请求得到的序列号段吧,当客户端序列号段没有了,又重新获取,由于以用户的维度,只能在 ...

我觉得楼上的分析过程有问题。这个seq是服务端生成并且服务端自己使用的,客户端发消息不会给这条消息附带上seq,客户端只在同步的时候用seq,要不然多设备发消息的时候用本地拉取的seq,那消息的时序全乱套了。首先微信写扩散,A发送消息给B,写到B的inbox里面,写inbox的时候会为这条消息分配seq1,同时A发送消息也会给A的inbox写入,这个时候同样会为这条消息分配seq2。注意seq是单用户内唯一,即用户inbox维度的唯一,seq1是B inbox,seq2是A inbox。
ayuan9900 发表于 1 年前
这个是由客户端发起请求得到的序列号段吧,当客户端序列号段没有了,又重新获取,由于以用户的维度,只能在单方的消息里面保持顺序,但是解决不了如何把对方发来的消息和我方发的消息排序。
愿意 发表于 1 年前
有点不解:每个用户会在发送消息的时候去服务器申请一个初始seq,然后后续发消息的时候在这个基础上递增,而且这些初始值每个用户是独立的,那怎么保证一个会话里的消息顺序
啥也不是 发表于 1 年前
想问下 私聊看之前的文章是写扩散的  那么A给B发消息  消息id是uid层面的递增 那么一条消息实际是会产生两个消息id分别落在A和B的消息信箱 服务端按照uid划分set  set是异地多活来高可用性的吗?如果是  会不会出现A和B在生成自己的消息id的时候跨set  比如A在set1深圳部署 B在set2无锡部署  那么这条消息是有一半的概率跨机房获取消息id的?会慢很多?
AnonXG 发表于 1 年前
文中这一句:每个用户来申请sequence的时候,只需要将用户的cur_seq+=1,保存回数组,并返回给用户。
这个应该怎么理解?是指客户端每次发送消息的时候,先跟服务器申请sequence吗?只不过服务器将逻辑简化cur_seq+=1再返回给用户。
肥猫布里奇高 发表于 1 年前
请问大佬,微信这种按用户维度的递增id,群消息的有序性,如何保证?
ZJoker 发表于 2 年前
引用:JackJiang 发表于 2022-11-05 00:05
微信的这个序列号是顺序递增,但不保证连续

不绝对连续,那怎么保证消息丢失客户端拉取补偿呀
JackJiang 发表于 2 年前
引用:ZJoker 发表于 2022-11-04 23:00
这个消息序号和id发号器给的消息id是不同的东西。这个是绝对有序的吗

微信的这个序列号是顺序递增,但不保证连续
ZJoker 发表于 2 年前
这个消息序号和id发号器给的消息id是不同的东西。这个是绝对有序的吗
ZJoker 发表于 2 年前
为什么是个人,消息应该是群为单位吗
BrainWong 发表于 2 年前
看完整个文章,比较迷惑的点是每个用户一个唯一自增id,和每个会话中的唯一自增id两者之间有什么关系吗?
JackJiang 发表于 2 年前
引用:Tevins 发表于 2022-06-30 09:44
请教一下,这样理解是否正确,客户端上线后从服务端拿到自己的序列号起始值,发送消息时,客户端在本地递 ...

客户端从服务端拉序列号起始值时,服务端就会更新,发消息时不需要更新,否则就影响性能了
Tevins 发表于 2 年前
引用:JackJiang 发表于 2019-10-17 18:59
你没看懂吧,说白了每次拿的是个起始值,然后在间隔内自已用的时候递增,下次再取的时候再取一个新的起始 ...

请教一下,这样理解是否正确,客户端上线后从服务端拿到自己的序列号起始值,发送消息时,客户端在本地递增序列号,服务端收到消息时,去维护更新该客户端的cur_seq和max_seq
JackJiang 发表于 2 年前
引用:binarywz 发表于 2022-06-22 23:15
同在思考这个问题,而且就算是seqsvr给也存在什么时机给的问题,假如端上本地申请了seq,但是发消息的时 ...

断网这种情况,没必要考虑的那么极端,断网的消息不能发就是不能发
不过按微信做事精益求精的态度,很可能在网络恢复后有个sql同步和重整的动作
binarywz 发表于 2 年前
引用:fanjunchao 发表于 2021-12-09 17:57
如果考虑多端问题,假设PC端和移动端“同时”发送消息,如何保证后续不会乱序?序列号由seqsvr给会不会更好 ...

同在思考这个问题,而且就算是seqsvr给也存在什么时机给的问题,假如端上本地申请了seq,但是发消息的时候网断了,那么分配到的seq该怎么处理,还是说直接丢弃
fanjunchao 发表于 2 年前
如果考虑多端问题,假设PC端和移动端“同时”发送消息,如何保证后续不会乱序?序列号由seqsvr给会不会更好?
JackJiang 发表于 3 年前
引用:深海 发表于 2021-09-28 23:10
用户A发送消息msg1,本地生成的序列号是100,那消息被服务端转发给了用户B,请问用户B收到的msg1的序列号是 ...

转发的消息本质其实还是一条新消息,只是消息内容是转发内容而已
深海 发表于 3 年前
用户A发送消息msg1,本地生成的序列号是100,那消息被服务端转发给了用户B,请问用户B收到的msg1的序列号是多少,是用户B本地生成的新序列号对吧

返回顶部