问题探讨
- 群离线消息推模式还是拉模式?
- 如何高效存储每个群成员的群离线消息?
- 如何保证多个群、大数据量群消息安全送达?
架构演化
起始方案
群成员表: 存储群成员信息,即一个群有多少成员。
// 群ID , 用户ID
mt_group_user( group_id , user_id )
群离线消息表: 存储每个群成员上线时需要拉去的群离线消息
// 消息ID , 所属群ID, 用户ID, 消息发送者用户ID , 消息时间 , 消息内容
mt_group_offine_message( message_id , group_id , user_id , sender_user_id , message_time , message_content )
模式实现过程:
- 发送群消息时获取群成员。
- 将群消息对应群成员插入到群离线消息表(mt_group_offine_message)中。(注:如果在线用户不想存储可以不存储)
- 用户上线主动推送消息或者主动拉去群消息。
- 删除拉取过的指定用户群消息。(也可以不删除)
问题
对于同一份群消息的内容,多个离线用户要存储很多份。假设群中有200个用户离线,离线消息则冗余了200份,这极大的增加了数据库的存储压力