消息存储特性、介质
存储:
- 消息生成者发送消息到MQ
- MQ收到消息,将消息进行持久化,存储该消息
- MQ返回ACK给生产者
- MQ push 消息给对应的消费者
- 消息消费者返回ACK给MQ
- MQ删除消息
注意:
- 第⑤步MQ在指定时间内接到消息消费者返回ACK,MQ认定消息消费成功,执行⑥
- 第⑤步MQ在指定时间内未接到消息消费者返回ACK,MQ认定消息消费失败,重新执行④⑤⑥
存储介质: - 数据库
- ActiveMQ
- 缺点:数据库瓶颈将成为MQ瓶颈
- 文件系统
- RocketMQ/Kafka/RabbitMQ
- 解决方案:采用消息刷盘机制进行数据存储
- 缺点:硬盘损坏的问题无法避免
.
高效读写:
1.申请一片大空间(1G),然后顺序读写
在store文件夹下的commitlog文件(大小1G)中
2.“零拷贝”:
Linux系统发送数据的方式
“零拷贝”技术:
- 数据传输由传统的4次复制简化成3次复制,减少1次复制过程
- Java语言中使用MappedByteBuffer类实现了该技术
- 要求:预留存储空间,用于保存数据(1G存储空间起步
消息存储结构(如何存储):
MQ数据存储区域包含如下内容
- 消息数据存储区域
- topic
- queueId
- message
- 消费逻辑队列(负责存储偏移量,相当于数组下标)
- minOffset
- maxOffset
- consumerOffset
- 索引
- key索引
- 创建时间索引
同步&异步刷盘机制:
同步刷盘
-
生产者发送消息到MQ,MQ接到消息数据
-
MQ挂起生产者发送消息的线程
-
MQ将消息数据写入内存
-
内存数据写入硬盘
-
磁盘存储后返回SUCCESS
-
MQ恢复挂起的生产者线程
-
发送ACK到生产者
异步刷盘
- 生产者发送消息到MQ,MQ接到消息数据
- MQ将消息数据写入内存
- 发送ACK到生产者
优劣:
同步刷盘:安全性高,效率低,速度慢(适用于对数据安全要求较高的业务)
异步刷盘:安全性低,效率高,速度快(适用于对数据处理速度要求较高的业务)
配置方式:
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH