架构实战营模块八作业
设计消息队列存储消息数据的 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 去查询的。
版权声明: 本文为 InfoQ 作者【老猎人】的原创文章。
原文链接:【http://xie.infoq.cn/article/c212ba0643677ce97ce0d2c97】。文章转载请联系作者。
评论