RocketMQ|RocketMQ -- 消息发送存储流程
【RocketMQ|RocketMQ -- 消息发送存储流程】前面已经讲了消息是怎么发送给broker的,那broker接收到消息后,是怎么处理的?
为了保证消息不丢失,RocketMQ会把消息进行持久化,也就是说,会把消息写入commitlog的日志,这个目录是在store下面。每个日志大小为1G,所以commitlog会有多个磁盘文件,每个文件名是消息的物理偏移量。
文章图片
当broker接收到消息的时候,首先会进行一些判断,比如只能master可以写入,Topic的长度限制为256个字符,消息属性长度限制为65536个字符等。
等验证通过后,开始进行写数据,由于可能存在并发问题,所以每次写的时候,都需要申请锁。
文章图片
申请到锁后,开始往commitlog里写数据,如果是刚开始写入日志文件的时候,此时commitlog并没有文件,所以就会创建一个大小为1G名字为00000000000000000000的日志文件。如果已经存在多个日志文件,那直接取最后一个日志文件,因为日志文件写完才会创建一个新的日志文件,那最后一个日志文件就是当前需要写入的。
文章图片
拿到日志文件后,我们需要将消息追加到这个文件里,此时需要知道当前文件的写指针,如果是刚创建的文件,那写指针就是0。
这个写指针是不能大于文件的大小,如果超过了,说明文件已写满,那是不能往里面写数据的。
文章图片
另外一个还需要判断的是,当前消息是否够放这个文件,也就写指针+消息的长度(mq还会预留其他空间),是否会超过这个文件的大小,如果不会,就写入这个文件,如果会,那就会创建一个新的文件进行写入。
文章图片
写入后,就更新上面的写指针,也就是说,最后的写指针就是当前写指针+消息的大小。最后释放锁,让其他线程进行写入。
文章图片
其实到了这一个步骤,消息并没有写到磁盘上,还只是追加到内存,后续再来提刷屏的过程。
推荐阅读
- 工具-开发工具|【PostMan】postman如何发送并发请求
- 软件测试|day22-使用JMeter发送请求与参数化
- SpringBoot实现发送电子邮件
- 开源IM项目OpenIM 客户端SDK架构剖析-确保消息的有序性,以及消息百分百可达
- Python自动化办公之邮件发送全过程详解
- SpringCloud|Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
- RestTemplate发送HTTP|RestTemplate发送HTTP POST请求使用方法详解
- python编程实现撤销上一步操作_78行Python代码实现现微信撤回消息功能
- 如何使用DTM将App事件发送到Google|如何使用DTM将App事件发送到Google Analytics
- xiaoxi整理