写点什么

模块八作业 一 消息队列存储模型设计

用户头像
babos
关注
发布于: 4 小时前
模块八作业 一 消息队列存储模型设计

作业分析:

  1. 只需要设计表结构

  2. 需要合理设计索引,保证存储的高性能

  3. 需要考虑是否分库分表

  4. 需要考虑是否一张表放全量消息还是不同的消息放不同的表。


设计思路:

  1. 消息有几个关键属性:topic,messageBody,bizKey,msgId,Tag。

  2. 消息量极大,需要分库分表,并且由于消息的时效性是比较高的,可以定期备份清理历史消息,分库分表 key 使用 msgId,msgId 通过设计成全局唯一,这样能保证数据的分散。

  3. 由于写入索引也是比较耗性能的,而且也没有必要提供堆外的检索功能,所以提供 topic、bizKey、msgId 三个字段的查询功能即可,可以设计两个索引:唯一索引 msgId,联合索引 topic+bizKey,至于 topic 查询,由于 topic 的字段值的基数大,所以不单独设计索引,可以通过程序的方式,随机缓存最新的几条数据即可。

  4. 由于用户会不断创建新的 topic,所以不能一个 topic 放一张表,这样不利于维护。

  5. 一张表放全量消息,实时的消息表理论上只要保留几天内的数据即可,通过分库分表保障读取写入的高性能。


表结构设计:

CREATE TABLE `queue_msg` (  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',  `gmt_create` datetime NOT NULL COMMENT '创建时间',  `gmt_modified` datetime NOT NULL COMMENT '修改时间',  `msg_id` varchar(256) NOT NULL COMMENT '消息id(分库分表键)',  `topic` varchar(256) NOT NULL COMMENT '主题',  `tag` varchar(256) DEFAULT NULL COMMENT '标签',  `biz_key` varchar(256) NOT NULL COMMENT '业务key',  `messageBody` text NOT NULL COMMENT '消息体(JSON格式字符串)'  PRIMARY KEY (`id`),  UNIQUE KEY `uk_msg_id` (`msg_id`),  KEY `idx_topic_biz_key` (`topic`,`biz_key`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消息存储表'
复制代码


发布于: 4 小时前阅读数: 4
用户头像

babos

关注

还未添加个人签名 2018.05.04 加入

还未添加个人简介

评论

发布
暂无评论
模块八作业 一 消息队列存储模型设计