消息队列概述
组成
作用
应用场景:
- 异步解耦
- 削峰
- 顺序保证
- 缓冲
常见中间件
名字 | 特点 |
---|---|
kafka | 高吞吐、持久化、partition 有序,多broker 备份,写hash 保证多patition 有序,单机并发10w/s |
nsq | 内存,高吞吐,不保证顺序,没有备份机制 |
rocket MQ | 并发w/s,支持事务,仅支持java |
rabitMQ | 并发w/s,支持事务,支持多语言,标准消息队列协议,通用性好 |
redis | 高吞吐,没有组概念 |
生产者消息的可靠投递
组成
- 生产者 P
- 消费者 C
- 消息队列 M
- 消息确认服务 MC
过程
- P submit MC ,消息prepare
- C 内部业务持久化操作
- C confirm MC , 消息撤销 /确认
- Mc 轮询P ,与P check 确认
消费者消息的可靠接收
- C 消费结果确认机制
- Mc 轮询 C,与C 确认
kafka 文件存储原理:
partition 文件存储说明
- 目录规则: topic+partitionid
- 存储文件:segment file组成和物理结构。数据分段 segment
- segment file组成:
- index file:
- 文件名是当前topic 消息的开始序列值。消费时,通过offset 二分查找文件,提高效率;
- 索引文件内,a 相对偏移量、b 对应data 文件offset:
- a相对偏移量=offset-文件索引初始值, 减小索引文件占用的空间;
- a的值设置成稀疏索引的方式 ,减少空间占用
- 然后通过mmap 直接读取message;
- data file:数据文件
- 2个文件一一对应
- segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。
- 文件元数据映射关系:
- messge 结构
- index file:
- segment file组成:
参考文章:
https://juejin.im/post/5d8882bdf265da03c9273821