当前位置:网站首页>消息队列存储消息数据的MySQL表设计
消息队列存储消息数据的MySQL表设计
2022-07-31 00:08:00 【InfoQ】
消息队列存储结构分析
message表
- 由于系统架构的设计上数据是进行分组,所以表中需要一个代表分组的字段:shard_id。每一组数据分组集群,其shard_id是固定的。这个类似于kafka的partition分区设计,不同的consumer可以拉取不同的shard,达到加速消费的目的;
- 此处设计每个topic用一张单独的表去存储,即message_{topic},原因是1.MySQL理论上支持的表上亿,能满足topic数量要求 2.用单张表存可以隔离各topic的影响(物理上的逻辑上的)3.使用起来比较简单,因为单表中只可能是该topic的消息,id也可以使用自增的。

consume_log表
- 我们支持多个消费者组,每个消费者组共享一条消费进度记录,所以表中需要有group字段来区分是哪个消费者组的消费记录;
- 消费偏移量是最重要的,记录了消费到哪条数据,用offset来标识,即message表中的msg_id,因为msg_id在一个数据分组,一个topic下是严格递增的;

索引分析
发送消息
- 客户端完成分片路由,分配到某个shard,发送消息数据
- 消息队列服务器根据topic找到对应的消息表message_{topic},然后插入数据,msg_id自增
消费消息
- 客户端完成分片的路由,向对应服务器拉取消息,带上参数topic,group
- 查询consumer_log表,根据topic,group通过索引找到对应的数据,取出offset
- 根据offset查询对应的message表,通过主键id,找出下个offset的记录,取出并准备返回
- 更新consumer_log的offset信息
- 返回数据
消息过期
索引总结
- message_log表增加idx_topic_group,是topic+group的组合索引
- message表增加idx_born_date,是born_date的索引
边栏推荐
猜你喜欢

加密传输过程

【深入浅出玩转FPGA学习14----------测试用例设计2】

uniapp develops WeChat applet - soft exam brushing applet

边缘计算与小程序也能结合!智能家居是否能借势上台阶

How to Repair Word File Corruption

Gabor滤波器学习笔记

Encapsulate and obtain system user information, roles and permission control

Unity 加载读取PPT

MySQL的grant语句

How to install joiplay emulator rtp
随机推荐
binglog日志追踪:数据备份并备份追踪
leetcode 406. Queue Reconstruction by Height
Chevrolet Trailblazer, the first choice for safety and warmth for your family travel
image里的mode属性
JS中? ?和??=和?.和 ||的区别
Gabor滤波器学习笔记
Axure轮播图
数据清洗-使用es的ingest
如何在 AWS 中应用 DevOps 方法?
Shell programming conditional statement test command Integer value, string comparison Logical test File test
How to solve the error of joiplay simulator
Linux 部署mysql 5.7全程跟踪 完整步骤 django部署
transition transition && animation animation
How to ensure the consistency of database and cache data?
flex布局父项常见属性flex-wrap
How to import game archives in joiplay emulator
47.【指针与数组】
What are the efficient open source artifacts of VSCode
MPI简谈
46.<list链表的举列>