写点什么

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

作者:Steven
  • 2021 年 12 月 30 日
  • 本文字数:1149 字

    阅读完需:约 4 分钟

作业:设计消息队列存储消息数据的 MySQL 表格

【作业要求】

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

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

3. 一页 PPT 即可。

【提示】

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


设计思路

使用关系数据库,消息部分的持久化存储内容主要包括 Topic,Message,其它的还有 Queue,ConsumerGroup。这里重点讨论前两者。

Topic

主题,每个 topic 对应一个“消息队列”,每个“消息队列” 采用一张表单独存储。基于几方面考虑:

  • 性能,如果消息太多,则单表数据太多,会对整体性能有影响,主要是查询和更新;

  • 隔离,如果某一个 topic 的消息太多,导致表数据太多,会影响其它的 topic;

  • 可用性,同样的,如果某个 topic 有问题不会影响到其它的 topic;

  • 诊断 & 维护,有利于诊断问题和维护,缩小范围。

Message

消息,消息主要包括标签,消息 ID、Key、消息内容、消息类别、生产者相关(IP+端口,状态,生产时间)、消费者相关(IP+端口,状态,消费时间,重试消费次数),队列 ID(参考下面 Queue 的说明)。


标签,相当于 Topic 的子分类。以电商交易为例,过程中会有订单消息、支付消息、物流消息,Topic 可定义为 Trade_Topic,标签则可定义为:order、pay、logistics。


消息类别,分为普通消息、分区顺序消息、全局顺序消息、事务消息、定时/延时消息。


索引,一般来说需要对 Topic、Message ID 和 Message Key 做查询。现在一个 Topic 一个表,查询 Topic 就可以直接定位到具体的表做查询。Message ID 和 Message Key 各自对对应的字段创建索引即可。

ConsumerGroup

消息者组,同一个消费者组订阅同一个 Topic,实现负载均衡和容错。

Queue

队列,为了能够并行生产和消费,需要引入 Queue,每个 Topic 包含 1~多个 Queue,Topic 的消息分散这些 Queue 里面。


表设计

根据要求,只列出与消息数据直接相关的 Topic、Message 表。

Topic 表

id, 自增 ID,主键索引

topic, 主题

description 描述

create_time 创建时间

Message 表

id, 自增 ID,主键索引

tag, 标签

message_id, 消息 ID

message_key, 消息 Key

message_type, 消息类别

message_body, 消息内容

queue_id, 队列 ID

producer_addr, 生产者地址

producer_status, 生产者状态(发送成功、提交成功,回滚,未知)

produce_time, 生产时间

consumer_addr, 消费者地址

consumer_status, 消费者状态(消费成功,消费超时,消费异常,返回 NULL,消费失败)

consume_time 消费时间

reconsume_times, 重试消费次数

Message 表索引

消息 ID 做唯一索引,索引字段:message_id;

消息 Key 做非聚簇索引,索引字段:message_key;


用户头像

Steven

关注

还未添加个人签名 2008.07.18 加入

还未添加个人简介

评论

发布
暂无评论
设计消息队列存储消息数据的MySQL 表格