RabbitMQ全局流量控制

RabbitMQ全局流量控制

  • 流控机制
    • 流控是对什么进行控制?
    • rabbitmq进程邮箱
    • 流控机制是什么?
  • 流控原理
    • 流控原理流程
  • 流控状态显示
  • 流控对象
    • 流控机制对象
    • 主要进程
    • 各进程状态情形分析
  • 性能提升
    • 提升队列性能方式

当消息积压时,消息会进入到队列深处,消费消息会使服务器性能大大降低。而内存告警和磁盘告警就是通过设置阈值来预防此情形,当达到阈值后,阻塞集群中所有的Connection,直到对应项恢复正常,属于全局性的流量控制 (Global Flow Control)。而这里将要提到的流控是针对连接Connection来的(Per-Connection Flow Control或者Internal Flow Control)。
流控作用:

  • 流控机制是用来避免消息的发送速率过快而导致服务器难以支撑的情形,从而保障服务器资源在安全范围内,提高业务的稳定性。

流控机制

流控是对什么进行控制?

  • 是对进程邮箱的阈值进行控制。

rabbitmq进程邮箱

  • 进程通信方式有四种,分别为主从式、会话式、消息传递(邮箱机制)、共享存储区。而Erlang 进程之间并不共享内存 (binary 类型的除外),而是通过消息传递来通信,每个进程都有自己的进程邮箱(mailbox)。
  • 默认情况下,Erlang并没有对进程邮箱的大小进行限制,所以当有大量消息持续发往某个进程时,会导致该进程邮箱过大,最终内存溢出而崩溃。
  • 在rabbitmq中,如果生产者持续高速发送,而消费者消费速度较低时,如果没有流控,很快就会使内部进程邮箱的大小达到内存阈值。

流控机制是什么?

  • rabbitmq使用了一种基于信用证算法(credit-based algorithm)的流控机制,来限制发送消息的速率来解决进程邮箱大小达到内存阈值而导致服务器崩溃问题。
  • 通过监控各个进程的进程邮箱,当某个进程负载过高而来不及处理消息时,这个进程的进程邮箱就会开始堆积消息。
  • 当堆积到一定量时,就会阻塞而不接收上游的新消息。从而慢慢地,上游进程的进程邮箱也会开始堆积消息。当堆积到一定量时也会阻塞而停止接收上游的消息,最后就会使负责网络数据包接收的进程阻塞而暂停接收新的数据。

流控原理

流控原理流程

  • 进程XXX——> 进程A——> 进程B——> 进程C—— 进程…,每个进程中都有一对关于收发消息的credit值。
  • 拿进程B来看,有两个参数:
    • {{credit_from,C},value}参数,表示能发送多少条消息给进程C,每发送一条消息该值减 1,当为 0 时,进程 B 不再往进程 C 发送消息也不再接收进程 A 的消息。
    • [{credit_to,A},value}参数,表示再接收多少条消息就向进程A 发送增加credit值的通知,进程 A 接收到该通知后就增加{{credit_from,B},value}所对应的值,这样进程 A 就能持续发送消息。
  • 当上游发送速率高于下游接收速率时,credit值就会被逐渐耗光,此时进程被阻塞,阻塞情况会一直传递到最上游。
  • 当上游进程收到来自下游进程的增加 credit 值的通知时,若此时上游进程处于阻塞状态则解除阻塞,开始按收更上游进程的消息,一个一个传导最终能够解除最上游的阻塞状态。
  • 综上分析可知,基于信用证的流控机制最终将消息发送进程的发送速率限制在消息处理进程的处理能力范围之内。
    在这里插入图片描述

流控状态显示

当一个连接(Connection)触发流控时会处于“flow”的状态,代表此Connection状态每秒在 blocked 和 unblocked 之间来回切换数次。以此可以将消息发送的速率控制在服务器能够支撑的范围之内。web页面可以查看,也可以通过 rabbitmactl list_connections 命令查看。

在这里插入图片描述

流控对象

流控机制对象

  • 连接(Connection)
  • 信道 (Channel)
  • 队列(Queue)

