写点什么

架构实战营模块八作业

用户头像
老猎人
关注
发布于: 6 小时前

设计消息队列存储消息数据的 MySQL 表格

表名、字段、索引

每个消息队列一张表,后续如果数据量多了,或者并发量大,可以一个消息队列多张表。

表名

消息队列名可以让用户自定义,表名就是消息队列名。

t_消息队列名_创建人 id_创建时间

字段


索引

可以设计两个索引

1.offset 作为索引

2.timestamp+offset 作为联合索引

3.可以用户自定义,把 key 作为索引字段。

设计思路和理由

mysql 一张表的数据量是有上限的,两千多万,消息队列的数据都放在一张表里肯定是不合适的。不仅是数据量大了放不下,而且会互相影响。

字段设计理由:

时间戳是肯定需要的,查询消息和排查问题的时候都需要时间戳。

消息队列肯定有消息生产者,生产者 id 需要记录下来,排查问题时需要。

key 字段:可以作为消息的标识,方便查找,也可以使用 uuid,当一个消息队列多张表时,每个表作为一个消息队列的分区,可以根据 key 来分区。

offset:记录消息的条数,自增 id 作为主键,可以根据 offset 定位消费的位置,作为索引字段。

索引设计理由:

offset 作为主键,可以根据 offset 来查找消息,消费者也要记录 offset,肯定要设计为索引。

timestamp+offset 作为联合索引是可选项,当有根据时间来查找消息或者定位消费位置的需求的时候,将时间戳+offset 作为联合索引,根据时间查找会快一些,加上 offset 作为联合索引,考虑到只使用时间戳的话,如果出现消息在某个时间段集中大量发送,这样的话索引效果不好,再加上如果消息量比较多,同一时间戳下会有很多条消息,如果要定位到某一条消息,还是需要结合 offset 去查询的。


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

老猎人

关注

还未添加个人签名 2018.12.18 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营模块八作业