欢迎大家阅读《朝夕Net社区技术专刊》

我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦!

上篇文章介绍了RabbitMQ使用中的四种路由;这篇文章给大家介绍一下关于RabbitMQ的消息确认。

如果出现图片不清晰的,请关注朝夕教育公众号可获取关于RabbitMQ的视频录播学习;本周我们学习的内容是消息确认:

生产者端消息确认(tx机制和Confirm模式)

消费者端消息确认(自动确认和显示确认)

01PART为什么要消息确认

在一些场合,如转账、付费时每一条消息都必须保证成功的被处理。AMQP是金融级的消息队列协议,有很高的可靠性,这里介绍在使用RabbitMQ时怎么保证消息被成功处理的。

消息确认可以分为两种:一种是生产者发送消息到Broke时,Broker给生产者发送确认回执,用于告诉生产者消息已被成功发送到Broker;

一种是消费者接收到Broker发送的消息时,消费者给Broker发送确认回执,用于通知消息已成功被消费者接收。下边分别介绍生产者端和消费者端的消息确认方法

02PART生产者端消息确认

生产者端的消息确认:当生产者将消息发送给Broker,Broker接收到消息给生产者发送确认回执。生产者端的消息确认有两种方式:tx机制和Confirm模式。

1. Tx机制模式

tx机制可以叫事务机制,RabbitMQ中有三个与tx机制的方法:txSelect,txcommit和txRollback。channe.txSelect用于将当前channel设置成一个transaction模式,channe.txCommit提交事务,channel.txRollback回滚事务。

使用tx机制,我们首先要通过txSelect方法开启事务,然后发布消息给broker服务器,如果txCommit提交成功了,则说明消息成功被broker接受了;

如果txCommit执行之前broker异常崩溃或者由于其他原因抛出异常,这个时候我们可以捕获异常,通过txRollback回滚事务。

准备工作:如图

看一个tx机制的简单实现:

 执行结果如下:

2. Confirm模式

C#的RabbitMQ API中,有三个与Confirm相关的方法:ConfirmSelect,WaitForCnofirms和WaitForCnofirmOrDie。channel.ConfirmSelect表示开启Confirm模式。channel.WaitForConfirms等待所有消息确认,如果所有的消息都被服务端成功接收返回true,只要有一条没有被成功接收就返回false。

channel.WaitForConfirmsOrDie和WaitForConfirms作用类型,也是等待所有消息确认,区别在于该方法没有返回值(Void),如果有任意一条消息没有被成功接收,该方法会立即抛出一个OperationInterrupedException类型异常.

下面看一个简单的案例:

执行结果如下:

03PART消费者端消息确认

生产者端的消息确认:从Broke发送到消费者时,RabbitMQ提供了两种消息确认的方式:自动确认和显示确认。

Ø 自动确认

Ø 显示确认

1、自动确认:

当RabbbitMQ将消息发送给消费者后,消费者端接收到消息后,不等待消息处理结束,立即自动回送一个确认回执。自动确认的用法十分简单,设置消费方法的参数autoAck为true即可;如下内容:channel.BasicConsume(queue:"myqueue",autoAck: true, consumer: consumer);

注意:Broker会在接收到确认回执时删除消息,如果消费者接收到消息并返回了确认回执,然后这个消费者在处理消息时挂了,那么这条消息就再也找不回来了。

2、显示确认

我们知道自动确认可能会出现消息丢失的问题,我们不免会想到:Broker收到回执后才删除消息,如果可以让消费者在接收消息时不立即返回确认回执,等到消息处理完成后(或者完成一部分的逻辑)再返回确认回执,这样就保证消费端不会丢失消息了!这正是显式确认的思路。使用显示确认也比较简单,首先将Resume方法的参数autoAck设置为false在消费端使用代码 channel.BasicAck/BasicReject等方法 来确认和拒绝消息。

生产者代码:

消费者代码如下:

介绍一下代码中标红的两个方法:

channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); 方法用于确认消息,deliveryTag参数是分发的标记,multiple表示是否确认多条。

channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false); 方法用于拒绝消息,deliveryTag也是指分发的标记,requeue表示消息被拒绝后是否重新放回queue中,true表示放回queue中,false表示直接丢弃

尝试运行:如下图

一些意外的情况:使用显式确认时,如果消费者处理完消息不发送确认回执,那么消息不会被删除,消息的状态一直是Unacked,这条消息也不会再发送给其他消费者。如果一个消费者在处理消息时尚未发送确认回执的情况下挂掉了,那么消息会被重新放入队列(状态从Unacked变成Ready),有其他消费者存时,消息会发送给其他消费者。OK,很感谢大家的观看,本片文章就介绍到这里,下一篇文章我们继续探讨RabbitMQ;

下期预告

【朝夕Net社区技术专刊】RabbitMQ的集群

本期福利

往期精彩:

【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解

