关于RabbitMQ消息分配机制

如果打开了自动签收:

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)

  • 19
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

water-之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值