如下图,从Connection进程——> Channel进程——> Queue进程——> 消息持久化存储进程,是一条消息从接收到存储的一个必需的流控连,对于处于整个流控链中的任意进程,只要该进程阻塞,上游的进程必定全部被阻塞。
在这里插入图片描述

主要进程

  • rabbit_reader进程:连接的处理进程,负责接收、解析 AMQP 协议数据包等。
  • rabbit_channel进程:信道的处理进程,负责处理AMQP协议的各种方法、进行路由解析等。
  • rabbit_amqqueue_process进程:队列的处理进程,负责实现队列的所有逻辑。
  • rabbit_msg_store进程:负责实现消息的持久化。

各进程状态情形分析

  • 当某个Connection处于 flow 状态时,但这个 Connection 中没有一个 Channel 处于 flow 状态,代表这个Connection中有一个或者多个 Channel 出现了性能瓶颈。
    • 存在情形:某些 Channel进程的运作(比如处理路中逻辑) 导致服务器 CPU 的负载过高,尤其是在发送大量较小的非持久化消息时最容易发生。
  • 当某个 Connection处于flow 状态,这个Connection 中也有若干个 Channel 处于 flow状态,但没有任何一个对应的队列处于 flow 状态时,这就意味着有一个或者多个队列出现了性能瓶颈。
    • 存在情形:消息存入队列时导致服务器CPU 负载过高;持久化消息入盘导致服务器 I/O 负载过高,尤其是在发送大量较小的持久化消息时最容易发生。
  • 当某个 Connection处于 flow 状态,这个 Connection 中的若干个 Channel 处于 flow状态,并且也有若干个对应的队列处于 flow 状态时,这就意味着在消息持久化时出现了性能瓶颈。
    • 存在情形:持久化消息入盘导致服务器 I/O 负载过高,尤其是在发送大量较大的持久化消息时最容易发生。

性能提升

一般情况下,向 一个队列里推送消息时,往往会在rabbit_amqqueue_process中(即队列进程中) 产生性能瓶颈。

提升队列性能方式

  • 第一种,若Erlang版本在18.x以上,可以开启HiPE 功能,可以提高 30%~40%的性能。
  • 第二种,代码层面提升,将单个rabbit_amqqueue_process替换成多个rabbit_amqqueue_process。这里并不是使用多个队列,而是将交换器、队列、绑定关系、生产和消费的方法全部进行封装,这样对于应用来说好是在操作一个(逻辑) 队列。至于怎么封装的,纯运维就不用去了解了,开发就自行百度测试。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据平台

大数据行业应用持续升温,特别是企业级大数据市场正在进入快速发展时期。越来越多的企业期望实现数据孤岛的打通,整合海量的数据资源,挖掘并沉淀有价值的数据,进而驱动更智能的商业。随着公司数据爆发式增长,原有的数据…

鸿蒙生态的崛起:开发实践、认证路径与激励策略

目录 前言 鸿蒙生态能力和行业解决方案 1、鸿蒙创新能力 2、鸿蒙行业解决方案 中软鸿蒙生态业务布局 1、深度参与鸿蒙生态建设 2、提供一站式鸿蒙生态服务 (1)服务目录 (2)改造过程的关键点 (3)鸿…

Vue如何来处理动画

Vue 提供了多种方式来处理动画&#xff0c;使得创建动态用户界面变得简单而灵活。以下是几种关于 Vue 动画的技巧和最佳实践&#xff0c;帮助你更高效地在项目中实现动画效果&#xff1a; 1. 使用 <transition> 和 <transition-group> 组件 Vue 内置的 <trans…

指令遵循数据集IFEval介绍:中英双语

IFEval数据集介绍&#xff1a;评估大语言模型指令遵循能力 1. IFEval数据集提出的问题 随着大语言模型&#xff08;如GPT-4、PaLM 2等&#xff09;在自然语言任务中的广泛应用&#xff0c;模型的指令遵循能力&#xff08;Instruction Following&#xff09;成为一个重要评估指…

Rust中自定义Debug调试输出

