写点什么

消息队列表设计

作者:Rabbit
  • 2021 年 11 月 15 日
  • 本文字数:2201 字

    阅读完需:约 7 分钟

这里设计的 MQ 是以平台的形式来提供服务,使用 MQ 步骤如下:

1、应用要是想接入,需要在平台管理页面申请接入 MQ 服务

2、生产者在平台管理页面创建 topic

3、消费者需要在控制台页面订阅 topic

4、生产者发送消息到 MQ 服务

5、MQ 将接收到的消息发送给消费者

6、消费者接收消息,处理完成后给 MQ 服务 ACK

7、MQ 发送消息后若在一定时间内没有收到 ACK,则重发,最多重发 3 次


-- 开通消息队列服务的 App 登记表

CREATE TABLE `mq_registed_app` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 id,自增实现',

`app_id` varchar(255) NOT NULL COMMENT '已经开通消息队列服务的应用 ID',

`create_time` datetime NOT NULL COMMENT '创建时间',

`create_user_id` varchar(255) NOT NULL COMMENT '创建用户 id',

`last_update_time` datetime NOT NULL COMMENT '最后更新时间',

`last_update_user_id` varchar(255) NOT NULL COMMENT '最后更新用户 id',

`status` varchar(32) NOT NULL COMMENT '数据状态:A 表示数据正常 X 表示该数据已删除',

PRIMARY KEY (`id`),

UNIQUE KEY `unique_mq_registed_app_appId` (`app_id`) USING BTREE COMMENT '每个应用只可以注册一次,因此创建唯一索引,同时支持根据输入 appId 前缀搜索'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- Topic 信息表

CREATE TABLE `mq_topic_info` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`app_id` varchar(255) NOT NULL COMMENT 'appId',

`topic_name` varchar(255) NOT NULL COMMENT 'topic 名称',

`create_time` datetime NOT NULL COMMENT '创建时间',

`create_user_id` varchar(255) NOT NULL COMMENT '创建用户 id',

`last_update_time` datetime NOT NULL COMMENT '最后更新时间',

`last_update_user_id` varchar(255) NOT NULL COMMENT '最后更新用户 id',

`status` varchar(32) NOT NULL COMMENT '数据状态:A 表示数据正常 X 表示该数据已删除',

PRIMARY KEY (`id`),

UNIQUE KEY `unique_mq_topic_info_appId_topicName` (`app_id`,`topic_name`) USING BTREE COMMENT '可根据 app_id 快速查询它下面的 topic'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- Topic 和消费者关系表,一个 topic 可能有很多个消费者

CREATE TABLE `mq_consumer_topic_relation` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`app_id` varchar(255) NOT NULL COMMENT 'appId',

`topic_id` int(11) NOT NULL COMMENT 'topicId,对于 mq_topic_info 表的 id',

`consumer_id` int(11) NOT NULL COMMENT '消费者 id,即应用 ID',

`create_time` datetime NOT NULL COMMENT '创建时间',

`create_user_id` varchar(255) NOT NULL COMMENT '创建用户 id',

`last_update_time` datetime NOT NULL COMMENT '最后更新时间',

`last_update_user_id` varchar(255) NOT NULL COMMENT '最后更新用户 id',

`status` varchar(32) NOT NULL COMMENT '数据状态:A 表示数据正常 X 表示该数据已删除',

PRIMARY KEY (`id`),

KEY `idx_mq_consumer_topicId_consumerId` (`topic_id`,`consumer_id`) USING BTREE COMMENT '可以根据 topic_id 快速查询它下面的消费者'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- 消息表

-- 每个 topic 创建一个表来存储,这样不同的 topic 数据相互不影响

CREATE TABLE `mq_message_{topicname}` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 id,自增实现',

`app_id` varchar(255) NOT NULL COMMENT 'appId',

`content` text NOT NULL COMMENT '消息内容',

`topic_id` varchar(255) NOT NULL COMMENT 'topic 的 id',

`create_time` datetime NOT NULL COMMENT '创建时间',

`create_user_id` varchar(255) NOT NULL COMMENT '创建用户 id',

`last_update_time` datetime NOT NULL COMMENT '最后更新时间',

`last_update_user_id` varchar(255) NOT NULL COMMENT '最后更新用户 id',

`status` varchar(32) NOT NULL COMMENT '数据状态:A 表示数据正常 X 表示该数据已删除',

PRIMARY KEY (`id`),

KEY `idx_mq_message_topic_id` (`topic_id`) USING BTREE COMMENT '可以根据 topic_id 快速查询它下面的消息'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- 每条消息消费结果

CREATE TABLE `mq_message_consume_result` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 id,自增实现',

`message_id` int(11) NOT NULL COMMENT '消息 Id,对应 mq_message_{topicname}表的 id',

`consumer_id` varchar(255) NOT NULL COMMENT '消费者 id,即哪个应用消费了这条消息',

`consume_status` varchar(32) NOT NULL COMMENT '数据消费状态:Y 表示已消费 N 表示未消费',

`consume_count` int(11) NOT NULL COMMENT '数据发给消费者的次数',

`create_time` datetime NOT NULL COMMENT '创建时间',

`create_user_id` varchar(255) NOT NULL COMMENT '创建用户 id',

`last_update_time` datetime NOT NULL COMMENT '最后更新时间',

`last_update_user_id` varchar(255) NOT NULL COMMENT '最后更新用户 id',

`status` varchar(32) NOT NULL COMMENT '数据状态:A 表示数据正常 X 表示该数据已删除',

PRIMARY KEY (`id`),

KEY `idx_mq_consume_info_msgId_consumerId` (`message_id`,`consumer_id`) USING BTREE COMMENT '可以根据 message_id 快速查询该消息的消费情况'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

用户头像

Rabbit

关注

还未添加个人签名 2018.07.17 加入

还未添加个人简介

评论

发布
暂无评论
消息队列表设计