写点什么

架构实战营模块八作业

作者:孙志强
  • 2022 年 1 月 02 日
  • 本文字数:758 字

    阅读完需:约 2 分钟

一、表 DDL

CREATE TABLE IF NOT EXISTS `xxx_queue_分区id_message`(   `id` bigint UNSIGNED NOT_NULL COMMNET '消息id',   `message` text NOT NULL COMMENT '消息内容',   PRIMARY KEY ( `id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '消息表';
CREATE TABLE IF NOT EXISTS `xxx_queue_consume_pos`( `id` bigint UNSIGNED AUTO_INCREMENT COMMNET '主键id', `consume_group` varchar(100) NOT NULL DEFAULT '' COMMENT '消费组', `partition` int NOT NULL DEFAULT 0 COMMENT '分区编号', `offset` bigint NOT NULL DEFAULT 0 COMMENT '消费的offset', `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `utime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY ( `id` ), idx_consume_group_partition_offset(`consume_group`,`partition`,`offset`))ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '消费进度表';
复制代码

二、设计方案

整体思路

  1. 减少单表数据量。

  2. 优化索引。

  3. 生产消息时通过消费 id 路由到具体的分区下,增加分区需要消息重分布。

具体方案

减少单表数据量

  1. 1 个队列/topic 下的 1 个分区使用 1 张表,申请队列/topic 时(必须指定分区数量)自动创建对应的表,消费者启动后自动插入对应的队列/topic 的消费进度表。

  2. 因为需要范围查找,所以选择 range 分片,同时分片场景下不能使用主键 id,这里消息 id 可通过客户端内置雪花算法来进行生成。

  3. 定期归档数据,对应同 1 个队列/topic 下最小的 offset 之前的消息可以进行归档,如果要支持消息回溯功能,可多留一部分消息表记录。

优化索引

  1. 思路比较简单,消息表直接使用 kv 结构,消息 id 为主键索引,不需要进行回表。

  2. 消费进度表,建立联合索引,通过消息组查 offset 不需要回表。

用户头像

孙志强

关注

还未添加个人签名 2018.11.24 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营模块八作业