存储机制

待...

消息结构

惰性队列

惰性队列会尽可能将消息存入到磁盘中,消费者消费相应的消息才会加载到内存,它可以支持更长的队列

默认情况下生产者消息会尽可能存储到内存中就算设置持久化消息 也会再内存中备份一份 当rabbitMQ需要释放内存时会将内存中的队列持久化到磁盘中(消息堆积很耗时)

惰性队列无论持久化和非持久化都会存储到磁盘 所以带来了io开销,就算非持久化设置惰性队列重启后消息也会丢失(所以持久化消息和惰性队列是很好的搭档)

经过测试发送1000万条消息(无消费者) 普通队列需要耗时801秒 惰性队列需要421秒  惰性队列有消费者时平均消费速度约14000条每秒 差距就是普通队列内存不足换也持久化到磁盘的时间

惰性队列适合于消费者不能正常消息 还能保证消息接收的吞吐量

3.6.0版本之前默认是惰性队列

可以通过

Map<String,Object>args=new HasMap<String,Object>
args.put("x-queue-mode","lazy")
chinnel.queueDeclare("queuname",false,fase,false,args)

内存和磁盘告警

当使用内存超过配置阀值或者磁盘剩余空间低于配置阀值时RabbitMq都会占时阻塞客户端连接并停止接收客户端发来的消息以免服务崩溃 可以通过rabbitmqctl list_connections

命令或者web页面查看状态

被阻塞的状态要么是Blocking要么是blocked(注意集群下一个节点内存告警 整个集群也会受限制)

内存设置

可以通过rabbitmqctl set_vm_memory_high_watermark 0.4(默认值 通过命令设置重启后会失效 通过配置不会)

或者通过rabbitmq.config的vm_memory_high_watermark 参数设置

当rabbitmq使用内存超过40%(物理内存*40%)时会触发内存告警

如果设置为0将立即触发内存告警(当不允许消费者发送消息可以设置)

在内存告警前 会尝试换页持久化和非持久化消息都会持久化到磁盘 释放内存空间

磁盘设置

当broker启动时会启动一个进程监控磁盘空间 10秒一次 当剩余空间磁盘空间低于阀值时会触发磁盘告警(默认为50MB)

可以通过config disk_free_limit(阀值)  或者disk_free_limit (绝对值)设置支持单位(KB KiB MB MiB GB GiB)

或者通过命令 set_disk_free_list **GB  或者set_disk_free_limit mem_relative 0.4 (阀值)

流控

磁盘和内存告警相当于一个全局的流控 而流控是针对单个connection的

erlang进程之间不共享内存 一个进程多个connection

进程a接收消息转发给b转发给c

a没转发一条 credis值-1当为0后就会触发流动 a将不再发送消息给c 同时不再接收消息  当a没接收一条消息通知a credis+1

当a发送消息b大于b接收速度时会触发流控

一个连接触发流控会多次再blocked和unblocked之间切换 这样可以控制消息发送频率再服务器可接收范围内

连接的几个状态

flow:和处于runing状态的connection没什么不同只是告诉系统管理员相应的发送速率受限了

当一个connection处于flow 没有一个channel处于flow name表示connectin中有一个或多个channel出现性能瓶颈

当一个connection处于flow 并且这个connectin中一个或者多个channel处于flow状态但是没有任何一个对应的队列处于flow状态 意味着一个或者多个多列出现性能瓶颈

当一个connection处于flow 并且一个或者多个channel 队列同时出现flow状态 意味着在消息持久化出现了性能瓶颈

流控优化

书260页  意思就是讲一个进程换成多个进程队列 通过以前的一个消息队列换成 一个exchange 根据路由随机投递给多个队列 有点像spring cloud stream的分区 可以提高性能



