im即时通讯开发:群聊消息是即扩散读还是即扩散写?
最基本的方案:“在线的群友不存储消息,离线的群友才存储”
群信息,用户信息,群成员关系都是基础数据:
group_info(gid, group_info);
user_info(uid, user_info);
group_members(gid, uid);
假设一个群(gid)里有4个成员,其中三个在线(A, uid1, uid2),一个不在线(uid3)。
A发送了一条消息,很容易想到,对于不同的群友消息存多份,每个群友一个队列来存储。但由于在线的用户会实时的收到消息,所以暂定只为离线的用户存储。
用户收到的群消息,也是基础数据:
user_msgs(uid,msgid,gid,sender_uid,time,content);
1)发送消息;
2)查询状态;
3)不在线的存储离线;
4)在线的实时推送。
“在线的群友不存储,离线的群友才存储”会带来的问题是,如果第四步发生异常,群友会丢失消息。
优化的方案:“不管群员是否在线,都要先存储消息”
消息的可达性是聊天系统中最重要的要素(没有之一),