我在一次采访中被问到这个问题,无法回答。
FB messenger 如何在两条消息同时出现时对用户侧的消息进行排序,以避免在聊天期间和用户再次访问 Messenger 时出现显示顺序的差异。我认为我们可以为每条消息存储一个时间戳,即服务器接收到消息的时间。但是,这并不能确保客户端消息的正确排序。
假设服务器时间戳无法确定消息的确切顺序,如下所示:
- 用户 1 向用户 2 的服务器发送消息 M1。
- 服务器在 T1 收到 M1。
- 同时,User-2 为 User-1 发送消息 M2 到服务器。
- 服务器在 T2 接收到消息 M2,使得 T2 > T1。
- 服务器将消息 M1 发送给 User-2,将 M2 发送给 User-1。
- 所以 User-1 会先看到 M1 然后是 M2,而 User-2 会先看到 M2 然后是 M1。
我读到解决了这个问题,我们可以使用矢量时钟,但无法理解在聊天期间和用户再次登录时如何为不同用户保留消息顺序。
在上述场景中,user1 将看到 M1 后跟 M2,而 user2 将看到 M2 后跟 M1。现在,如果每个用户还为每个客户端(单独)生成每个消息的序列号或时间戳。然后在上面的场景中,user1 将发送序列为 <1 (user1 seq), 0(user2 seq) > 的消息 M1,而 user2 将发送序列为 <0 (user1 seq), 1(user2 seq) > 的消息 M2。因此,当消息同时到达 user1 和 user2 时,它们将具有: M1 <1, 0> M2 <0, 1>
现在假设 user1 发送更多消息 M3 <2, 1> 和 M4 <3, 1> 那么每个客户端都会有以下消息。M1 <1, 0> M2 <0, 1> M3 <2, 1> M4 <3, 1>
因此,在这种情况下,当用户登录时,用户 1 和用户 2 在聊天期间的显示顺序将分别为 M1、M2、M3、M4 和 M2、M1、M3、M4。现在,我想知道再次登录时如何为用户 1 和用户 2 保留相同的顺序?
谢谢。
