流控

article/2025/8/25 3:34:43

RabbitMQ可以对内存和磁盘的使用量设置阈值,当到达阈值后,生产者将被阻塞,直到对应项恢复正常。除了这两个阈值,从2.8.0版本开始,RabbitMQ还引入了流控(Flow Control)机制来确保稳定性。流控机制是用来避免消息的发送频率过快而导致服务器难以支撑的情形。内存和磁盘告警相当于全局的流控,一旦触发会阻塞集群中所有的Connection,而流控是针对单个Connection的,可以称之为Per-Connection Flow Control或者 Internal Flow Control。

流控的原理

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

RabbitMQ使用了一种基于信用正算法(credit-based algorithm)的流控机制来限制发送消息的速率以解决这个问题。它通过监控各个进程的进程邮箱,当某个进程负载过高而来不及处理消息时,这个进程的邮箱就会开始慢慢堆积消息,当堆积到一定量时,就会阻塞而不接收上游的新消息。从而慢慢的,上游的进程邮箱也会开始慢慢的堆积消息。当堆积到一定量的时候也会阻塞而停止接收上游的消息,最后就会使负责网络数据包接收的进程阻塞而暂停接收新数据。以下图为例:

进程A接收消息并转发至进程B,进程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值的通知时,若此时上游处于阻塞状态则解除最上游的阻塞状态,开始接收更上游的进程消息,一个一个传导最终能够解除最上游的阻塞状态。由此可见,基于信用证的流控机制最终将消息发送进程的发送速率限制在消息处理进程的处理能力范围之内。

一个连接触发流控时会处于“flow”状态,也就意味着这个Connection的状态每秒在blocked和unblocked之间来回切换数次,这样可以将消息发送的速率控制在服务器能够支撑的范围之内,可以通过rabbitmqctl list_connections命令或者Web管理界面查看Connection的状态。

处于flow状态的Connection和处于running状态并没有什么不同,这个状态只是告诉管理员相应的发送速率受限了,而对于客户端而言,它看到的只是服务器的带宽要比正常情况下小一些。

流控机制不只是作用于Connection,同样作用于信道和队列。从Connection到Channel,再到队列,最后是消息持久化存储形成一个完整的流控链,对于处于整个流控链中的任意进程,只要该进程阻塞,上游的进程必定阻塞。也就是说,如果某个进程达到性能瓶颈,必然会导致上游所有的进程被阻塞。所以我们可以利用流控机制的这个特点找出瓶颈之所在,处理消息的几个关键进程及其对应的顺序如下图:

其中各个进程如下所述:

  ❤ rabbit_reader:Connection的处理进程,负责接收、解析AMQP协议数据包等;

  ❤ rabbit_channel: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负载过高而引起的此种情形。尤其是在发送大量较大的持久化消息时,此种情形最易显现。

参考:《RabbitMQ实战指南》 朱忠华 编著;

转载于:https://www.cnblogs.com/Joe-Go/p/10951615.html


http://chatgpt.dhexx.cn/article/l9OTZ9XS.shtml

相关文章

sentinel详解——流控、降级、热点、熔断

Sentinel(哨兵)是一个面向微服务的流量控制、熔断降级的组件,支持界面化的细粒度统一配置;可以对微服务进行可视化的监控和保护;同时可和nacos、dubbo、redis等结合使用。 一、后端代码中sentinel配置 1、引入pom &l…

【微服务|Sentinel】流控规则概述|针对来源|流控模式详解<直接 关联 链路>

文章目录 流控规则一览1. 资源名2. 针对来源3. 阙值类型4. 是否集群5. 流控模式6. 流控效果针对来源介绍实现该功能步骤测试部分源码流控模式流控模式之关联流控模式之链路流控效果快速失败Warm Up排队等待我们可在簇点链路进行流控设置,点开相关资源的流控按钮即可进行流控相…

Sentinel流控

Sentinel 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.sentinel特性 Sentinel 具有以下特征: 丰富的应用场景: Sentinel 承接了…

CAN报文多帧,首帧,流控帧,连续帧

数据发送为单帧,所以06代表发送的数据中含有6个字节,回复为正反馈,为连续帧。10 代表连续帧的首帧,1E代表此连续帧含有30个字节,30代表此连续帧的流控制帧,21,22,23,24代…

Sentinel-限流规则(流控模式:直接、关联、链路)

