消息队列表设计
这里设计的 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;
评论