架构实战营模块八作业
作业:设计消息队列存储消息数据的 MySQL 表格
【作业要求】
1. 包括表名、字段、索引;
2. 用文字描述设计思路和理由,例如:为什么设计某个索引?
3. 一页 PPT 即可。
设计思路
数据库设计三类表:日志表、消息表、消费进度表。日志表用于快速存储业务系统写入的消息,表名 msg_log。消息表用于转储日志表的消息,供业务系统读取,每个消息队列对应一张消息表,表名 msg_queue_xxx(其中 xxx 为消息队列的名称)。消费进度表用于记录每个消费者在每个分区下的消费进度或者做消息回溯,表名 msg_queue_offset;
设计日志表的目的是为了提升消息写入性能,因为日志表是顺序写,每次尾部追加数据。每个消息队列一张消息表一方面是为了做业务级别的隔离,另外也能提升读取性能。
业务系统发布消息时,首先写入到日志表,日志表写入成功就代表消息写入成功;后台线程再将消息从日志表转储到消息表中。写入消息表的过程可以是多线程批量写入,每个线程负责一张消息表的写入。为提升性能,针对消息消费进度的读写不必每次都操作数据库,可将该信息缓存到内存,后台线程每隔 1 分钟和数据库做一次同步。
消息成功转储到消息表后需要删除日志表对应的记录,写入消息表和删除日志表的操作在一个事务中。消息表仅保存 30 天之内的消息数据。
表结构
msg_log
索引:
primary key index。
msg_queue_xxx(其中 xxx 为消息队列的名称)
索引:
primary key index;
索引名:idx_publish_time,消息发送时间索引。用于在消息管理平台根据时间查询消息发送的情况。
msg_queue_offset
索引:
primary key index;
注:该表的数据量较小,无需添加额外索引,全表扫描的效率更高。
版权声明: 本文为 InfoQ 作者【spark99】的原创文章。
原文链接:【http://xie.infoq.cn/article/b762062653570301d1f0fde90】。未经作者许可,禁止转载。
评论