写点什么

架构实战营模块八作业

作者:程序员小张
  • 2023-03-13
    广东
  • 本文字数:1160 字

    阅读完需:约 4 分钟

表设计原理

自研的消息队列将使用到多种表,以下根据分析只列出关键的几张表;为了便于管理以及扩展,所有消息放一张表,每一项可通过队列名称来区分不同消息队列,同一个消息队列中允许有限数量的自定义主题;表结构的设计中有几个关键点:

  1. 数据库分成多个组,每组又有多个主备成对的数据库组成;组数量确定以后将不可更改,但是每组的主备数据库对可以添加;

  2. 消息体存储于哪一组数据库,由消息体中的消息队列名称哈希结果决定;以此来保证同一个消息将位于同一组数据库中;

  3. 消息的写入将轮询特定组的数据库服务器进行写入;

通过以上设计可满足能够动态添加数据库的同时,又能提高数据库数据的写入效率;

在实际的使用中,mysql 数据库的数据只在服务器重启时用于数据库恢复;服务器中每个打开的消息队列都拥有一个 React 进程,负责与订阅用户建立通讯信道,它维护着一张由订阅表组成的树形表,以及一张由确认表组成的树形表; 当有待发布的消息到来时,程序通过订阅树形表感知到有哪些用户关注当前消息队列的消息主题,并将消息通过多路复用的方式发送给各个订阅者,并根据通讯情况及订阅者要求的服务质量来更新确认树形表,程序将通过确认树形表来制定重传策略;因为是由特定树形结构组织订阅表及确认表数据,所以能够允许用户高效率地撤销订阅或重新订阅。


表设计结构

消息表

CREATE TABLE `message` (  `id` varchar(255) NOT NULL,  `productor_id` varchar(255) DEFAULT NULL COMMENT '生产者标识',  `message_queue` varchar(255) DEFAULT NULL COMMENT '队列名称',  `message_subject` varchar(255) DEFAULT NULL COMMENT '消息主题',  `creat_time` datetime DEFAULT NULL,  `message_body` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码


订阅表 subscribe

CREATE TABLE `subscribe` (  `subscribe_id` varchar(255) NOT NULL COMMENT '订阅 ID',  `subscriber_id` varchar(255) DEFAULT NULL COMMENT '订阅人 ID',  `message_queue` varchar(255) DEFAULT NULL COMMENT '队列名称',  `message_subject` varchar(255) DEFAULT NULL COMMENT '消息主题',  `subscribe_time` datetime DEFAULT NULL COMMENT '订阅时间',  PRIMARY KEY (`subscribe_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码


确认表 confirm

CREATE TABLE `confirm` (  `id` varchar(255) NOT NULL COMMENT '订阅 ID',  `subscribe_id` varchar(255) DEFAULT NULL COMMENT '订阅标识',  `message_id` varchar(255) DEFAULT NULL COMMENT '消息标识',  `confirm_status` varchar(255) DEFAULT NULL COMMENT '确认状态',  `confirm_time` datetime DEFAULT NULL COMMENT '确认时间',  PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码


用户头像

还未添加个人签名 2021-05-29 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营模块八作业_「架构实战营」_程序员小张_InfoQ写作社区