设计消息队列存储消息数据的 MySQL 表格
1. 队列属性表
记录已经创建的所有消息队列的属性。此表适用于点对点消息,即一条消息由生产者创建后,只能被一个消费者所消费。如果是订阅模式,应该在该表中增加队列类型(点对点队列、订阅队列)
1. 表结构说明
![](https://static001.geekbang.org/infoq/70/708c7c7acea0ac9d791bd8da97ca03a7.png)
每个消息队列对应一张表,创建消息队列的时候,同时为该消息队列创建一张表,原因如下:
降低不同消息队列之间的相互影响,降低对单表的性能要求;
降低单表中的总消息数量,提高查询效率;
在点对点模式中,一个生产者和一个消费者只能访问一个队列,分表设计可以降低设计复杂度
易于扩展和维护,防止出现一张表损坏,影响全局的情况出现
主键
queue_id 作为主键
索引
在 queue_name 列上创建唯一索引
2. 消息表
记录一个消息队列中存储的所有消息。此表适用于点对点消息,即一条消息由生产者创建后,只能被一个消费者所消费。
如果是订阅模式,需要将下表拆成两张表,一张记录消息内容,另外一张记录消息的消费者信息。一条消息内容会对应多个消费者。
表结构说明
![](https://static001.geekbang.org/infoq/fd/fdc96f88fb3036b60c3eb9938cdb04c2.png)
注①:超过最大长度的消息会被存放在文件系统中,每个超长的消息会被保存成一个文件,此时该列中只保存消息文件的绝对路径。对于超长的消息,创建和读取的效率会稍微低一些。
主键
msg_seq,使用自增列作为主键
索引
idx1(msg_id),唯一索引,便于便于消费者确认消息被消费后,修改消息状态使用。
idx2(status,msg_seq),便于消费者查询未消费的消息,查询未消费的 msg_seq 最小的消息,保证一个分片中的消息为先进先出。
评论