问题描述:
IM系统中同步好友的状态,IM有好友列表,也有群好友状态
场景分析:
1. 上线需要更新一次好友状态
2. 上线后,好友状态变更同步给我就行
3. 好友状态分为:上线,离线,离开,回来
4. 不同状态的实时性要求不同
5. 状态"离开"不好界定,比如:不操作3min认为是离开,那么这个状态同步不及时也行
6. "上线"这个状态比较关注,比如我关注的人上线,需要及时通知
7. "离线"即下线,用户关了软件,这种如果正在聊天,聊天窗口打开,那么他离线了我需要及时关注;列表中的好友,则定时通知就行;打开在线好友,有已经离线不在延迟通知的场景,需要先判断一下是否还在线后再开始聊天
8. 离开和回来 如果做得好,也可以区分连天中的和列表的用户
9. 进一个群好友列表需要查看一次好友状态
10. 扩展一下,软件不仅有状态需要同步,还有其他消息,有的及时比如别人发送的消息,有的不及时也可,比如广告等
场景归纳:
1. 刚上线,第一次打开群列表时 全量获取一次好友状态
2. 消息分为:及时消息,延迟消息
3. 及时消息:用户聊天信息;关注好友上线;正在聊天好友下线,离开,回来等
4. 延迟消息:列表中好友状态变化,广告等
方案实现:
1. 及时消息: 用双通道如WebSocket进行传输,状态变化好及时推送给关注的人;
2. 延迟消息:可以用http,1-3min为间隔,全量获取
3. 获取获取可以出发一次延迟消息实现
解决思路:
1. 先分析实际场景,然后在实际场景中抽象出几类问题,技术方案去按照这几类问题解决就行
2. 注意点:不要先直接上方案,然后用场景去修改。比如:一想到状态同步就钻到方案中,做技术是为了解决问题,不是为了做一个完美的方案,也不存在完美的方案
参考:
QQ状态同步究竟是推还是拉?
https://www.w3cschool.cn/architectroad/architectroad-qq-status-consistency.html