消息队列存储消息数据的 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) 防止同一个消费者重复消费消息
版权声明: 本文为 InfoQ 作者【tjudream】的原创文章。
原文链接:【http://xie.infoq.cn/article/c14c0978f5f7087b47a346162】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论