当发送一条系统消息时,所有的用户都会出现一条未读消息,这个消息可以标记为已读或者删除,那么这如何进行数据库设计?又是如何进行数据存储的?
我觉得消息中心的设计,最主要的点是选择读扩散模型还是写扩散模型。
如果用户量巨大,写扩散冗余太严重,则可以使用读扩散,即推送中心维护一个消息列表,然后每一个用户端维护一个订阅列表,每次用户刷新的时候,根据自己的订阅,去从消息中心拉取最新的目标消息。这种模型的优势是比较节省存储空间,延时比较低,对于每一个用户来说比较公平可以用于秒杀抽奖消息等场景,缺点在于用户每次必须去消息中心读取订阅的信息,如果订阅量很多,需要做一些额外的优化。
另一种选择是写扩散,即每条消息对所有用户推送,所有用户端都维护一个inbox,存储所有收到的消息,每条消息推送的点位,保障推送到所有用户,同用户的多端同步也由消息中心记录。这种模式的优势在于读非常快,用户只需要加载自己的inbox,体验很好。劣势在于数据冗余很多,写过重导致延时比较久,不适合类似微博大v这种大量订阅的消息。
现在一般都是推拉结合的模式。
1、消息表
2、每个用户和这个消息读状态的表,外键关联这个消息
3、当用户读取的时候,修改该用户的读状态字段
4、这样可以避免数据冗余,另外一个方法就是每个人发送一个消息副本,这样就是消息复制太多了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。