模块八作业
作业:设计消息队列存储消息数据的 MySQL 表格
【作业要求】
1. 包括表名、字段、索引;
2. 用文字描述设计思路和理由,例如:为什么设计某个索引?
3. 一页 PPT 即可。
【提示】
1. 需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。
消息队列每个主题对应一个 MySQL 表:
1.MySQL 存储消息时,单表超过 2 千万以上,B+tree 索引会到 3 层高度,磁盘扫描多次,造成性能的下降;
如果消息队列所有的主题 topic 数据都放在一张表,数据量庞大,不利于检索,性能不高。
2.维护不方便,消息队列是按照主题区分各种业务性质的,包括某个主题的生产者,消费者;按照主题区分表,更利于维护和排查问题;
消息队列对应的 MySQL 表设计:
表名称:前缀 t_+消息队列主题小写名称;
作用:记录提交的消息列表;
消息 ID:msg_id,主键,采用分布式 ID 算法生成器生成,比如雪花算法;
Broker ID:broker_id, 消息队列服务端肯定是分布式部署,那么每个分片对应一个 brokerId;
消息内容:content;
消息创建时间:create_time;
偏移量:offset,当前消息所在顺序,长整数递增;
表名称:前缀 t_+消息队列主题小写名称+消费者 id;
作用:记录每个消费者的进度;
消费者 id:consumer_id;
偏移量:offset,消费者最后一次批量拉取,确认成功一个偏移量,假设批量拉取 10,11,12,只有 10 确认成功,那么就是 10;
更新时间:update_time;
消息队列 MySQL 表设计索引设置:
1.消息队列消费生产消息时有唯一标识 ID,以便后续业务部门的问题排查,因此 msgid 必须含有索引;
2.消息表需要定期清理几天前的消息,因此 create_time 需要加索引
3.消费者从主体消费消息时,每次批量拉取一批未消费的消息,需要从上次已经消费的偏移量开始, 消费者的进度表的 consumer_id 需要加索引
评论