消息队列存储消息数据的 MySQL 表格设计
【作业要求】
1. 包括表名、字段、索引;
2. 用文字描述设计思路和理由,例如:为什么设计某个索引?
3. 一页 PPT 即可。
【提示】
1. 需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。
【设计】
消息队列的概念:
topic:消息队列的主题,生产和消费消息都是基于 topic 的,一个topic就是一个队列
设计思路:
一个 topic 一张表
性能考虑,都放在一张表里的话,如果队列比较多而且消息量大的情况下会影响查询消息和写入消息的性能
如果都放到一张表里,各个队列会相互影响,比如删除a队列时需要删除表中大量的数据,此时会影响插入消息
用于记录消息主体
创建topic时创建一张topic的表,例如topic_msg_xxx表,字段包括:
id : mysql 自增 id,主键唯一索引
msg_id : 消息id,唯一索引,id由id生成器生成
type : 消息类型,1.单播消息,2.广播消息,3.延迟消息,4.事务消息
body :text类型,大文本,消息体
status:消息状态:1.未被消费,2.已消费完成
send_time: timestamp类型,当tpye=3的时候使用,表示消息投递时间
create_time : 创建时间
update_time : 最后一次消费的时间
索引:
id为主键唯一索引
msg_id 唯一索引,表示消息的唯一标识,防止重复
type 普通索引,便于查询一类消息
send_time 普通索引,用于查询延迟消息,判断是否需要投递消息
联合索引(type,status,create_time) 普通索引,查询消息时按照消息类型、消息状态,和消息创建的时间进行查询,找到下一条待消费的消息:
select * from topic_msg_xxx where type=1 and status=1 order by create_time;
用于记录消费者消费消息的情况,每个topic一张表,例如 topic_consum_xxx表,字段包括:
id: 自增id,主键唯一索引
consum_id : 消费者id
msg_id: 消息id
status : 消息状态,1. 已被消费拉取,2. 消费者已确认消费完成
create_time : 创建时间,消费者消费消息的时间
update_time : 更新时间
索引:
msg_id: 普通索引,用于统计该消息已被多少个消费者消费
联合唯一索引:(consum_id,msg_id) 防止同一个消费者重复消费消息