在 Rust 中&#xff0c;通过为类型实现 fmt::Debug&#xff0c;可以自定义该类型的调试输出。fmt::Debug 是标准库中的一个格式化 trait&#xff0c;用于实现 {:?} 格式的打印。这个 trait 通常通过自动派生&#xff08;#[derive(Debug)]&#xff09;来实现&#xff0c;但你也…

【git使用】git patch操作的常用命令:patch -p1 < xxxx.patch

patch -p1 < xxxx.patch 是一个在 Unix/Linux 系统中常用的命令&#xff0c;其主要含义如下&#xff1a; 一、patch 命令 patch 是一个用于对文件进行补丁操作的工具。补丁文件&#xff08;通常是 .patch 文件&#xff09;包含了对原始文件的修改信息&#xff0c;这些修改可…

基于Qt的上位机通讯库

1.前言 做Qt上位机已经有两年的时间了&#xff0c;上位机主要是和下游器件打交道的&#xff0c;通过modbus、tcp、串口等协议来控制这些设备&#xff0c;通过一定的时序控制&#xff0c;完成所需要的工作流程。这其中最重要的就是通讯了&#xff0c;上位机开发过程中的相当一部…

《Kali Linux 软件源更换攻略:优化软件获取与系统更新》

KALI为什么要换源 速度提升 Kali Linux 默认的软件源服务器通常位于国外。在从这些国外源下载软件包、更新系统时&#xff0c;会受到网络带宽、网络延迟等因素的限制。例如&#xff0c;在中国&#xff0c;连接到国外服务器的网络速度可能较慢&#xff0c;尤其是在下载大型软件…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本&#xff0c;如果是8版本操作会略有不同&#xff0c;下篇文章介绍安装8版本的操…

RabbitMQ 安装、配置和使用介绍 使用前端js直接调用方式

1. 安装 RabbitMQ 1.1 安装 Erlang RabbitMQ 是基于 Erlang 语言开发的&#xff0c;因此首先需要安装 Erlang。 在 Ubuntu 上安装 Erlang&#xff1a; bash sudo apt-get update sudo apt-get install erlang 在 CentOS 上安装 Erlang&#xff1a; bash sudo yum insta…

PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语

中文版 PyTorch 的 torch.unbind 函数详解与进阶应用 在深度学习中&#xff0c;张量的维度操作是基础又重要的内容。PyTorch 提供了许多方便的工具来完成这些操作&#xff0c;其中之一便是 torch.unbind。与常见的堆叠函数&#xff08;如 torch.stack&#xff09;相辅相成&am…

SQLServer利用QQ邮箱做SMTP服务器发邮件

环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言&#xf…

好用的网站-直接复制的文字图标不需要引入

分享一个前端不需要引入的&#xff0c;可以直接复制的图标网站 直接复制放在代码中 特殊符号大全&#xff0c;可直接复制黏贴 (shijianchuo.net)

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…

〔 MySQL 〕视图

以下是上述文章的目录&#xff1a; 一、视图概述 视图的定义 二、基本使用 创建视图查询视图修改视图影响基表查询验证删除视图 三、视图规则和限制 命名规则数量限制索引和触发器安全性ORDER BY规则与表一起使用 四、实战案例 牛客实战OJ修改基表影响视图查询验证删除…

tomcat被检测到目标URL存在htp host头攻击漏洞

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 Tomcat被检测到目标URL存在http host头攻击漏洞,这个漏洞复现一下就是黑客访问你的网站,之后中修改请求头中的host属…

Vue 子组件修改父组件传过来的值的三种方式

方式1&#xff1a;子组件发送emit&#xff0c;触发父组件修改 父组件 <template><div><son :count"count" updateCount"updateCount" /></div> </template><script> import son from "./son"; export def…

python爬虫项目毕设:天津酒店爬虫数据可视化系统开题报告

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

12.11数据结构-图

无向完全图&#xff1a;在无向图中&#xff0c;如果任意两个顶点之间都存在边&#xff0c;则称该图为无向完全图。 有向完全图&#xff1a;在有向图中&#xff0c;如果任意两个顶点之间都存在方向相反的两条弧&#xff0c;则称该图为有向完全图。 含有n个顶点的无向完全图有…