赞
踩
rabbitmq的持久化分为三个部分:
消息的持久化可以通过消息的投递模式来实现,属于代码层面上的。可以控制每一条消息是否久化。
但是将所有消息都设置为持久化,会严重影响rabbitmq服务器性能,写入磁盘的速度比写入内存的速度慢得不只一点点。所以对于可靠性不是那么高的消息可以不采用持久化处理以提高整体的吞吐量。在选择是否要将消息持久化时,需要在可靠性和吐吞量之间做一个权衡。
springboot代码设置消息的持久化示例
将交换器、队列、消息都设置了持久化之后能百分之百保证数据不丢失吗?答案是不能
前面提到的消息持久化,其实是在rabbitmq的“持久层”中完成的。不管是持久化的消息,还是非持久化的消息都可以被写入到磁盘。
持久层是一个逻辑上的概念,实际包含两个部分:
I have no name!@ed73deb9f1c5:/bitnami/rabbitmq/mnesia/rabbit@stats/msg_stores/vhosts/9PIHRMVSJH6VBOR100H7141ZT$ ls -al
drwxr-xr-x. 2 1001 root 19 Oct 7 02:57 msg_store_persistent
drwxr-xr-x. 2 1001 root 19 Oct 7 02:57 msg_store_transient
I have no name!@ed73deb9f1c5:/bitnami/rabbitmq/mnesia/rabbit@stats/msg_stores/vhosts/9PIHRMVSJH6VBOR100H7141ZT$ ls -al
total 16
drwxr-xr-x. 5 1001 root 125 Oct 7 02:57 .
drwxr-xr-x. 4 1001 root 72 Oct 7 01:15 ..
-rw-r--r--. 1 1001 root 83 Oct 7 01:15 .config
drwxr-xr-x. 2 1001 root 19 Oct 7 02:57 msg_store_persistent
drwxr-xr-x. 2 1001 root 19 Oct 7 02:57 msg_store_transient
drwxr-xr-x. 3 1001 root 38 Oct 7 01:18 queues
-rw-r--r--. 1 1001 root 5464 Oct 7 02:57 recovery.dets
-rw-r--r--. 1 1001 root 9 Oct 7 02:57 .vhost
上面的地址/bitnami/rabbitmq/mnesia/rabbit@stats,是队列的数据存放目录,这个在在哪里找呢,可以通过日志来查看,如下图所示:
日志中还显示了,9PIHRMVSJH6VBOR100H7141ZT这个目录,对应着virtual01这个vhost的目录。对于rabbitmq来说,每一个租户vhost的消息存储,都是放在不同的目录的
rabbit_queue_index 中以顺序(文件名从 0 开始累加) 的段文件来进行存储,后缀为“ .idx "。
每个段文件中包含定的 SEGMENT_ENTRY_COUNT 条记录,SEGMENT_ENTRY_COUNT 默认值为16384字节。
每个rabbit_queue_index 从磁盘中读取消息的时候至少要在内存中维护一个段文件,所以设置queue_index_embed_msgs_below参数指定阈值大小时要格外谨慎,一点点增大也可能会引起内存爆炸式的增长。
经过 rabbit_msg_store 处理的所有消息都会以追加的方式写入到文件中,当一个文件的大小超过指定的限制 (file_size_lmit)后,关闭这个文件再创建一个新的文件以供新的消息写入,文件后缀是“ .rdq ”。
文件名从0开始进行累加,所以文件名最小的文件也是最老的文件。
如下所示0.rdq文件
I have no name!@ed73deb9f1c5:/bitnami/rabbitmq/mnesia/rabbit@stats/msg_stores/vhosts/628WB79CIFDYO9LJI6DKMI09L/msg_store_persistent$ ls -al
total 0
drwxr-xr-x. 2 1001 root 19 Oct 7 02:57 .
drwxr-xr-x. 4 1001 root 111 Oct 7 02:57 ..
-rw-r--r--. 1 1001 root 0 Oct 7 02:57 0.rdq
在进行消息的存储时,rabbitmq会在ETS (Erlang Term Storage) 表中记录消息在文件中的位置映射 (Index) 和文件的相关信息 (FileSummary)。
文件合并前提:
执行合并的两个文件一定是逻辑上相邻的两个文件。
文件合并流程:
如下图所示,我发布的消息,消息比较小时,在0.idx中,即存在索引中
下面是通过查看0.idx,发现里面有消息的正文内容
当消息体比较大时,存放的是rdq文件时面
每个队列则看成是一个客户端,当生产者发送的消息达到队列时,向服务端请求写,写入过程如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。