写点什么

模块八作业

用户头像
河马先生
关注
发布于: 2 小时前

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

【作业要求】

1. 包括表名、字段、索引;

2. 用文字描述设计思路和理由,例如:为什么设计某个索引?

3. 一页 PPT 即可。

【提示】

1. 需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。


【设计思路】

  1. 参考 kafka 的 topic,partion,consumer-group,consumer 的设计理念来进行相关表的设计

  2. 系统中需要记录 topic 记录,topic 下可以包含多个 partion, 每个 partion 对应一个表,这样可以增加系统并行消费能力;在新建 topic 的时候,根据当前 broker 分组的数量,将 partion 分别分布到这些 broker 分组的 mysql 中,因此,topic,partion,broker-group 需要记录对应的关系数据,这些元数据可以存储到 zk 中

  3. consumer-group 中多个 consumer 来消费 topic 中多个 partion 的消息数据,这里可能会有一个分区平衡的问题,可以利用 zk 的选举机制,选举 leader 来进行 partion 的分配

  4. 每个 consumer 消费完一些消息后,需要提交消费记录,因此还需要一个表来记录消费者提交消费的记录,每个 consumer 根据消费的 partion 中最大消息记录 id 写入到对应的 broker 组的 mysql 中进行存储;

  5. 为了便于根据消息时间回溯消费,partion 的消息记录中需要存储生产消息时间,并且需要建立索引

  6. 为了便于根据业务 id 检索消息,partion 的消息记录中需要存储业务标识 id,并且需要建立索引


【表结构设计】

  1. partion_message 表


  • 每个 broker 组中有多个 partion_message 表,如 partion_message_0, partion_message_1, partion_message_2 等等(这个元数据记录可以存 mysql,也可以存在 zk 上),已分配的 partion_message 不再参与分配到其他的 topic

  • 每个 topic 包含每个组中的部分 partion_message 表

  • 如果 partion_message 不够,可以扩充 partion_message 表 partion_message_xxxx

  • 每个 partion_message 表的 id 自增长

  1. consumer_offset 表


  • 每个 broker 组中只包含一个 consumer_offset 表

  • partion 字段为 consumer 从当前 broker 组中消费 partion_message 表的后缀,如消 partion_message_1 表的数据,则 partion 为 1

  • offset 记录的为当前消费者对于当前 partion 下次需要消费的消息记录的 id,这个 id 为 partion_message 中的对应的 id

  • consumer_name 和 topic 需要增加索引,方便根据 consumer_name 查找其对应的消费记录信息

  • topic 需要增加索引,方便根 topic 查询每个 consumer 的消费情况

用户头像

河马先生

关注

还未添加个人签名 2019.04.16 加入

还未添加个人简介

评论

发布
暂无评论
模块八作业