atomicoke / chat

即时聊天demo (由于不可抗力终止)
http://114.132.249.192
Apache License 2.0
4 stars 0 forks source link

离线消息方案 #3

Closed fzdwx closed 2 years ago

fzdwx commented 2 years ago

@liuwj-java @DesignerLookMe

DesignerLookMe commented 2 years ago

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

fzdwx commented 2 years ago

方案一

  1. 服务端保存该用户与对应好友/频道的离线消息中最小的msgId,与所有会话的离线消息未读数量
  2. 用户登录时,拉取所有会话的离线消息未读数量
  3. 用户点击时,读取该用户的对应会话的未读离线消息,并清除对应的离线未读数量以及最小msgId

@liuwj-java @DesignerLookMe

fzdwx commented 2 years ago

方案二

  1. 客户端保存收到的该用户的最大的msgId
  2. 服务端保存该用户的最大msgId
  3. 用户登陆时,同步这两个msgId之间的消息

@liuwj-java @DesignerLookMe

fzdwx commented 2 years ago

方案三

  1. 引入seq,每个用户一个seq关系,userid:seq,每收到或发送一条消息就增加seq,然后将这条消息跟这个seq绑定
  2. 这条消息的发送者和接收者各保存一条
  3. 客户端保存这个所接收到的最大seq,上线时发送请求同步(client_seq,server_seq]之间的消息

@DesignerLookMe @liuwj-java

fzdwx commented 2 years ago

我的方案可以总结为:

  1. 服务端保存这个用户收到的最大msgId
  2. 客户端存最后一条msgId
  3. 上线时发送请求同步 client msgId ~ server msgId


方案一与方案二是读扩散,即一条消息只保存一条,多次读。 方案三是写扩散,一条消息写多次