编辑
2024-11-30
后端
00
请注意,本文编写于 161 天前,最后修改于 161 天前,其中某些信息可能已经过时。

目录

1. 微信的消息存储机制
2. 消息的有序性
3. 用户唯一序列号(seq)
4. 消息同步机制
5. 消息保留策略
6. 实际测试结果

1. 微信的消息存储机制

微信的消息存储机制是基于写扩散的,每个用户都有自己的收信箱。这意味着每条消息都会被复制到每个相关用户的收信箱中,而不是在发送者和接收者之间直接传递。这种机制使得消息的传递更加可靠,但也增加了存储和同步的复杂性。

2. 消息的有序性

微信的消息在会话内是有序的,即同一个会话中的消息按照发送顺序排列。然而,全局消息是无序的,因为用户的收信箱中包含了来自多个会话的混合消息。这种设计使得消息同步变得复杂,因为无法简单地通过时间戳来同步消息。

3. 用户唯一序列号(seq)

为了解决消息同步的问题,微信为每个用户分配了一个唯一的发号器,用于生成递增的序列号(seq)。当用户收到一条消息时,会请求发号器生成一个新的递增的seq,并将其作为用户信箱的唯一递增seq。服务端会保存用户已经同步到的seq位置,下次启动时只会拉取这之后的数据。

4. 消息同步机制

微信的消息同步机制依赖于用户唯一seq。具体步骤如下:

  1. 用户上线:用户上线时,客户端会请求服务端获取当前用户的最新seq。
  2. 消息同步:客户端根据获取到的seq,从服务端拉取seq之后的所有消息。
  3. 更新同步点位:当客户端成功同步消息后,会更新服务端中用户的同步点位,即最新的seq。

5. 消息保留策略

微信只保留7天的未读数据。如果用户在7天内未读消息,这些消息会被清除,无法再进行同步。这种策略确保了消息存储的效率,但也带来了一些限制,例如用户无法同步超过7天的消息。

6. 实际测试结果

通过实际测试,我们可以验证微信的消息同步机制:

  1. 新设备登录:新设备登录时,客户端没有拉取到同步消息,说明服务端维护的用户同步seq已是最大,没有消息需要同步。
  2. 设备A离线,设备B登录:设备A离线时发送消息,设备B登录后成功收到消息,重新登录A设备后没有同步到消息,说明B在同步到消息后更新了用户同步点位。
  3. 设备A在线,设备B登录:设备A在线时发送消息,设备B登录后同步不到消息,说明A在线发送消息后,用户同步到最新消息,服务端更新了用户同步点位。
  4. 两台设备在线:两台设备都在线时,都能收到消息,说明在线直接推送消息。

微信的消息同步机制通过用户唯一seq实现了高效的消息同步。尽管这种机制在某些情况下可能会导致消息无法同步(例如超过7天未读消息被清除),但它确保了消息的可靠传递和存储效率。

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!