存储机制

持久化的消息和非持久化的消息都可以被写入到磁盘。

持久化的消息一开始就会写入磁盘,如果可以,也会在内存中保存一部分以提高性能,当内存吃紧时会从内存中清楚。

非持久化的消息一般存储在内存中,内存吃紧时会换入到磁盘中,以节省内存空间。

这两种类型的消息的落盘处理都在RabbitMQ的”持久层“完成。

持久层

持久层是一个逻辑概念,包含队列索引和消息存储。

  • 队列索引(每个队列一个):rabbit_queue_index 负责维护队列中落盘消息的信息,包括消息的存储地点、是否己被交付给消费者、是否己被消费者 ack 等。

    rabbit_queue_index 中以顺序(文件名从0开始累加)的段文件来进行存储,后缀为" . idx " ,每个段文件中包含固定的 SEGMENT_ENTRY_COUNT 条记录,SEGMENT-ENTRY-COUNT 默认值为 1638 。每个 rabbit_queue_index 从磁盘中读取消息的时候至少要在内存中维护一个段文件,所以设置 queue_index_embed_msgs_below(存储在哪个结构的临界值) 值的时候要格外谨慎 一点点增大也可能会引起内存爆炸式的增长。
  • 消息存储(每个节点有且只有一个):rabbit_msg_store 以键值对的形式存储消息,它被所有队列共享。

    经过 rabbit_msg)store 处理的所有消息都会以追加的方式写入到文件中,当这个文件的大小超过指定的限制(file_size_limit)关闭这个文件再创建一个新的文件以供新

    的消息写入。文件名(文件后缀是". rdq") 开始进行累加 因此文件名最小的文件也是最老的文件。在进行消息的存储时, bb 会在 ETS(Erlang Term Storage)表中记录消息

    在文件中的位置映射(Index)和文件的相关信息( FileSummary)。

消息可以存储在rabbit_queue_index中,也可以存储在在rabbit_msg_store中。最佳的配备是较小的消息存储在 rabbit queue index 中而较大的消息存储在rabbit_msg_store 中。

队列的结构

队列通常由rabbit_amqqueue_process和backing_queue两部分组成

  • rabbit_amqqueue_process:负责协议相关的消息处理
  • backing_queue:消息存储的具体形式和引擎

惰性队列

尽可能地将消息存入磁盘中,在消费者消费到相应消息时才被加载到内存中。

内存和磁盘告警

内存或者磁盘低于配置的阈值时,RabbitMQ会暂时阻塞客户端的连接直至恢复正常。blocking:对应消费者关联的connection,这时候并不阻塞。blocked:对应发送消息的Connection,这时候阻塞。

流控

RabbitMQ从2.8版本以后还引入了流控来保证系统的稳定性。内存和磁盘告警相当于全局流控,一旦触发会阻塞集群中所有Connection,本流控是针对单个Connection的。

RabbitMQ 使用了一种基于信用证算法 (credit-based algorithm) 的流控机制来限制发送消息的速率以解决前面所提出的问题。

流控作用于Connection,出现邮件饱和时会阻塞。流控作用于Channel,出现性能瓶颈时会阻塞。

解决性能瓶颈

综上,瓶颈往往发生在rabbit_amqqueue_process 中,用多个rabbit_amqqueue_process代替单个rabbit_amqqueue_process,可以充分利用上被流控的性能(声明交换器、队列、绑定关系;封装消费者;封装生产者)。

镜像队列

避免单点问题,集群中某个节点崩溃,虽然交换器和绑定关系还能保存,队列和其上存储的消息却不能幸免于难,这是因为队列进程及其内容仅仅维持在

单个节点之上,所以一个节点的失效表现为其对应的队列不可用。

引入镜像队列的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。

