写点什么

模块八作业

作者:Geek_ec866b
  • 2022 年 4 月 17 日
  • 本文字数:712 字

    阅读完需:约 2 分钟

表设计



表设计思路

为消息队列设计两类表

  • 一类是用来存储每个主题队列的消息内容、消息 key 和消息状态信息;

  1. 消息状态用来标识消息消费情况,可实现超时未消费成功的消息移入死信队列功能

  • 一类是用来存储所有队列的元信息数据,如逻辑队列名、分表编号、分库编号、队列当前消费偏移量、队列最大偏移量。

  1. 按照<逻辑队列名>_<分表编号>做表明来建立消息表

  2. 按照分库编号找到对应数据库

  3. 每当插入对应队列信息表一条数据后,需要拿到偏移量 id 修改最大偏移量

  4. 每当要消费消息时,先到元信息表中查找对应消息队列的当前消费偏移量,根据当前偏移量到消息表中获取消息进行消费。

队列与表对应关系

这里采用了一个主题队列对应一张消息队列表的分表设计方案;

  1. 优点:

  • 可以通过自增主键 id 来自动标识每个主题队列新增消息的偏移量,避免自己维护的一致性和多线程竞争问题;

  • 多个消费者消费不同消息队列从不同的表中读取数据,提高效率,减轻高并发下单表压力;

  • 方便后期程序拓展为消息分库分表存储;

缺点:每次新建主题,都要动态生成一张对应的消息表,并且有一定的路由策略,实现稍复杂

索引设计思路

  1. 消息表中的主键 id,同时作为队列中对应消息的消息偏移量,设置为主键 id,按偏移量查找队列中某个位置消息,效率极高。

  2. 消息表中 msg_key,建立一个普通索引,方便按照消息 key 进行查找,可实现按 key 回溯消息功能。

  3. 消息表中 create_time,建立一个普通索引,方便按照某个时间进行查找,实现按某个时间进行回溯消息。

  4. 队列元信息表中的主键 id,与业务无关,仅做主键使用

  5. 队列元信息表中有联合索引 QUEUE_TABLE_INDEX,顺序为 <quque_name><db_id><tab_id>,

  6. 按此顺序,可以方便的按照队列名或者队列名+数据库 id+表 id 进行快速查找对应队列的元信息属性。

用户头像

Geek_ec866b

关注

还未添加个人签名 2020.07.22 加入

还未添加个人简介

评论

发布
暂无评论
模块八作业_架构训练营_Geek_ec866b_InfoQ写作平台