[架构实战营] 模块八作业
【作业要求】
设计消息队列存储消息数据的 MySQL 表格
包括表名、字段、索引;
用文字描述设计思路和理由,例如:为什么设计某个索引?
一页 PPT 即可
【提示】
需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段
表结构分析
自研的消息队列将使用到多种表,以下根据分析只列出关键的几张表;为了便于管理以及扩展,所有消息放一张表,每一项可通过队列名称来区分不同消息队列,同一个消息队列中允许有限数量的自定义主题;表结构的设计中有几个关键点:
数据库分成多个组,每组又有多个主备成对的数据库组成;组数量确定以后将不可更改,但是每组的主备数据库对可以添加;
消息体存储于哪一组数据库,由消息体中的消息队列名称哈希结果决定;以此来保证同一个消息将位于同一组数据库中;
消息的写入将轮询特定组的数据库服务器进行写入;
通过以上设计可满足能够动态添加数据库的同时,又能提高数据库数据的写入效率;
在实际的使用中,mysql 数据库的数据只在服务器重启时用于数据库恢复;服务器中每个打开的消息队列都拥有一个 React 进程,负责与订阅用户建立通讯信道,它维护着一张由订阅表组成的树形表,以及一张由确认表组成的树形表; 当有待发布的消息到来时,程序通过订阅树形表感知到有哪些用户关注当前消息队列的消息主题,并将消息通过多路复用的方式发送给各个订阅者,并根据通讯情况及订阅者要求的服务质量来更新确认树形表,程序将通过确认树形表来制定重传策略;因为是由特定树形结构组织订阅表及确认表数据,所以能够允许用户高效率地撤销订阅或重新订阅。
表结构设计
消息表
message_id varchar(128) 消息标识 主键
productor_id varchar(128) 生产者标识
message_queue varchar(128) 队列名称
message_subject varchar(128) 消息主题
create_time dateTime 创建时间
message_body clob
订阅表
subscribe_id bigint 订阅 ID 主键
subscriber_id varchar(128) 订阅人 ID
message_queue varchar(128) 订阅的队列名称
message_subject varchar(128) 订阅的消息主题
subscribe_time dateTime 订阅时间
Qos int 服务质量
确认表
confirm_id bigint 确认 ID 主键
message_id varchar(128) 消息标识 主键
subscribe_id bigint 订阅 ID
confirm_status int 确认状态(根据不同的服务质量填写不同的确认状态)
版权声明: 本文为 InfoQ 作者【xyu】的原创文章。
原文链接:【http://xie.infoq.cn/article/9de92896b0104cf39ea4ca96d】。文章转载请联系作者。
评论