模块八作业
设计消息队列存储消息数据的 MySQL 表格
【作业要求】
1. 包括表名、字段、索引;
2. 用文字描述设计思路和理由,例如:为什么设计某个索引?
3. 一页 PPT 即可。
【提示】
1. 需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。
1、每个消息队列一张表,表名需要包含队列的业务,比如 film_shared_msg;
所有消息放一张表的缺点:
1)会经常更新表,不利于数据同步;
2)不同业务的内容长度不同、发送对象、字段名称不同,强行一致,会导致浪费空间、人为增加复杂度;3)不同队列的访问量不同,不利于后续演进时分片部署;
2、film_shared_msg 表的字段:
id,long, 主键,自增
create_time, long,毫秒时间戳
producer_id,long,生产者 id
pre_id,前一个消息的 id,用于查询下一个消息
content_id,long,内容 id
content,text 或 mediumtext,消息的内容本身,长度可能较大,看业务需要用 text 或 mediumtext
3、索引:
id 是主键索引
create_time,producer_id,content_id,pre_id,都作为普通索引
create_time 作索引,是因为消息队列需要定期清理掉过期消息(比如 1 个月或 2 周前的消息),也有按消息产生的时间区间查询需求,避免消息量过大导致慢查询
pre_id 作索引,是为了根据 pre_id=某 id,来查询到下一条消息
4、消费状态表,作用:记录当前消费者已经读取到了哪条消息,当收到消息读取请求时,返回下一条未被读取的消息给消费者
film_shared_consumer 表
id,long, 主键,自增
consumer_id,long,消费者 id
create_time,long
last_msg_id,对应 film_shared_msg 表的 id,表示已处理的最近一条消息,为了进行关联查询下一条消息
id 是主键索引
consumer_id 作普通索引
consumer_id 便于消费者快速查询到当前已处理的消息 id(即 last_msg_id)
评论