RabbitMQ-ack、nack、reject、unacked

这篇具有很好参考价值的文章主要介绍了RabbitMQ-ack、nack、reject、unacked。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 不做任何ack

如果队列使用的是手动ack,但在接收消息后不做任何ack处理,RabbitMQ会把消息标记为 unacked,unacked状态的消息不会被消费,并且占用RabbirMQ资源,只有当消费者channel断开或者服务器重启,消息才会重新回到ready状态被其他消费者消费。

2. ack

确认签收后,消息从队列中删除。

  • 自动ack

    消费者接收到消息的那一刻就发送ack信息到RabbitMQ的队列,队列将此条消息删除。

    自动ack的方式只要队列有消息,RabbitMQ会源源不断的把消息推送给客户端,而不管客户端能否消费的完。

  • 手动ack

    开发人员决定什么时机进行ack。

    如果没有及时进行ack,RabbitMQ会将来不及做ack的消息标记为unacked丢回RabbitMQ,被标记为unacked的消息无法被立刻重新消费,而是要等channel重启或者服务器重启才会变成ready(可消费的消息)。但等待服务器重启这个过程中如果积压了太多unacked消息,会导致MQ响应越来越慢,甚至崩溃的问题。

    解决方式就是及时处理消息😁(废话)

3. reject

如果消息本身或者消息的处理过程出现问题怎么办?

需要一种机制通知RabbitMQ,这个消息我无法处理,请让别的消费者处理。这里就有两种机制,Reject和Nack。

reject和Nack的差别只有一种 :reject一次只能拒绝一条消息,Nack支持批量拒绝。

还记得死信队列中的消息来源吗?有一条就是“被拒绝的消息”。

在拒绝消息时,可以使用requeue标识。

requeue为true,被拒绝的消息会重新发送给别的队列(一般为死信队列),发送的消息在队首。

requeue为false,不重新发送,这个消息就会被丢弃。

// requeue: 该消息是否重新入队
void basicReject(long deliveryTag, boolean requeue);

4. Nack

nack与reject作用相同,不过它支持批量处理多条消息。

// multiple:是否批量.true:将一次性拒绝所有小于deliveryTag的消息。
// requeue:被拒绝的是否重新入队列
void basicNack(long deliveryTag, boolean multiple, boolean requeue);

但是这两种方式都会出现一种情况 :消息被发送到其他队列或者本队列之后,一直重复消费,为什么呢?

因为reject和nack会将消息发送到队列首部,这个消息本来就出现异常拒绝消费了,你放在首部,下一次它又被发送,又拒绝、又发送、又拒绝,一直套娃。。。当然新的消息不会消费,导致消费堆积。文章来源地址https://www.toymoban.com/news/detail-555498.html

到了这里,关于RabbitMQ-ack、nack、reject、unacked的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ--基础--8.1--消息确认机制--接受确认机制(ACK)

    代码位置 消费者收到Queue中的消息,但没有处理完成就宕机的情况,这种情况下就可能会导致消息丢失。 为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除。 如果RabbitMQ没有收

    2024年02月10日
    浏览(48)
  • I2C协议关于ack和nack的思考

    clock时钟是由master端产生的,而不管master还是slave都可以发送ack/ack。ack/nack由receiver产生。 当master是发送器,slave是接收器时,ack/nack由slave接收器产生。如,在地址传输周期内,和master进行写操作的周期内,ack/nack是由slave接收器产生。 当master是接收器,slave是发送器时,ack/

    2024年02月09日
    浏览(46)
  • RabbitMQ高级特性解析:消息投递的可靠性保证与消费者ACK机制探究

    学习RabbitMQ高级特性,涵盖消息的持久化、确认模式、退回模式以及消费者ACK机制等方面,助您构建高可靠性的消息队列系统。

    2024年01月16日
    浏览(64)
  • RabbitMQ初级篇:生产者与消费者关系、消息确认机制(ACK)、交换器与队列进行消息路由和存储

    在RabbitMQ中,生产者(Producer) 负责发送消息 ,通常是应用程序向RabbitMQ服务器发送具有特定路由键的消息;消费者(Consumer)则 负责处理接收到的这些消息 。在RabbitMQ中,生产者和消费者之间使用 交换器(Exchange)和队列(Queue)进行消息路由和存储 。生产者将消息发送到

    2024年02月01日
    浏览(41)
  • springboot整合rabbitmq的发布确认,消费者手动返回ack,设置备用队列,以及面试题:rabbitmq确保消息不丢失

    目录 1.生产者发消息到交换机时候的消息确认 2.交换机给队列发消息时候的消息确认 3.备用队列 3.消费者手动ack   rabbitmq的发布确认方式,可以有效的保证我们的数据不丢失。   消息正常发送的流程是:生产者发送消息到交换机,然后交换机通过路由键把消息发送给对应的队

    2024年02月09日
    浏览(70)
  • RabbitMq 手动ACK

    如果我们设置的是自动确认的话,那么就会有当接收到消息,去处理消息的时候生成异常,那么就会有消息丢失的情况。这种异常可能是网络波动,服务器宕机等情况都会发生。 并且如果没有ACK 的话会导致mq 中的unacked 的数量飙升,可能会撑爆内存 所以大部分项目中都会去

    2024年02月12日
    浏览(44)
  • python rabbitmq 手动ack

    Centos 安装 RabbitMQ rabbitmq-doc

    2024年02月13日
    浏览(32)
  • RabbitMQ手动ACK与死信队列

    为了保证消息从队列可靠的达到消费者,RabbitMQ 提供了消息确认机制(Message Acknowledgement)。 默认情况下RabbitMQ在消息发出后就立即将这条消息删除,而不管消费端是否接收到,是否处理完,导致消费端消息丢失时RabbitMQ自己又没有这条消息了。所以在实际项目中会使用手动Ack。

    2024年02月12日
    浏览(52)
  • 浅谈RabbitMQ消费端ACK和限流

    消费者 ACK 和 消费端限流 ack指  Acknowledge ,确认。 表示消费端收到消息后的确认方式。 有三种确认方式: • 自动确认:acknowledge=\\\" none \\\" • 手动确认:acknowledge=\\\" manual \\\" • 根据异常情况确认:acknowledge=\\\" auto \\\",(这种方式使用麻烦,不作讲解) 其中自动确认是指,当消息一

    2024年02月19日
    浏览(32)
  • RocketMQ消息ACK机制及消费进度管理

    consumer的每个实例是靠队列分配来决定如何消费消息的。那么消费进度具体是如何管理的,又是如何保证消息成功消费的(RocketMQ有保证消息肯定消费成功的特性(失败则重试)? 本文将详细解析消息具体是如何ack的,又是如何保证消费肯定成功的。 由于以上工作所有的机制

    2023年04月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包