设计消息队列存储消息数据的 MySQL 表格
作业思路:
1.调查消息队列常见用例,分析需要存储的数据
2.根据调查结果,自行设计,并记录设计思路和理由
3.调查常用消息队列,查漏补缺
1 消息队列常见用例
角色:生产者、消费者、交换器(路由键、绑定、类型)、消息队列
1.1 运转流程
1) 生产者发送消息流程
复制代码
2) 消费者接收消息流程
复制代码
1.2 消息队列
RabbitMQ 消息队列参数
消息队列参数说明:
复制代码
1.3 生产与消费消息
生产消息参数说明:
复制代码
消费消息参数说明:
复制代码
1.4 其他场景(特性)
复制代码
2 消息数据 MySQL 表格
2.1 消息数据分析
分析:
消息数据与发送、接收、队列、事务、确认、集群、序列化等有关。
消息数据与传递的过程、系统环境无关。比如交换器相关参数、传输协议特定参数、消息队列配置信息。
消息结构:
复制代码
实例调查:
RocketMQ 消息队列信息补充
复制代码
Kafka 消息队列信息补充
复制代码
2.2 MySQL 消息数据表
需求
自研消息队列架构
Java 语言编写消息队列服务器;
消息存储采用 MySQL;
SDK 轮询服务器进行消息写入;
SDK 轮询服务器进行消息读取;
MySQL 双机保证消息尽量不丢;
使用 Netty 自定义消息格式,并且支持 HTTP 接口。
设计考虑
采用所有消息放一张表,里面加一个“队列名称”。
如果按照队列名称建表,在上面的架构中,数据分组会出现数据分布不均衡(某些数据分组过大或过小)、业务服务器 SDK 轮询写入复杂度较高(业务对应队列名,进而对应存储)。
如果统一放在一张表,架构只需要考虑数据的分片(分组)、数据的高可用。当然,需要选择合适的分片方式。
MySQL 消息数据表
复制代码
索引:根据分片的要求设计索引。读取信息时的根据客户端读消息 API 参数建立索引。
id 索引:分片
queue 索引:客户端读
topic 索引:客户端读
版权声明: 本文为 InfoQ 作者【唐尤华】的原创文章。
原文链接:【http://xie.infoq.cn/article/0dd1d90314a86bef7ce98890b】。文章转载请联系作者。
评论