模块八作业
作业:设计消息队列存储消息数据的 MySQL 表格
【作业要求】
1. 包括表名、字段、索引;
2. 用文字描述设计思路和理由,例如:为什么设计某个索引?
3. 一页 PPT 即可。
【提示】
1. 需要考虑每个消息队列一张表,还是所有消息放一张表,里面加一个“队列名称”的字段。
【设计思路】
参考 kafka 的 topic,partion,consumer-group,consumer 的设计理念来进行相关表的设计
系统中需要记录 topic 记录,topic 下可以包含多个 partion, 每个 partion 对应一个表,这样可以增加系统并行消费能力;在新建 topic 的时候,根据当前 broker 分组的数量,将 partion 分别分布到这些 broker 分组的 mysql 中,因此,topic,partion,broker-group 需要记录对应的关系数据,这些元数据可以存储到 zk 中
consumer-group 中多个 consumer 来消费 topic 中多个 partion 的消息数据,这里可能会有一个分区平衡的问题,可以利用 zk 的选举机制,选举 leader 来进行 partion 的分配
每个 consumer 消费完一些消息后,需要提交消费记录,因此还需要一个表来记录消费者提交消费的记录,每个 consumer 根据消费的 partion 中最大消息记录 id 写入到对应的 broker 组的 mysql 中进行存储;
为了便于根据消息时间回溯消费,partion 的消息记录中需要存储生产消息时间,并且需要建立索引
为了便于根据业务 id 检索消息,partion 的消息记录中需要存储业务标识 id,并且需要建立索引
【表结构设计】
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 自增长
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 的消费情况
评论