架构实战训练营 - 模块八课后作业
【作业要求】
包括表名、字段、索引;
用文字描述设计思路和理由,例如:为什么设计某个索引?
一页 PPT 即可。
【提示】需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。
表的设计
CREATE TABLE `topic_{xxx}` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息 id',
`content` text NOT NULL COMMENT '消息内容',
`producer_id` bigint(11) unsigned NOT NULL COMMENT '生产者 id',
`consumer_id` bigint(11) unsigned NOT NULL COMMENT '消费者 id',
`consumer_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '消费情况,0 新建 1 消费成功 2 消费失败 3 需要重试',
`create_time` bigint(11) unsigned NOT NULL COMMENT '创建时间',
`update_time` bigint(11) unsigned NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_consumer_situation` (`consumer_id`,`consumer_status`),
KEY `idx_producer` (`producer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
设计思路
所有消息放一张表,后面的扩展性不行,到了一定数据量之后肯定要做分表的。与其这样不如直接按照队列建表,比如上面 topic_是队列的前缀,后面的{xxx}需要替换成具体的队列名称。
字段说明:
已经在上面有解释。不再赘述。
其中 consumer_status 这个字段是决定这个消息有没有被成功建立、成功消费、或者可能由于某种原因,消费失败或者需要重试做个标记。
索引说明:
idx_consumer_situation 这个索引是为了方便查询消费者的情况
producer_id 这个索引方便查询生产者的消息查询
版权声明: 本文为 InfoQ 作者【Johnny】的原创文章。
原文链接:【http://xie.infoq.cn/article/c49e482c6f4ebb8ad6977f763】。未经作者许可,禁止转载。
评论