写点什么

架构实战营第 10 期模块八作业

作者:刘博
  • 2023-04-12
    山西
  • 本文字数:1057 字

    阅读完需:约 3 分钟

设计分析

  1. 每个消息队列一张表还是所有消息放一张表?

考虑如果有一个消息队列里面消息特别多,可能会影响其他消息队列的性能。所以每个消息队列一张表。通过表名来区分对应的消息队列。

  1. 用什么作为表的主键和索引?

既然是消息队列,消息是有顺序的,考虑用一个自增的列存储消息的 offset,同时这个列作为主键。

消息查询时,可能会涉及针对时间段的查询,并且过期的消息可能需要清理。所以设计一个列存储消息插入的时间,并添加索引,提高查询效率。

  1. 针对消息的操作需要什么信息?

Push 消息对应表的插入,消息入队后不能修改,所以不用考虑修改记录。

Pull 过的消息可以保留在表里面,不用删除。过期的消息可能需要批量删除,可通过时间列查询。

出现问题时,消息的来源和消息的格式可能是有用的信息。为了出现问题时方便检查,增加一个 metadata 列存储可能的附加信息。可以用 key、value 的格式存储,方便扩展其他的信息。


数据表设计

CREATE TABLE `queue` (  `id` bigint(20) NOT NULL COMMENT '主键',  `name` varchar(64) COLLATE utf8mb4_unicode_520_ci NOT NULL COMMENT '队列名称',  PRIMARY KEY (`id`),  UNIQUE KEY `ix_u_name` (`name`) USING HASH COMMENT '队列名称唯一索引') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci COMMENT='队列';
CREATE TABLE `<queue_name>_message` ( `id` bigint(20) NOT NULL COMMENT '主键', `content` varchar(1024) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL COMMENT '消息体', `produced_by` varchar(64) COLLATE utf8mb4_unicode_520_ci NOT NULL COMMENT '生产者', PRIMARY KEY (`id`), KEY `ix_produced_by` (`produced_by`) USING BTREE COMMENT '消费者索引') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci COMMENT='消息';
CREATE TABLE `<queue_name>_message_consumed` ( `id` bigint(20) NOT NULL COMMENT '主键', `message_id` bigint(20) NOT NULL COMMENT '消息主键', `consumed_by` varchar(64) COLLATE utf8mb4_unicode_520_ci NOT NULL COMMENT '消费者', `state` tinyint(2) NOT NULL COMMENT '消费状态 0已发送尚未消费 1消费成功 2消费失败', PRIMARY KEY (`id`), KEY `ix_message_id` (`message_id`) USING BTREE COMMENT '消息主键索引', KEY `ix_consumed_by` (`consumed_by`) USING BTREE COMMENT '消费者索引') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci COMMENT='消息消费记录';
复制代码


用户头像

刘博

关注

还未添加个人签名 2021-09-18 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营第10期模块八作业_刘博_InfoQ写作社区