赞
踩
你在Rabbit有一个队列,然后一些消费者从这个队列中消费。如果你根本没有设置QoS(basic.qos),那么Rabbit会把所有的队列消息都按照网络和客户端允许的速度推送给客户端。消费者将会飞速增加它们的内存占用,因为它们将所有消息都缓存在自己的RAM中。如果您询问Rabbit,队列可能会显示为空,但会有大量在客户端中,正准备由客户端应用程序处理的消息未被确认。如果您添加新的消费者,则队列中不会有消息发送给新的消费者。即使有其他消费者可用于更快地处理这样的消息,它们也只是在现有的客户端缓存,并且可能在那里很长一段时间。这是相当次优的。
因此,默认的QoS预取设置为客户提供了无限的缓冲区,这可能导致不良的行为和性能。但是,怎样的QoS预取缓冲区大小才是您应该设置的?设置的目的是让消费者保持工作饱和状态,同时尽量减少客户端的缓冲区大小,以便更多的消息留在Rabbit的队列中,来可供新消费者使用,或在消费者空闲时发送给消费者。
比方说Rabbit从这个队列中拿出一条消息需要50ms,把它放到网络上,然后到达消费者。客户端处理消息需要4ms。一旦消费者处理了消息,它就会发送一个ACK给Rabbit,这个Rabbit需要进一步发送50ms的信息给Rabbit进行处理。所以我们总共有104ms的往返时间。如果我们有1个消息的QoS预取设置,那么在这个往返行程完成之后,Rabbit不会发送下一个消息。因此,客户端每104ms只有4ms,或3.8%的时间忙碌,而我们希望百分之百的时间都在忙碌中。
如果我们在每个消息的客户端上执行总的往返时间/处理时间,则得到104/4 = 26。如果我们具有26个消息的QoS预取,就解决了我们的问题:假设客户端具有26个消息缓冲,等待处理。 (这是一个明智的假设:一旦你设置了basic.qos,然后从一个队列中消耗,Rabbit将发送尽可能多的消息到你订阅到客户端的队列,直到QoS限制。消息不是很大,带宽也很高,所以Rabbit很可能比你的客户端更快地发送消息到你的客户端,所以从假设的完整性来做所有的数学是合理的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。