傲瑞通中用于保证聊天消息不会错漏和丢失的机制是怎样的?

2023.08.30 傲瑞通中用于保证聊天消息不会错漏和丢失的机制是怎样的?

在傲瑞通中,当客户端A发送聊天消息给B时,其内部是A先将聊天消息发给服务器,服务器将该消息存储到DB,然后再转发给B。B收到该消息后,会将该消息存储在客户端本地 sqlite 中的聊天记录表中。

如果A发送给B的消息,B没有收到,一般是如下两种情况:

(1)在A发送消息给服务器的时候,自己掉线了,这种情况下,A方会提示 “已掉线,发送消息失败!”

(2)消息已经到达服务器,但是,在服务器将该消息转发给B时,B的网络不好或刚好掉线了。

我们所说的漏消息的情况,一般指的就是第二种,因为发送方以为自己已经发送成功了。那么这种情况,该如何处理了?

傲瑞通是这样解决的:

1. 客户端本地有存储与自己相关的所有聊天消息记录(使用sqlite中的ChatMessageRecord表)

2. 服务端数据库有聊天记录表,用于存储所有的聊天消息(ChatMessageRecord表)。

3. 服务端 数据库用户表中,有字段(OrayUser表的LastOfflineTime字段)来存储用户最后一次的下线时间。

4. 当客户端登录(包括断线重连成功)时,分两种情况:

(1)当用户登录的设备上已经存在本地存储时,就从本地存储中获取最后一条聊天记录的时间(lastRecordTime),将其发送给服务端。服务端收到后,从数据库聊天记录表中查询出关于该用户的,且聊天消息时间(OccureTime)大于 lastRecordTime 的所有聊天记录,发送给客户端(可能需要分页)。

(2)当用户在新的设备上登录或者客户端本地存储被已经被清除时,lastRecordTime 就不存在了。这种情况下,服务端将从用户表中获取该用户的最后一次下线时间lastOfflineTime,然后从数据库聊天记录表中查询出关于该用户的,且聊天消息时间(OccureTime)大于 lastOfflineTime 的所有聊天记录,发送给客户端(可能需要分页)。