不管是消息队列的消息投递,还是单人实时聊天的消息投递,都需要通过应用层的超时,重传,确认,去重来保证消息的可靠投递。离线消息的处理,根据实际业务需求来做处理。一般来说,要保证用户的离线消息不丢失,用户上线后能够获取离线消息。
用户A给B发送一条消息,B不在线,离线消息存储的流程如下:
1.A发送消息给B,通过服务器server中转;
2.server查看B的状态为offline离线;(服务端会缓存用户的状态)
3.server将消息存储到数据库DB;
4.server返回用户A,消息发送成功;(对于发送方而言,消息存到DB,就认为发送成功)
用户B上线了,他要拉取A给他发送的离线消息,整体流程如下:
1.B向server拉取A给B发送的离线消息; (通过uid_B,uid_A在离线消息表查询)
2.server从DB中获取离线消息;
3.server从DB中删除离线消息;
4.server将B所需要的离线消息返回给B.
这是最原始的场景。
实际上用户登录后,可能要拉取所有好友的离线信息,显然他不能一个一个的去拉取,原因是要减少拉取次数,一个合理的方式是按需拉取,即先拉取各个好友的离线消息数量,真正查看离线消息时,才往服务器发送拉取请求。
进一步优化拉取次数:一次拉取B的所有好友的离线消息,通过uid_B查询离线消息表,然后在客户端本地,根据sender_u