写点什么

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

作者:小虎
  • 2023-01-29
    北京
  • 本文字数:783 字

    阅读完需:约 3 分钟

CREATE TABLE topic (    id int(11) auto_increment NOT NULL,    name varchar(100) DEFAULT "" NOT NULL COMMENT '主题',    description varchar(150) DEFAULT "" NOT NULL COMMENT '描述',    created_at datetime NOT NULL,    PRIMARY KEY(id),    INDEX idx_topic_name(name)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='队列主题表';
CREATE TABLE messages_{topic_id} ( id BIGINT UNSIGNED auto_increment NOT NULL, content text NOT NULL COMMENT '消息体', created_at datetime NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='队列消息表';
CREATE TABLE consumer ( id int(11) auto_increment NOT NULL, name varchar(100) DEFAULT "" NOT NULL COMMENT '消费者标识', topic_id int(11) DEFAULT 0 NOT NULL COMMENT '主题id', commit_msg_id BIGINT UNSIGNED DEFAULT 0 NOT NULL COMMENT '最后消费消息id', created_at datetime NOT NULL, updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE INDEX idx_cousumer_name_topic(name, topic_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='消费者表';
复制代码


设计思路

  1. topic 表保存所有的消息队列主题,消息按主题存储。

  2. 每创建一个消息队列主题,自动创建一个对应的消息表,可以通过 topic 的 id 自动构造消息表。

  3. 使用 bigint unsigned 作为自增主键

  4. 定期删除过期的消息

  5. 暂时不考虑消息数量超出自增 id 的情况,可能性较小,可以通过再创建一个新的队列或者改造为分表的情况。

  6. consumer 表存储多个消费者的信息

  7. 建立消费者标识、主题 id 的唯一索引

  8. 记录消费者最后消费的数据,便于获取未消费的消息

用户头像

小虎

关注

还未添加个人签名 2018-03-11 加入

还未添加个人简介

评论

发布
暂无评论
设计消息队列存储消息数据的 MySQL 表格_#架构训练营_小虎_InfoQ写作社区