写点什么

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

作者:阿卷
  • 2022 年 4 月 17 日
  • 本文字数:1044 字

    阅读完需:约 3 分钟

表设计

CREATE TABLE `topic` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(32) NOT NULL COMMENT '主题名',  `message_retention` int(11) NOT NULL COMMENT '消息保留时间ms',  `message_max_bytes` int(11) NOT NULL COMMENT '消息最大字节数',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='主题表';
CREATE TABLE `consumer_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `topic_id` int(11) NOT NULL COMMENT '主题id', `name` varchar(32) NOT NULL COMMENT '分组名', `last_message_id` int(11) NOT NULL COMMENT '最后消费的消息ID', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消费者分组表';
CREATE TABLE `consumer_group_message` ( `group_id` int(11) NOT NULL COMMENT '分组id', `message_id` int(11) NOT NULL COMMENT '消息id', `ack_at` datetime DEFAULT NULL COMMENT '消息确认时间', PRIMARY KEY (`group_id`,`message_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消费者分组消息表';
CREATE TABLE `message_topicName` ( `id` int(11) NOT NULL AUTO_INCREMENT, `message` text COMMENT '消息内容', `created_at` datetime DEFAULT NULL COMMENT '生产时间', PRIMARY KEY (`id`), KEY `idx_created_at` (`created_at`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消息表';
复制代码

topic:

主题表,新建主题时写入,可保存一些主题的属性,如消息保留时长、消息大小限制等。

索引:只要一个主键,程序会加载所有主题数据缓存到内存,运行过程中不会读取。

consumer_group:

消费者分组表,一个主题可以建立多个分组,消费者属于具体的分组,各个分组之间的消费进度相互独立。分组表中记录最后消费的消息 ID,可通过 API 修改该值重新消费之前的消息。

索引:只要一个主键,程序会加载所有主题分组数据缓存到内存,运行过程中不会读取。

consumer_group_message:

消费者分组消息表,记录发送的消息,已经消息确认时间,未确认的消息可重发。

索引:group_id 和 message_id 联合主键,需要通过这个主键更新确认时间。

message_topicName:

消息表,每一个主题对应一个消息表,表名格式为 message_主题名 ,每个主题独立表设计可以提供更好的查询新能和扩展性,如可将不同的主题保存到不同的库中。删除主题也只需要直接删除整个表就可以。

索引:主键,通过主键查找消息,created_at 需要定时通过消息生产时间删除过期的时间。


用户头像

阿卷

关注

还未添加个人签名 2021.06.29 加入

还未添加个人简介

评论

发布
暂无评论
消息队列存储消息数据的 MySQL 表格_架构实战营_阿卷_InfoQ写作平台