您现在的位置是:亿华云 > 数据库
RabbitMQ 客户端源码系列 - Flow Controller 原理
亿华云2025-10-08 20:51:43【数据库】6人已围观
简介前言这次分享 RabbitMQ 自带的保护 RabbitMQ 免于过载的功能 - Flow Controller(「流量控制」),如果不明白原理和场景使用 RabbitMQ 时,
这次分享 RabbitMQ 自带的客户保护 RabbitMQ 免于过载的功能 - Flow Controller(「流量控制」),如果不明白原理和场景使用 RabbitMQ 时,端源遇到 Flow Controller 容易一脸懵逼不知所措,码系今天我们就来了解它的列F理原理。
什么是客户流量控制?流控制是一个在计算机网络和网络软件中存在了几十年的概念。本质上,端源它是码系一种向发送方施加背压以避免接收方过载的机制。接收器通常缓冲传入的列F理数据包/消息,作为处理超过其处理速率的客户发送速率的一种方式。但是端源接收器缓冲区不能永远增长,因此发送速率只能暂时超过接收器处理能力(突发流量),码系或者发送器必须放慢速度(背压)。列F理
流量控制是客户一种向发送方施加这种背压的方法,减慢它们的端源速度,以便接收方的码系缓冲区不会溢出并且延迟不会变得太大。在发送方/接收方链中,这种背压可以沿链向上传播到流量的源头。服务器托管在更复杂的连接组件图中,流控制可以平衡快速和慢速发送方之间的传入流量,避免过载,但允许系统在不同数量的发送方、不同的速率和不同的负载模式(稳定或突发)下达到充分利用。
RabbitMQ 中的流量控制RabbitMQ 看起来很像一个网络。每个 RabbitMQ Broker 在内部都使用 actor 模式实现,其中不同的组件通过消息传递相互通信,有时是在本地,有时是通过网络。还有发布者通过网络向代理发送消息,消费者从代理接收消息。
消息流的简化描述
将系统作为一个整体(代理和客户端),我们有四种可用的流量控制机制:
基于信用的流量控制。内存报警。发布者确认。消费者确认和预取。基于信用的流量控制基于信用的流量控制是一种限制消息进入速率的站群服务器方法。它允许系统内的各个参与者保护自己并在他们无法足够快地处理消息时施加反压。它仅针对那些有问题的连接、通道和队列,而系统的其他部分不受影响。
它的工作方式是系统中处理消息的每个参与者都使用“信用”作为向链施加背压的一种方式。如果通道想要向队列发送消息,它需要信用。队列授予通道一些初始信用,然后,通道发送到队列的每条消息都需要一个信用。队列将定期授予通道更多的信用,当它反过来能够将消息传递到持久层时。如果通道没有信用,它会被阻止向队列发送消息,直到队列授予它更多。这样通道就不能粗暴地运行在队列上。
经典队列的基于信用的流量控制
所以我们有一个信用流控制链,可以一直向发布者施加背压。最终,TCP 背压将施加到发布者,因为 TCP 读取器进程在被阻塞时不会从套接字读取。云南idc服务商
当连接、通道或队列用完信用时,它们会被阻塞,直到授予更多信用,这种状态称为“流”。在管理 UI 中,您可能会看到连接、通道或队列处于流状态,这表明流最近发生。这只是意味着他们暂时用完了信用,正在等待链中的下一个环节赶上并授予一些信用。这可以每秒触发多次。
信用枯竭
信贷赠款
当队列或连接达到其吞吐量限制或下游瓶颈时,流状态可以在链中的各个点每秒多次触发,因为各个参与者的信用额度达到 0 然后得到补充。
但这并不一定会阻止代理耗尽内存。传入消息并不总是高内存使用率的唯一主要原因,它也可能来自大队列和许多其他原因。
内存警报如果基于信用的流量控制无法充分刹车,或者内存使用量由于其他原因增长到临界水平,则内存警报将作为最后的手段启动,以保护代理免于崩溃(或被操作系统杀死)内存不足。
当内存警报开始时,所有发布者都会被阻止。这就像您关闭了跨集群的传入消息的水龙头。不是基于信用的流量控制的目标速率限制,而是大锤。
消费者可以继续消费,此时希望排空队列会开始减少内存占用。
在管理 UI 中,当内存警报生效时,您将看到连接被阻止或阻塞。
Memoryhttps://www.rabbitmq.com/memory.html。
发布者确认发布者确认的主要工作是数据安全,但它们在流量控制中也起着重要作用。
有以下三种方式使用发布者确认:
一次发送一个,在发送下一个之前等待每个确认(非常慢)。基于窗口的. 发送消息直到达到窗口大小(时间或消息数量)并在发送下一个窗口之前等待所有确认。流水线。允许发布者连续发送消息,但在未确认的消息计数(传输中的消息)达到限制时阻止。当确认进来时,可以发送更多消息,直到再次达到限制。流水线(或简称异步)方法提供最高和最稳定的吞吐量。它可以用作防止经纪人过载的额外保护,因为发布者本身甚至在对经纪人施加压力之前就将自己置于“流”中。
当您不使用发布者确认时,您仅依靠 TCP 流控制来控制发布者和代理上的连接读取器进程之间的链接。在发布者数量相对较少的情况下,TCP 流量控制足以避免代理过载,但是当您有大量客户端时,TCP 是不够的,并且发布者确认在重负载下对于集群稳定性变得必要。有趣的是,AMQP 1.0 添加了链路流控制来克服这个问题。
Publisher confirmshttps://www.rabbitmq.com/confirms.html。
消费者确认和预取使用带有预取的手动确认会给 RabbitMQ 带来压力,以阻止它使您的消费者客户端不堪重负。它使用流水线方法发送恒定的消息流,但将未确认消息的数量限制为预取 (QoS) 的大小。使用 AutoAck 模式,我们再次仅依赖 TCP 背压。客户端的各种入口缓冲区可能会很快填满。
很赞哦!(28)
相关文章
- 最后提醒我们,域名到期后要及时更新域名,否则可能会丢掉域名,每次抢先注册都不会成功。
- Office 2019内容简介:或许是最后的永久许可证版本
- 如何用Python进行数据分析?
- 如何优雅的处理异常?SpringBoot全局异常与数据校验
- 第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
- 如何设计一个 RPC 系统
- 超参数搜索不够高效?这几大策略了解一下
- JavaScript:从零掌握并搭建Web应用项目
- 域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
- Java程序性能优化之编程技巧总结
站长推荐
这个不用多说,不同平台的注册价格不同,且不同平台对域名释放交易的把控与曝光不同,当然价格相对便宜且平台渠道广操作便利的平台最好。
90%的程序员都犯过的代码错误
电商搜索算法技术的演进
深度策略梯度算法是真正的策略梯度算法吗?
为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
腾讯敏捷协作平台TAPD发布5.0版本 助力企业实现一体化、数字化研发
关于Java中的时间处理,你真的了解吗?
程序员的一个爬虫,把估值175亿的马蜂窝给捅了