存储机制

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

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

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

这两种类型的消息的落盘处理都在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. PAT1033 旧键盘打字 (20分) (关于测试点4超时问题)

    1033 旧键盘打字 (20分)   旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 ...

  2. python通用数据库操作工具 pydbclib

    pydbclib是一个通用的python关系型数据库操作工具包,使用统一的接口操作各种关系型数据库(如 oracle.mysql.postgres.hive.impala等)进行增删改查,它是对各个p ...

  3. [组合数学] 圆排列和欧拉函数为啥有关系:都是polya定理的锅

    本文是一个笨比学习组合数学的学习笔记,因为是笨比,所以写的应该算是很通俗易懂了. 首先,我们考虑这么一个问题:你有无穷多的\(p\)种颜色的珠子,现在你想要的把他们中的\(n\)个以圆形的形状等间距的 ...

  4. Rocket - debug - Example: DMI

    https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调 ...

  5. Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

    人生苦短,我用Python.众所周知,Python目前越来越火,学习Python的小伙伴也越来越多.最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了 ...

  6. Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.nginx 原理与优化参数配置 ​ ​ master-workers 的机制的好处 首先,对于每个 ...

  7. Java实现 LeetCode 517 超级洗衣机

    517. 超级洗衣机 假设有 n 台超级洗衣机放在同一排上.开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的. 在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将 ...

  8. Java实现有理数的循环节

    1/7 = 0.142857142- 是个无限循环小数. 任何有理数都可以表示为无限循环小数的形式. 本题目要求即是:给出一个数字的循环小数表示法. 例如: 输入: 1,5 则输出: 0.2 输入: ...

  9. electron内使用vue-slider-component组件报“$attrs is readonly”错误

    解决办法 安装vue-no-ssr插件 https://www.npmjs.com/package/vue-no-ssr npm install vue-no-ssr --save-dev 代码 &l ...

  10. snowflake原理解析

    Snowflake 世界上没有两片完全相同的雪花. ​ - twitter Snowflake原理 这种方案把64-bit分别划分成多段,分开来标示机器.时间等,比如在snowflake中的64-bi ...