写点什么

模块八 - 设计消息队列存储消息数据的 MySQL 表格

用户头像
关注
发布于: 2 小时前

思路说明

表处理,每个队列一个表:

  • MySQL 大表(千万级)的查询效率比较低

  • MySQL 一个表一个文件,如果文件储存出错了,应该尽量控制影响范围

索引处理,从数据特性:

  • 同一个消息每个组最多消费一次

详细设计

  • 每个消息队列对应一个 MySQL 表

  • 消息队列名就是表名 ${message}

  • 表结构设计为

CREATE TABLE $(message}(  `id` bigint primary key autoincrement not null,    `content` text,  `publish_unixtime` int default 0,    `publish_client` varchar(128) default '',   `create_unixtime` int default 0)ENGINE=InnoDB charset utf8mb4 comment 'message name';               CREATE TABLE ${message}_consume(    `id` bigint primary key autoincrement not null,    `message_id` bigint default 0,    `subscribe_group_name` varchar(128) default '',    `subscribe_client` varchar(128) default '',    `create_unixtime` int default 0,    unique key(`message_id`, `subscribe_group_name`))ENGINE=InnoDB charset utf8mb4 comment 'message consume log';
复制代码

表相关说明

  • message id 通过雪花算法生成,保证每个分片上的 ID 唯一

  • innodb charset 使用 utf8mb4,防止有表情符

  • 每个客户端都有唯一标识,通过消息队列管理器分配

  • message_id 和 subscribe_group_name 组成唯一索引,防止组内重复消费

发布于: 2 小时前阅读数: 3
用户头像

关注

还未添加个人签名 2018.08.08 加入

还未添加个人简介

评论

发布
暂无评论
模块八 - 设计消息队列存储消息数据的 MySQL 表格