写点什么

消息队列存储数据消息 Mysql 设计

作者:闲人Eric
  • 2023-01-27
    上海
  • 本文字数:582 字

    阅读完需:约 2 分钟

【作业要求】

1. 包括表名、字段、索引;

2. 用文字描述设计思路和理由,例如:为什么设计某个索引?

3. 一页 PPT 即可。


【消息表】

建议每个消息队列一张表,因为队列会随着业务发展越来越多,所有队列放到一张表中可能会相互影响,尤其是某个队列数据量暴增的情况下,可能会影响到其他队列。

消息是不断扩张的,可能极端情况下会导致一张表存储一个分区的数据都很困难,另外为了提升写队列性能,考虑一个分区一张表,所以【消息表】设计结构如下:

表名规则为:message_{topic}_{partition}_{page}

其中 partition 为分区序号,page 为表的序号(以下称为页 page)。例如,业务方创建名为 infoq 的 topic,分区数为 4,每张表支持最大消息数量为 1000w,对于第一个分区的表来说,表名为 message_infoq_0_0,当第一张表超出 1000w 条消息后,会创建第二张表,表名为 message_infoq_0_1。

但是为了不让表名无限泛滥,page 最多到 10,如果超过 10 了后,循环回到 message_infoq_{partition}_0 上面去



其中 id 设置为 primary key,消费者通过 id 读取对应的消息。create_time 设置为索引,满足根据时间清理过期消息的需求,默认为 1 年清理一次

【消费信息表】


其中 consumer_group+consumer_id 为普通索引,方便查询对应消费组的最大 offset

consumer_group+topic+partition_id+page_id+offset 为唯一索引,防止重复消费

update_time 为普通索引,满足根据时间清理消费信息表。

用户头像

闲人Eric

关注

还未添加个人签名 2018-04-25 加入

还未添加个人简介

评论

发布
暂无评论
消息队列存储数据消息Mysql设计_架构实战营_闲人Eric_InfoQ写作社区