默认
发表评论 2
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
请教关于IM消息有序性和消息同步问题
阅读(181) | 评论(2 收藏 淘帖1
2金币
在阅读一些文章之后,产生了一些疑问:
1、通过唯一id+服务端生成的会话唯一seq来保证会话内消息有序,那么客户端离线同步是怎么做呢?客户端存储的已同步的最大消息id貌似就没有用了吧?

2、如果是写扩散模型,消息写入到用户信箱后,如何维护信箱的timeline呢?

3、如果是读扩散模型,客户端消息同步也无法知道已同步的最大消息id了吧,毕竟消息id不是有序,只在会话内有序?

4、维护全局唯一消息id可以解决上述问题,但id发号器压力会很大,如果一次取一个号段,集群部署的话如何保证分配id有序呢?


本人IM萌新,请各位大佬解答一下,谢谢!

上一篇:[讨论] 关于IM消息增量拉取问题,比如seq序号导致的收发顺序问题

本帖已收录至以下技术专辑

推荐方案
评论 2
引用:JackJiang 发表于 2024-11-07 10:11
我觉得这个系列文章应该能解决你的疑问,尤其是前两篇微信团队的文章:

这是阅读微信一些文章得出猜想,站长看看分析的是否有问题

1、微信是基于写扩散的,每个用户有自己的收信箱
2、微信的消息是会话内有序的,并不是全局有序
3、会话内有序会带来一个问题,用户信箱的数据是无序的,因为存的是多个会话的混合消息。这样就无法进行同步,并且落库的数据也无法同步。
4、微信采用用户唯一seq来实现,为每个用户分配一个发号器。seq递增。
5、当用户收到一条消息后,会请求seq发号器,生成一个递增的seq,并将其作为用户信箱的唯一递增seq。服务端保存用户已经同步到的seq位置,下次启动时只会拉取这之后的数据。

依据:微信只保留7天的未读数据。

用户信箱只保留7天,如果7天未读,则会清除消息,无法同步(信箱被清除,消息库由于不是全局有序,无法知道同步点位,所以超过7天不同步)。
7天内上线,根据上次同步点,去同步7天内的所有消息。


亲测:

新设备登陆时,是没有任何消息,说明客户端没有拉取到同步消息。
(说明,因为新设备登陆,用户也没有新消息的话,服务端维护的用户同步seq已是最大,没有消息需要同步,并且不支持消息漫游,只有本地搜索)

设备A离线,给用户发送一条消息,在设备B登陆后,B成功收到消息,重新登陆A设备,没有同步到消息。
(说明,B在同步到消息后,更新用户同步点位,A在上线后拉取不到)

设备A在线,给用户发送消息,设备B登陆后,B同步不到消息。
(说明,A在线,发送消息,用户同步到最新消息,服务端更新用户同步点位,B登陆后,根据最新点位拉取,拉取不到消息)

两台设备都在线,都能收到消息。(在线直接推送)
签名: 程序员
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部