消息队列存储数据消息 Mysql 设计
【作业要求】
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 为普通索引,满足根据时间清理消费信息表。
评论