写点什么

架构实战营-模块八作业

用户头像
fazinter
关注
发布于: 1 小时前
架构实战营-模块八作业

设计消息队列存储消息数据的 MySQL 表格。

【作业要求】

  1. 包括表名、字段、索引;

  2. 用文字描述设计思路和理由,例如:为什么设计某个索引?

  3. 一页 PPT 即可。

【提示】

需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。


表格设计:

1、每个消息队列对应一个 MySQL 表,消息队列名就是表名,表结构设计为下图;

2、SDK 轮询服务器进行消息读取,只需要对主键 id 字段建立索引即可。



表设计思想

本次设计采用方式: 一个消息队列对应一张表. 理由是:

  1. 如果消息量多的话, 放在在一张表会存在性能问题.

  2. 如果放在一张表中, 势必会增加队列名称字段, 那么为了提高查询效率, 势必会给这个字段增加索引. 而使用分开的表设计, 会节省这个索引.

  3. 如果放在一张表中, 当消息队列不在使用了, 消息队列的历史数据需要删除时, 势必会对这张表进行删除, 容易对正在使用的队列数据库写操作造成影响

综上所述: 本次设计采用一个消息队列对应一张表的设计.

表详细设计

t_queue: 队列表

系统后台维护消息队列时, 对应t_queue这张表. 记录队列的元数据.

用户可以通过消息队列管理控制台, 或者命令行工具(假设产品可以提供命令行管理程序)新建一个队列. 使用此表记录队列的元数据.

字段信息如下:


队列表


注意:

  • queue_name_cnqueue_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 处理日志的查询.

用户头像

fazinter

关注

卓有成效 2019.02.19 加入

烂的开始是成功的一半!

评论

发布
暂无评论
架构实战营-模块八作业