文档章节

rabbitmq中消息的存储

n
 nibilly
发布于 2015/04/28 21:34
字数 1052
阅读 124
收藏 1

码上生花,ECharts 作品展示赛正式启动!>>>

1. 大概原理:


所有队列中的消息都以append的方式写到一个文件中,当这个文件的大小超过指定的限制大小后,关闭这个文件再创建一个新的文件供消息的写入。文件名(*.rdq)从0开始然后依次累加。当某个消息被删除时,并不立即从文件中删除相关信息,而是做一些记录,当垃圾数据达到一定比例时,启动垃圾回收处理,将逻辑相邻的文件中的数据合并到一个文件中。


2. 消息的读写及删除:


rabbitmq在启动时会创建msg_store_persistent,msg_store_transient两个进程,一个用于持久消息的存储,一个用于内存不够时,将存储在内存中的非持久化数据转存到磁盘中。所有队列的消息的写入和删除最终都由这两个进程负责处理,而消息的读取则可能是队列本身直接打开文件进行读取,也可能是发送请求由msg_store_persisteng/msg_store_transient进程进行处理。


在进行消息的存储时,rabbitmq会在ets表中记录消息在文件中的映射,以及文件的相关信息。消息读取时,根据消息ID找到该消息所存储的文件,在文件中的偏移量,然后打开文件进行读取。消息的删除只是从ets表删除指定消息的相关信息,同时更新消息对应存储的文件的相关信息(更新文件有效数据大小)。


3. 垃圾回收:


由于执行消息删除操作时,并不立即对在文件中对消息进行删除,也就是说消息依然在文件中,仅仅是垃圾数据而已。当垃圾数据超过一定比例后(默认比例为50%),并且至少有三个及以上的文件时,rabbitmq触发垃圾回收。垃圾回收会先找到符合要求的两个文件(根据#file_summary{}中left,right找逻辑上相邻的两个文件,并且两个文件的有效数据可在一个文件中存储),然后锁定这两个文件,并先对左边文件的有效数据进行整理,再将右边文件的有效数据写入到左边文件,同时更新消息的相关信息(存储的文件,文件中的偏移量),文件的相关信息(文件的有效数据,左边文件,右边文件),最后将右边的文件删除。




4. 性能考虑:


(1)操作引用计数(flying_ets)


队列在进行消息的写入和删除操作前,会在flying_ets表里通过+1,-1的方式进行计数,然后投递请求给msg_store_persistent/msg_store_transient进程进行处理,进程在真正写操作或者删除之前会再次判断flying_ets中对应消息的计数决定是否需要进行相应操作。这样,对于频繁写入和删除的操作,概率减少实际的写入和删除。

(2)尽可能的并发读


在读取消息的时候,都先根据消息ID找到对应存储的文件,如果文件存在并且未被锁住,则直接打开文件,从指定位置读取消息的内容。


如果消息存储的文件被锁住了,或者对应的文件不存在了,则发送请求,由msg_store_persistent/msg_store_transient进程进行处理。


(3)消息缓存


1)利用ets表进行缓存 


对于当前正在写的文件,所有消息在写入前都会在cur_file_cache_ets表中存一份,消息读取时会优先从这里进行查找。文件关闭时,会将cur_file_cache_ets表中引用计数为0的消息进行清除。


2)file_handle_cache的写缓存


rabbitmq中对文件的操作封转到了file_handle_cache模块,以写模式打开文件时,默认有1M大小的缓存,即在进行文件的写操作时,是先写入到这个缓存中,当缓存超过大小或者显式刷新,才将缓存中的内容刷入磁盘中。


本文转载自:http://my.oschina.net/hncscwc/blog/182083

n
粉丝 14
博文 212
码字总数 43498
作品 0
厦门
私信 提问
RabbitMQ 集群原理和完善

一、RabbitMQ集群方案的原理 RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。 因此,RabbitMQ天然支...

田园里的蟋蟀
2018/06/08
0
0
【SpringCloud】Spring Cloud Sleuth + Zipkin + RabbitMQ 集成(二十五)

为什么使用RabbitMQ   zipkin的原理是服务之间的调用关系会通过HTTP方式上报到zipkin-server端,然后再通过zipkin-ui去调用查看追踪服务之间的调用链路。但是这种方式存在一个隐患,如果微...

H__D
05/11
0
0
2019年rabbitMQ面试高频题(java)

前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情...

osc_7ei0ce8w
2019/12/31
10
0
消息中间件——RabbitMQ

RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要...

osc_1aqasaed
2019/04/24
4
0
快速掌握RabbitMQ(一)——RabbitMQ的基本概念、安装和C#驱动

1 RabbitMQ简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现,官网地址:http://www.rabbitmq.com。RabbitMQ作为一个消息代理,主要负责接收、存储和转发消息,...

osc_urm28qtx
04/16
6
0

没有更多内容

加载失败,请刷新页面

加载更多

UltraEdit for Mac 20.00.0.32 文本编辑器

MacOS上最受欢迎的文本编辑器是哪款?UltraEdit Mac版支HTML、PHP、Perl、Java 和 JavaScript 等众多流行计算机高级语言的程序编辑器,Ultraedit与Notepad ++相比。你可以直接用它来修改exe...

麦克W
8分钟前
6
0
java垃圾回收机制的理解

Java垃圾回收机制算法 标记----清除算法 复制算法 标记----整理算法 分代收集算法 为什么要进行垃圾回收 因为当一个对象的引用不可达,或者一个对象没有任何引用指向它,那么它就没有必要在内...

RandomObject
21分钟前
5
0
Java集合常见面试题

Java集合框架 集合框架底层数据结构总结 Arraylist 与 LinkedList 异同 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 底层数据结构: Arraylist 底层使...

JaneRoad
24分钟前
18
0
Makefile中.PHONY的作用是什么? - What is the purpose of .PHONY in a makefile?

问题: What does .PHONY mean in a Makefile? .PHONY在Makefile中是什么意思? I have gone through this , but it is too complicated. 我已经经历过了 ,但是它太复杂了。 Can somebody e......

法国红酒甜
29分钟前
15
0
看了同事的代码,我忍不住写了这份代码指南

❝ 作者:xybaby 链接:https://www.cnblogs.com/xybaby/p/11335829.html ❞ 前言 写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、...

osc_fvp5wdwk
53分钟前
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部