架构实战营-模块八作业
设计消息队列存储消息数据的 MySQL 表格。
【作业要求】
包括表名、字段、索引;
用文字描述设计思路和理由,例如:为什么设计某个索引?
一页 PPT 即可。
【提示】
需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。
表格设计:
1、每个消息队列对应一个 MySQL 表,消息队列名就是表名,表结构设计为下图;
2、SDK 轮询服务器进行消息读取,只需要对主键 id 字段建立索引即可。
表设计思想
本次设计采用方式: 一个消息队列对应一张表. 理由是:
如果消息量多的话, 放在在一张表会存在性能问题.
如果放在一张表中, 势必会增加队列名称字段, 那么为了提高查询效率, 势必会给这个字段增加索引. 而使用分开的表设计, 会节省这个索引.
如果放在一张表中, 当消息队列不在使用了, 消息队列的历史数据需要删除时, 势必会对这张表进行删除, 容易对正在使用的队列数据库写操作造成影响
综上所述: 本次设计采用一个消息队列对应一张表的设计.
表详细设计
t_queue: 队列表
系统后台维护消息队列时, 对应t_queue
这张表. 记录队列的元数据.
用户可以通过消息队列管理控制台, 或者命令行工具(假设产品可以提供命令行管理程序)新建一个队列. 使用此表记录队列的元数据.
字段信息如下:
队列表
注意:
queue_name_cn
与queue_name_en
用户必填queue_name_en
: 只能包含小写英文字母和下划线_
, 且必须已小写字母开头queue_table_name
由后台自动生成, 生成规则为: 固定前缀t_queue_
+ 用户填写的queue_name_en
字段内容.
索引:
queue_name_en: 需要创建唯一索引, 因为队列名称不能重复
queue_table_name: 需要创建唯一索引, 队列名称不能重复.
t_queue_xxxx: 消息表
存储消息队列中具体的消息. xxxx 表示用户创建的队列具体名称, 对应t_queue
表中queue_name_en
字段值.
一个队列一张消息表. 而队列中的一条具体的消息则对应此表中具体的一条记录.
字段信息如下:
消息表
索引:
id: 消息 ID, 主键自增
state: 消息状态需要添加索引, 因为每次客户端轮训消费时, 只需要返回状态为 0(未消费)的消息.
msg_date(可进一步拆分为创建时间、修改时间): 消息时间添加索引, 可以加快对消息的过滤.
t_queue_xxxx_log: 消息处理日志表
保存每条消息处理的具体信息, xxxx 表示用户创建队列具体的名称, 对应t_queue
表中queue_name_en
字段值.
一个队列对应一张消息处理日志表. 日志表记录客户端对每条消息处理的结果.
注意: 日志表只会新增, 不存在更新.
字段信息如下:
消息处理日志表
注意:
client_id: 客户端 ID 可以由消息队列 SDK 自动生成, 或者使用配置文件进行配置都可以.建议客户端 ID 保持唯一性.
索引
queue_id: 对应 t_queue_xxxx 表中消息 ID. 添加索引可以加快对消息 ID 处理日志的查询.
评论