如果打开了自动签收:
1:自动签收消息:如下图所示,我们如果将
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
中间写为true,意思就是自动签收消息,这样的话,如果生产者生产了100个消息,倘若有两个消费者,他们两个消费者将会每人拿到50个消息,如果此时两个消费者其中之一出现阻塞的状况,那么会导致另一个消费者早早的已经完成的自己50个消息的任务,而阻塞的消费者却还在慢慢的自己消费,这样造成了资源被浪费!
为什么会导致这样呢?我们可以将消费者的行为理解成两部分,第一部分是,队列给他消息他接受了,第二个部分是,他自己每消费完一个消息就会回馈给队列信号然后将该消息删除,然后我们的自动应答机制也就是意味着会强制让一个消费者平分所有的消息数量,也就是在第一阶段就会默认接受队列里面总过提供的消息数的平均数,即使这是一个阻塞的消费者。
然后就说一下为了避免慢的消费者还在慢慢处理自己的一大堆消息,快的消费者早早的处理完闲等的情况,我们怎么就可以开启不公平分发,使得能者多劳呢?那就是使用 channel.basicQos(1);这个语句,同时开启手动应答:
手动应答:
这个语句的作用就是,一个队列一次性最大的处理消息数量,括号里面要是1的话就代表,这个消费者必须处理完1个消息才可以问队列要第二个消息,不能在第一阶段就先揽收下均等的消息数量然后自己慢吞吞的开始处理消息,这样写的作用就可以做到能者多劳,消费者们不会一开始边均等分配到消息,而是大家都消费一个再拿一个,谁消费的快谁就拿的多!
那要是我们开启了自动应答,同时我们写了channel.basicQos(1);,会不会出现能者多劳的情况呢?答案是不会的,倘若开启了自动应答,就算消费者提供了channel.basicQos(1),表示自己最大只能承受一个消息的量,但是还是会默认强制性的将不同的消费者分配给均等的消息数量使其处理,自动应答的优先级要高于channel.basicQos(1)。
版权归原作者 夜色架构师 所有, 如有侵权,请联系我们删除。