RabbitMQ:五、高阶
存储机制
持久化的消息和非持久化的消息都可以被写入到磁盘。
持久化的消息一开始就会写入磁盘,如果可以,也会在内存中保存一部分以提高性能,当内存吃紧时会从内存中清楚。
非持久化的消息一般存储在内存中,内存吃紧时会换入到磁盘中,以节省内存空间。
这两种类型的消息的落盘处理都在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:五、高阶的更多相关文章
- React 精要面试题讲解(五) 高阶组件真解
说明与目录 在学习本章内容之前,最好是具备react中'插槽(children)'及'组合与继承' 这两点的知识积累. 详情请参照React 精要面试题讲解(四) 组合与继承不得不说的秘密. 哦不好意 ...
- Python函数(五)-高阶函数
函数接收的参数可以是数字,字符串,列表,元组,字典,集合,也可以是另一个函数,那么这个接收一个函数作为参数的函数就称为高阶函数 # -*- coding:utf-8 -*- __author__ = ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- Java中的函数式编程(五)Java集合框架中的高阶函数
写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程. 本文的 ...
- 分享录制的正则表达式入门、高阶以及使用 .NET 实现网络爬虫视频教程
我发布的「正则表达式入门以及高阶教程」,欢迎学习. 课程简介 正则表达式是软件开发必须掌握的一门语言,掌握后才能很好地理解到它的威力: 课程采用概念和实验操作 4/6 分隔,帮助大家理解概念后再使用大 ...
- python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)
1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...
- 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. ...
- 搭建 RabbitMQ Server 高可用集群
阅读目录: 准备工作 搭建 RabbitMQ Server 单机版 RabbitMQ Server 高可用集群相关概念 搭建 RabbitMQ Server 高可用集群 搭建 HAProxy 负载均衡 ...
- python之路(4)高阶函数和python内置函数
前言 函数式编程不用变量保存状态,不改变变量 内置函数 高阶函数 把函数当作参数传给另一个对象 返回值中包含函数 使用的场景演示: num_test = [1,2,10,5,8,7] 客户说 :对上述 ...
- Linux 高阶命令进阶(一)
Linux 高阶命令进阶 (一)输出重定向 1. > :正确覆盖输出,会覆盖掉原先的文件内容 把文本写入文档中 # vim test ...
随机推荐
- 网络编程-TCP长连接和短连接
TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.下面会介绍一个TCP连接是如何建立的以及通信结束后是如何终止的. 一.TCP连接的建立与终止 1.1 建立连 ...
- 管程(Monitor)概念及Java的实现原理
互斥 互斥访问是并发编程要解决的核心问题之一. 有许多种方法可以满足临界区的互斥访问.大体上可以分为三种, 一种是软件方法,即由用户程序承担互斥访问的责任,而不需要依赖编程语言或操作系统,譬如Dekk ...
- Rocket - tilelink - Edges
https://mp.weixin.qq.com/s/UggNsNOeEMP-GhzlLiT-qQ 简单介绍Edges的实现. 1. TLEdge 包含client和manage ...
- Java实现 LeetCode 802 找到最终的安全状态 (DFS)
802. 找到最终的安全状态 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后能走到终点,那么 ...
- Java实现 蓝桥杯 算法训练 找零钱
试题 算法训练 找零钱 问题描述 有n个人正在饭堂排队买海北鸡饭.每份海北鸡饭要25元.奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25.50.100元),而且饭堂阿姨一开始没有任何零钱.请问饭 ...
- Java实现 蓝桥杯VIP 算法提高 密码锁
算法提高 题目 2 密码锁 时间限制:1.0s 内存限制:1.0GB 问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子 ...
- Java实现 LeetCode 146 LRU缓存机制
146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- java实现第二届蓝桥杯最小公倍数(c++)
最小公倍数. 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4,5,6 ...
- java实现第三届蓝桥杯排日程
排日程 [编程题](满分34分) 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天. 上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更. 此外,由于工作需要,还有如 ...
- Mysql添加索引及索引的优缺点
一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高 ...