一、流控模式-直接 添加规则: 测试例子分析: 启动测试 点击 察看结果树 上面测试例子,到Sentinel控制台的实时监控可以看到 二、流控模式-关联 • 关联模式 :统计与当前资源相关的另一个资源,触发阈值时,对…

Sentinel的另外三种流控模式(附代码详细介绍)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍Sentinel的其他三种流控模式,后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教👏&#…

Sentinel限流--流控模式与限流效果

文章目录 1、簇点链路2、流控入门案例3、流控模式:关联模式4、流控模式:链路模式5、流控效果:warm up6、限流效果:排队等待7、热点参数限流 1、簇点链路 簇点链路就是项目内的调用链路(controller -> servcie ->…

【sentinel】流控规则详解

流量控制规则,简称流控规则,会对资源的流量进行限制。同一个资源可以对应多条限流规则。Sentinel会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。 限流的直接表现是抛出FlowException异常。FlowException是Bloc…

Sentinel流控规则

Sentinel流控规则 1、基本介绍 资源名:唯一名称,默认请求路径(如:http://localhost:8089/testA) 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个微服务进行限流 ,默认defa…

流控方案

不同的场景下所需的流控算法不尽相同,那应该如何选择适用的流控方案呢?本文分享单机及分布式流控场景下,简单窗口、滑动窗口、漏桶、令牌桶、滑动日志等几种流控算法的思路和代码实现,并总结了各自的复杂度和适用场景。较长&#…

流控机制的解析

流控是以太网的一项基本功能,可以防止在端口拥塞的情况下出现丢帧。在深入分析之前,先看一个简单的应用场景: 端口A和B接收报文,端口C向外转发报文。如果端口A和B的收包速率之和大于端口C的带宽,那么部分报文就会缓存在…

Sentinel 三种流控效果

文章目录 流控效果1.快速失败2.warm up1)配置流控规则:2)Jmeter测试 3.排队等待1)添加流控规则2)Jmeter测试 .总结 流控效果 我们先来回顾一下流控模式有哪些: 流控模式说明直接统计当前资源的请求&#…

Sentinel流控规则之流控模式介绍

目录 1.直接模式 2.关联模式 3.链路模式 4.流控模式总结 参考: Sentinel限流规则-流控模式之链路模式【图文】_mb5fd869d1d8388_51CTO博客 SpringCloud Alibaba之Sentinel流控管理 - 知乎 (zhihu.com) Sentinel-流控模式之关联模式【图文】_mb5fdcae58218c5_…

串口使用系列学习之什么是流控

概念 在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。  如台式机与单片机之间的通讯,接收端数据缓冲区已满,则…

串口流控(CTS/RTS)使用详解

1.流控概念 在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。 如台式机与单片机之间的通讯,接收端数据缓冲区已满&#xff0…

数据治理--浅谈数据标准、元数据、主数据、数据模型

数据标准 数据标准:保障数据的内外部使用和交换的一致性、准确性的规范性约束(如命名、类型、值域等),通常包括了基础指标和计算指标 计算指标:即计算口径,如下单转化率、获客成本、复购率的具体计算的方式 如怎么定义一个人的性别、婚姻状况、健康状况,在不同的业务系…

什么是主数据?什么是主数据管理系统?

什么是主数据?什么是主数据管理系统? 什么是主数据? 企业主数据(Master Data)是用来描述企业核心业务实体的数据,比如客户、合作伙伴、员工、产品、物料单、账户等;它是具有高业务价值的、可以在…

客户主数据

1、KNA1(客户主文件的一般数据) 2、KNB1(客户主数据 (公司代码)) 3、KNVV(客户主记录销售数据) 4、KNVP(客户主记录伙伴功能) 5、KNVK(客户主要联系伙伴) 6、KNAS(客户主数据(一般地区的增值税登记号)) 7、KNB5(客户主记录 (催款数据)) …

企业的主数据建设方法论与实践 | 推荐收藏

本篇文章为亿信华辰《企业的主数据建设方法论与实践》视频直播稿件。 这次我的主题是企业的主数据建设方法论与实践,相信大家来听这场直播,都是对主数据建设比较感兴趣的,同时我也希望能够通过这样一场分享,给大家在主数据的建设…

BP 供应商主数据

BP 供应商S4 和ECC的区别: BP master 这个在SAP ECC6.0之前,SAP对供应商主数据,客户主数据是单独管理的,到了S4 HANA版本,所有的客户主数据和供应商主数据都叫BP 主数据, 通过不同的BP Role 来区分是供应商…