RabbitMQ-高级特性(六)的更多相关文章

  1. RabbitMQ(二):RabbitMQ高级特性

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitMQ(一)已经入门RabbitMQ,本文介绍Rabb ...

  2. RabbitMQ高级特性

    消息的可靠投递 在使用Rabbitmq的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.Rabbitmq为我们提供了两种方式用来控制消息的投递可靠性模式 confirm确认模式 return ...

  3. RabbitMQ实战(三)-高级特性

    0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成时消息的重复消费 Confirm确认消息.Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL ...

  4. 消息中间件——RabbitMQ(七)高级特性全在这里!(上)

    前言 前面我们介绍了RabbitMQ的安装.各大消息中间件的对比.AMQP核心概念.管控台的使用.快速入门RabbitMQ.本章将介绍RabbitMQ的高级特性.分两篇(上/下)进行介绍. 消息如何保 ...

  5. 消息中间件——RabbitMQ(八)高级特性全在这里!(下)

    前言 上一篇消息中间件--RabbitMQ(七)高级特性全在这里!(上)中我们介绍了消息如何保障100%的投递成功?,幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费的问题?,Con ...

  6. RabbitMQ的基本使用到高级特性

    简介 继上一篇 CentOS上安装RabbitMQ讲述RabbitMQ具体安装后,这一篇讲述RabbitMQ在C#的使用,这里将从基本用法到高级特性的使用讲述. 前序条件 这里需要增加一个用户,并且设 ...

  7. Rabbitmq之高级特性——百分百投递消息&消息确认模式&消息返回模式实现

    rabbitmq的高级特性: 如何保障消息的百分之百成功? 要满足4个条件:生产方发送出去,消费方接受到消息,发送方接收到消费者的确认信息,完善的消费补偿机制 解决方案,1)消息落库,进行消息状态打标 ...

  8. 消息队列——RabbitMQ的基本使用及高级特性

    文章目录 一.引言 二.基本使用 1. 简单示例 2. work queue和公平消费消息 3. 交换机 三.高级特性 1. 消息过期 2. 死信队列 3. 延迟队列 4. 优先级队列 5. 流量控制 ...

  9. 大数据笔记(二十六)——Scala语言的高级特性

    ===================== Scala语言的高级特性 ========================一.Scala的集合 1.可变集合mutable 不可变集合immutable / ...

  10. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

随机推荐

  1. Java DOM方式解析XML(模板)

    //创建一个DocumentBuilderFactory工厂实例 DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance(); // ...

  2. (DP)51NOD 1118 机器人走方格

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.( ...

  3. (博弈论)51NOD 1069 Nim游戏

    有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后 ...

  4. 源码阅读之ArrayList(JDK8)

    ArrayList概述 ArrayList是一个的可变数组的实现,实现了所有可选列表操作,并允许包括 null 在内的所有元素.每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组 ...

  5. C++函数重载的4种错误示例

    函数重载的4种错误示例: #include <iostream> #include <string> using namespace std; //函数重载 同函数名,函数重载 ...

  6. 解决前后端分离的“两次请求”引出的Web服务器跨域请求访问问题的解决方案

    在前后端分离的项目中,前端和后端可能是在不同的服务器上,也可以是Docker上,那就意味着前端请求后端Restful接口时,存在跨域情况. 后端在做了通用的跨域资源共享CORS设置后,前端在做ajax ...

  7. ios基础笔试题-集锦二

    前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. F ...

  8. 00Cascading Style Sheet

    Cascading Style Sheet CSS(Cascading Style Sheet)即层叠样式表,简称样式表.要理解层叠样式表的概念先要理解样式的概念.样式就是对网页中的 元素(字体.段落 ...

  9. 15Oracle Database 索引

    Oracle Database 索引 索引 索引的目的是加快查询速度,就像一本数据的目录一样.建立索引的原则:非常少的DML操作:经常出现在where语句中的字段 2.20.1.建立索引 l  对t_ ...

  10. 有关bash,我希望我能知晓的十件事

    简介 我之前的一篇文章比我预想的更受欢迎,因此我想再写一篇文章来介绍一些不太知名的bash功能 正如之前所言,由于我觉得bash是一种要经常使用(且需理解)的技术,所以我在研究bash时写了一本书.虽 ...