消息队列RabbitMQ和ActiveMQ的生产者流量控制
20120825 郑昀
[{rabbit, [{vm_memory_high_watermark, 0.4}]}].
当 MQ 启动时,该内存阈值也会写入到 RABBITMQ_NODENAME.log 文件里,如下所示:
Memory limit set to 2048MB.
=WARNING REPORT==== 29-Oct-2009::17:23:44 ===
Unknown total memory size for your OS {unix,magic_homebrew_os}. Assuming memory size is 1024MB.
二,Apache ActiveMQ 的流量控制
- 不管 mq 有无做持久化配置:
- !ActiveMQ所使用的内存到达 memoryUsage 配置值,默认值64MB;
- 如果 mq 做了持久化配置:
- !要打开了useCache开关,表明要将持久化消息缓存起来以便快速访问,默认是True;
- !缓存在内存中消息总字节数到达 memoryLimit 配置值,默认值是1MB。
一,基于信用证(Credit)的拥塞控制机制
1993年,ATM领域开始寻找一种可以动态分配带宽并防止信元丢失的传输机制。因此提出了ABR(Available Bit Rate,可用比特率)业务,ABR 不强制网络为其分配固定的带宽,网络通过反馈信息动态调整分配给每个 ABR 连接的带宽。很多专家都投入到 ABR 业务的拥塞控制规范研究上。
基于 Credit 的方案由哈佛大学的H.T.Kung教授首先提出,采用链路级流控机制,以单一链路或虚电路VC作为基本的控制单位。每条链路有一个信元发送节点(可以是一个源端或一个交换节点)和一个接收节点(可以是一个交换节点或一个目的端系统),每个节点为每一条VC维持一个排队队列,信元接收端监视每条VC的排队队列长度,决定发送端可以发到VC上的信元数量(用信用证通知),信元发送端只能发送信用证值所允许的最大信元数量,如果只有一条VC,则信用证的值应足够大,以充分利用链路的带宽。一般来说,信用证值应满足下列条件:信用证值大于等于 链路信元速率乘以链路来回程传输时延。
图6-17 给出了基于信用证拥塞控制机制的基本工作原理。信元接收方首先发送信用证到信元发送方,通知可用的缓冲区容量,发送方收到信用证之后,就可决定发送的信元数量。
它的最大缺点是实现复杂,在每一对相邻的节点之间都需要维持这一信用证机制,同时也增加了信元的时延。
二,RabbitMQ 是如何实现的
『实质上 RabbitMQ 就是通过监控每个进程的mailbox,当某个进程负载过高来不及接收消息时,这个进程的mailbox就开始堆积消息。
当堆积到一定量时,就会阻塞住上游进程,让其不得接收新消息。从而慢慢上游进程的mailbox也开始积压消息。
到了一定的量又会阻塞上游的上游的进程接收消息,最后就会使得负责网络数据包接收的进程阻塞掉,暂停接收数据。
这就有点像一个多级水库,当下游水库压力过大时,上游水库就得关闭闸门,使得自己的压力也越来越大,需要关闭更上游的水库闸门,直到关闭最最上游的闸门。』——http://ybbct.iteye.com/blog/