RabbitMQ:五、高阶的更多相关文章

  1. React 精要面试题讲解(五) 高阶组件真解

    说明与目录 在学习本章内容之前,最好是具备react中'插槽(children)'及'组合与继承' 这两点的知识积累. 详情请参照React 精要面试题讲解(四) 组合与继承不得不说的秘密. 哦不好意 ...

  2. Python函数(五)-高阶函数

    函数接收的参数可以是数字,字符串,列表,元组,字典,集合,也可以是另一个函数,那么这个接收一个函数作为参数的函数就称为高阶函数 # -*- coding:utf-8 -*- __author__ = ...

  3. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  4. Java中的函数式编程(五)Java集合框架中的高阶函数

    写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程.   本文的 ...

  5. 分享录制的正则表达式入门、高阶以及使用 .NET 实现网络爬虫视频教程

    我发布的「正则表达式入门以及高阶教程」,欢迎学习. 课程简介 正则表达式是软件开发必须掌握的一门语言,掌握后才能很好地理解到它的威力: 课程采用概念和实验操作 4/6 分隔,帮助大家理解概念后再使用大 ...

  6. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  7. Cloudera Hadoop 5& Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)

    1.课程环境 本课程涉及的技术产品及相关版本: 技术 版本 Linux CentOS 6.5 Java 1.7 Hadoop2.0 2.6.0 Hadoop1.0 1.2.1 Zookeeper 3. ...

  8. 搭建 RabbitMQ Server 高可用集群

    阅读目录: 准备工作 搭建 RabbitMQ Server 单机版 RabbitMQ Server 高可用集群相关概念 搭建 RabbitMQ Server 高可用集群 搭建 HAProxy 负载均衡 ...

  9. python之路(4)高阶函数和python内置函数

    前言 函数式编程不用变量保存状态,不改变变量 内置函数 高阶函数 把函数当作参数传给另一个对象 返回值中包含函数 使用的场景演示: num_test = [1,2,10,5,8,7] 客户说 :对上述 ...

  10. Linux 高阶命令进阶(一)

    Linux 高阶命令进阶 (一)输出重定向 1. > :正确覆盖输出,会覆盖掉原先的文件内容 把文本写入文档中                # vim test                 ...

随机推荐

  1. 慕零的黑夜-头条-第一期(必问)[导读:]1.CSDN必问赏金流向何方 2.CSDN必问偷偷做的手脚 3.CSDN必问靠谱吗 4.关于钱于回答的平衡问题:一美元拍卖骗局 作者:qq3461896724

    本期是关于CSDN 必问 (biwen.csdn.net)的内容,欢迎评论 文末,文中插入有 小姐姐 img(附py代码,1.49G) + coding资料 哟~~~ 你看到这篇很可能是在提问.推荐加 ...

  2. 一个 static 还能难得住我?

    static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量.方法.做静态代码块.静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始, ...

  3. Chisel3 - util - LockingArbiter

    https://mp.weixin.qq.com/s/5oAwH3scumARzPidRBfG2w     带锁多入单出仲裁器,输出会被锁定指定的时钟周期.   参考链接: https://githu ...

  4. Chisel3 - util - Pipe

    https://mp.weixin.qq.com/s/WeFesE8k0ORxlaNfLvDzgg   流水线,用于添加延迟.   参考链接: https://github.com/freechips ...

  5. js运算符和if语句,switch语句

    逻辑运算符 类型 运算符 算数运算符 +   -    *   /   %   ++   -- 赋值运算符 = 比较运算符 >   <   >=  <=   ==   !=   ...

  6. java方法句柄-----2.方法句柄的获取、变换、特殊方法句柄

    目录 1.获取方法句柄 1.1查找构造方法.一般方法和静态方法的方法句柄 1.2 查找类中的特殊方法(类中的私有方法) 1.3 查找类中静态域和一般域 1.4 通过反射API得到的Constructo ...

  7. Java实现 蓝桥杯 算法提高 三进制数位和

    算法提高 三进制数位和 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 给定L和R,你需要对于每一个6位三进制数(允许前导零),计算其每一个数位上的数字和,设其在十进制下为S. 一个 ...

  8. Java实现第九届蓝桥杯测试次数

    测试次数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...

  9. java实现第六届蓝桥杯立方体自身

    立方变自身 题目描述 观察下面的现象,某个数字的立方,按位累加仍然等于自身. 1^3 = 1 8^3 = 512 5+1+2=8 17^3 = 4913 4+9+1+3=17 - 请你计算包括1,8, ...

  10. 2018年全国多校算法寒假训练营练习比赛(第二场)H-了断局

    题目描述 既然是了断局了,大家就随便玩玩数字呗.已知一个数列前十项分别是{0, 1, 1, 2, 4, 7, 13, 24, 44, 81},小G不满足呀:我要更多的数!!!不给就不让你们玩了.小G会 ...