假设RabbitMQ服务器有上万条未处理消息,随便打开一个消费端,会造成巨量消息瞬间全部推送过来,然而我们单个客户端无法同时处理这么多数据。
还比如说单个Pro一分钟产生了几百条数据,但是单个Con一分钟可能只能处理60条,这时Pro-Con不平衡。通常Pro没办法做限制,所以Con就需要做一些限流措施,否则如果超出最大负载,可能导致Con性能下降,服务器卡顿甚至崩溃。
因此,我们需要Con限流。
RabbitMQ提供了一种qos (服务质量保证)功能,在非自动确认消息的前提下,若一定数目的消息 (通过基于Con或者channel设置Qos的值) 未被确认前,不消费新的消息。
不能设置自动签收功能(autoAck = false) 如果消息未被确认,就不会到达Con,目的就是给Pro减压
请求特定设置“服务质量(quality of service)”。 这些设置强加数据的服务器将需要确认之前,为消费者发送的消息数量限制。 因此,他们提供消费者发起的流量控制的一种手段。
void BasicQos(uint prefetchSize, ushort prefetchCount,
bool global);
prefetchSize和global这两项,RabbitMQ没有实现,不研究 prefetchCount在
autoAck=false
的情况下生效,即在自动应答的情况下该值无效,所以必须手工ACK。
void basicAck(Integer deliveryTag,boolean multiple)
调用该方法就会主动回送给Broker一个应答,表示这条消息我处理完了,你可以给我下一条了。参数multiple表示是否批量签收,由于我们是一次处理一条消息,所以设置为false。