说明

在之前的一篇博文《RabbitMQ学习(十三):死信交换机 (Dead Letter Exchanges)》中我们了解到,消息变为死信有三个原因,其中就有因为消费者的消极确认(negative acknowledgements),并且将requeue标记设置为false导致消息变为死信。本篇博文将继续翻译学习RabbitMQ官方文档中有关Negative Acknowledgements的内容,了解basic.reject和basic.nack方法的区别,及消息被拒绝后的处理方式。

正文

概述

在AMQP 0-9-1协议中,消费者可以选择使用手动确认的方式确认消息。

AMQP 0-9-1协议定义了basic.reject方法,允许客户端拒绝接收到的消息。消息被拒绝后,服务器会将消息丢弃或者重新入队派发。但这个方法不支持批量拒绝确认消息。

为了解决这个问题,RabbitMQ提供了basic.nack方法,该方法支持basic.reject方法的所有功能,同时允许客户端可以批量地处理消息


使用

要批量拒绝消息,客户端需要使用basic.nack方法并且将multiple标记设置为true。服务器将处理所有的已发送但未确认的消息,同时也包括在basic.nack方法中delivery_tay字段标记的消息。这样,basic.nack方法就可以实现与basic.ack方法相似的批量处理消息的操作。

不管是长期运行的消费者还是基于poll方式(使用basic.get方法)消费的消费者,都可以使用两种方法进行消极确认。

当一个消息被重新入队,它可能会被放置在原来在队列的位置上。但也会因为存在多个消费者共享一个队列进行消费的情况,不会回到原来位置。但是消息重新入队后也会被放到尽可能靠近队头的位置。


示例

使用java客户端,在poll方式消费的情况下拒绝一个消息,并要求重新入队(basicNack方法第三个参数是requeue标记)。

GetResponse gr = channel.basicGet("some.queue", false);
channel.basicNack(gr.getEnvelope().getDeliveryTag(), false, true);

以下示例,调用一次方法拒绝两个消息(basicNack方法的第二个参数是multiple标记)

GetResponse gr1 = channel.basicGet("some.queue", false);
GetResponse gr2 = channel.basicGet("some.queue", false);
channel.basicNack(gr2.getEnvelope().getDeliveryTag(), true, true);

原文地址: https://www.rabbitmq.com/nack.html

RabbitMQ学习(十五):消极确认(Negative Acknowledgements)相关推荐

  1. Linux学习十五 DNS基础服务

    Linux学习十五 DNS基础服务 DNS服务基础 BIND 伯利克Internet 域名服务 主要执行程序:/usr/sbin/named 系统服务:named 默认端口: TCP/UDP 53 主 ...

  2. OpenCV与图像处理学习十五——LBP纹理特征(含代码)

    OpenCV与图像处理学习十五--LBP纹理特征(含代码) 一.LBP介绍 二.LBP原理 三.代码应用 一.LBP介绍 LBP(Local Binary Pattern, 局部二值模式) , 是一种 ...

  3. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

  4. C++学习 十五、类继承(1)基类,派生类,访问权限,protected

    C++学习 十五.类继承(1)基类,派生类 前言 类继承 类的关系与继承 基类, 派生类 基类 派生类 构造函数,析构函数 文件位置 访问权限 protected 后记 前言 本篇开始学习C++类的继 ...

  5. OpenGL入门学习(十五)

    OpenGL入门学习[十五] 这次讲的所有内容都装在一个立方体中,呵呵. 呵呵,绘制一个立方体,简单呀,我们学了第一课第二课,早就会了. 先别着急,立方体是很简单,但是这里只是拿立方体做一个例子,来说 ...

  6. 强化学习(十五) A3C

    在强化学习(十四) Actor-Critic中,我们讨论了Actor-Critic的算法流程,但是由于普通的Actor-Critic算法难以收敛,需要一些其他的优化.而Asynchronous Adv ...

  7. 推荐系统遇上深度学习(十五)--强化学习在京东推荐中的探索

    强化学习在各个公司的推荐系统中已经有过探索,包括阿里.京东等.之前在美团做过的一个引导语推荐项目,背后也是基于强化学习算法.本文,我们先来看一下强化学习是如何在京东推荐中进行探索的. 本文来自于pap ...

  8. RabbitMq(十五)消息的追踪查看配置及查看方法

    消息追踪使用的是rabbitmq的trace插件,trace相关命令如下: rabbitmq-plugins list 查看所有安装插件列表 rabbitmq-plugins enable rabbi ...

  9. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,5);//定时中断初始化 set_vector_handler(PIT0 ...

最新文章

  1. 阿里开源Mysql分布式中间件:Cobar
  2. 033-Unit 5 Standard I/O and Pipes
  3. 基于EasyDarwin实现幼儿园监控类项目
  4. python英文文献翻译_科研神器(1)——python实现自动读取英文文献翻译并生成综述...
  5. mysql-外键-随堂
  6. androidstudio打包apk 文件_Android 打包生成APK文件时报lintOptions配置错误
  7. 运营商数据治理实践-郭岳
  8. c语言加减乘除运算代码_科协推文 || 走进C语言
  9. 作为一个生鲜电商自媒体
  10. AD 组策略应用与排错(2排错)
  11. SpringBoot, 启动类,使用「SpringBootApplication」标注
  12. Springcloud学习系列之Ribbon自定义负载均衡规则
  13. iOS 高级工程师是怎么进阶
  14. 京东预测系统核心介绍
  15. android 通过adb命令控制wifi开关
  16. VsCode使用及常用命令汇总(Win10)
  17. 使用腾讯云sms实现短信验证功能
  18. RC滤波器(高通/低通)
  19. 周口师范学院计算机科学,关于公布周口师范学院-计算机科学与技术学院.doc
  20. 我想转行程序员,上个编程培训班,能找到工作吗?我可以自学吗?

热门文章

  1. 【学习笔记】Tensorflow-ENet代码学习(二)
  2. 惊喜!做嵌入式UI还能用javascript
  3. 从游戏存档角度理解序列化和反序列化
  4. nuclei程序运行时的过程解决
  5. MySQL中的隐藏列!_rowid
  6. Kaldi的简单介绍和基本使用说明
  7. Pandas的 loc iloc ix 区别
  8. vue render 渲染函数 属性写法
  9. CAS ABA问题及解决方案示例
  10. 谷粒商城ES自定义词库(十八)