【朝夕技术专刊】Core3.1WebApi_Filter多种注册方式支持依赖注入

【朝夕技术专刊】WebApi部署多服务器配置Nginx负载均衡

【朝夕技术专刊】论ORM框架—EntityFrameworkCore

rabbitmq怎样确认是否已经消费了消息_【朝夕专刊】RabbitMQ生产者/消费者消息确认...相关推荐

  1. java实现rabbitmq任务模型(work queues), 生产者 消费者 消息队列 能者多劳

    work queues也成为task queues,任务模型.当消息处理比较耗时的时候,可能生产消息的速度远远大于消费速度,长此以往,消息就会堆积,无法及时处理.此时,就恶意使用work模型,让多个消 ...

  2. RabbitMQ消息队列讲解(涵盖生产者消费者以及Springboot整合)

    文章目录 什么是消息队列 为什么用消息队列 常见MQ产品 RabbitMQ 特性 下载与安装 erlang RabbitMQ 工作原理 工作流程 消息模型 基本消息模型 生产者 消费者 消息确认机制( ...

  3. java实现rabbitmq简单队列模型,生产者 消费者 消息队列

    生产者向队列发送消息,随机消费者从队列中接收消息 创建用户和虚拟主机 通过rabbitmq提供的用户管理界面可以很轻松的创建用户和虚拟主机,并且需要将用户绑定到对应的虚拟主机.自带有guest用户和/ ...

  4. 延时消息_手把手实现一条延时消息

    前言 近期在维护公司的调度平台,其中有个关键功能那就是定时任务:定时任务大家平时肯定接触的不少,比如 JDK 中的 Timer.ScheduledExecutorService.调度框架 Quartz ...

  5. 公众号 接收规则 消息_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  6. freeswitch 发update sip消息_【PDA】SIP中生物学确认

    Biological Qualification 生物学确认的定义在之前的文章中推送过,大家可以直接点击蓝色字体链接部分,生物学确认不是对所有的SIP都适用,仅针对声明了无菌的SIP过程适用. 为了进 ...

  7. python发送微信消息_用python批量发送微信消息

    原博文 2018-09-12 14:09 − 根据用户的备注名来给用户发送特定的消息,在itchat获取的friends列表中,username每次登陆之后都会出现变化. 1 #-*- coding: ...

  8. python回复qq消息_自动给qq好友发消息

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近突然想做个自动发送qq消息的东西,然后上网搜了一下实现方法,找到了几篇用python实现的帖子,就自己试了试(原来只是简单了解过python,好多地方 ...

  9. python自动发送qq消息_自动给qq好友发消息

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近突然想做个自动发送qq消息的东西,然后上网搜了一下实现方法,找到了几篇用python实现的帖子,就自己试了试(原来只是简单了解过python,好多地方 ...

最新文章

  1. 计算机与网络技术基础试题及答案,计算机与网络技术基础试题及答案(2003年10月)...
  2. 使用next_permutation()的坑,你中招了么?
  3. 容器学习 之 容器的组件(三)
  4. idae 安装的插件怎么删掉_X7 IE阻止我安装插件怎么办
  5. 获取macos mojave_高仿MacOS教程
  6. Page directive: illegal to have multiple occurrences of contentType with different values
  7. 第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!
  8. 5-2 面向可维护性的设计模式
  9. 矢量绘图控件VectorDraw系列2021年初最新发布!性能大幅度提升 | 附下载
  10. ×××有哪些激光领域杰出的院士?
  11. 六线小县城实录美食篇
  12. [ERROR Port-10250]: Port 10250 is in use
  13. HEVC官方软件HM源代码简单分析-解码器TAppDecoder
  14. 计算机编程课程顺序_您可以在2月开始免费在线编程和计算机科学课程
  15. C++函数模板与类模板的区别
  16. Android SELinux开发入门指南之如何增加Native Binder Service权限
  17. 上班用“蝙蝠侠电话”沟通是一种怎样的体验?
  18. /var/lib/docker/overlay2 占用很大,docker数据目录迁移
  19. 戴眼镜会需要眼镜盒,该怎么创建眼镜盒嗯?下面我们就来看看3dmax创建眼镜盒模型的技巧。
  20. 梳理caffe代码layer(五)

热门文章

  1. 事物的级别_浅谈MySQL并发控制:隔离级别、锁与MVCC
  2. 万字干货介绍WebAR的实现与应用
  3. 设置IDEA编辑过程直接通过F5刷新网页就可以实时查看JSP文件更新结果,而非通过重新run
  4. 360浏览器如何设置为像chrome谷歌浏览器那样输入网址回车在当前页面,而不是新建一个标签打开
  5. 将日志中的指定字段对齐显示输出
  6. linux命令 iperf-网络性能测试工具
  7. dedecms部分文章出现读取附加信息出错的解决办法
  8. 小麦带你看postgres(代码模块结构)
  9. java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor错误
  10. 【C++】【一】结构体数组