博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ 消息确认机制
阅读量:6847 次
发布时间:2019-06-26

本文共 2181 字,大约阅读时间需要 7 分钟。

消息确认机制

在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制。重复的就不说了,这里说一些不一样的。

 

consumer的消息确认机制

当一个消费者收到一个快递,但是这个包裹是破损的,这时候一般会有以下选择

拒收快递,让快递员把快递寄回。 (如果有多个consumer可能这条消息会到其它的consumer中,如果只有一个,那么下次获取还是可以拿到)

签收快递,然后偷偷的扔了(钱多任性)

拒收快递,联系商家再给我补发一个

下面是具体的方法,BasicReject同时承担了扔掉消息与退回。区别在第二个参数。BasicNack则是批量进行上面两个操作,DeliveryTag小于或等于当前消息的都会进行该操作,当然是否批量是由第二个参数来决定的

//扔掉消息channel.BasicReject(result.DeliveryTag, false);//退回消息channel.BasicReject(result.DeliveryTag, true);//批量退回或删除,中间的参数 是否批量 true是/false否 (也就是只一条)channel.BasicNack(result.DeliveryTag, true, true);

BasicRecover方法则是进行补发操作,其中的参数如果为true是把消息退回到queue但是有可能被其它的consumer接收到,设置为false是只补发给当前的consumer

//补发消息 true退回到queue中/false只补发给当前的consumerchannel.BasicRecover(true);

 

消息发布者的确认机制

消息不只是在consumer处理的时候出问题,在发布的时候也可能会出问题。不是说把消息向方法里一丢就一定会成功的。所以发布的确认机制也是为高可靠性保驾护航。

rabbitmq为我们提供了两种方式

确认方式       (confirm)

事务控制方式 (tx)

但是要知道这些都是耗费性能的,其中事务的性能消耗最大,confirm其次

第一种confirm方式,发布后等待rabbitmq返回消息发布状态

//创建返回一个新的频道            using (var channel = RabbitMqHelper.GetConnection().CreateModel())            {                for (var i = 0; i < 6; i++)                {                    channel.BasicPublish(string.Empty, "testqueue", null, Encoding.UTF8.GetBytes($"这是{i}个消息"));                }                //等待发布成功并返回发布状态                bool isok = channel.WaitForConfirms();                Console.ReadKey();            }

第二种事务控制方式

//创建返回一个新的频道            using (var channel = RabbitMqHelper.GetConnection().CreateModel())            {                try                {                   //锁往                    channel.TxSelect();                    for (var i = 0; i < 6; i++)                    {                        channel.BasicPublish(string.Empty, "testqueue", null, Encoding.UTF8.GetBytes($"这是{i}个消息"));                    }                    //提交                    channel.TxCommit();                                    Console.ReadKey();                }                catch (Exception e)                {                    //回退                    channel.TxRollback();                }            }

 

下面是针对速度测试图,发布一万条消息。 第一次我使用了事务控制方式。耗时915毫秒

第二次使用了confirm方式,耗时374毫秒

第三次没有使用消息确认机制,耗时317毫秒

转载于:https://www.cnblogs.com/LiangSW/p/6229969.html

你可能感兴趣的文章
<c:catch/>捕捉异常
查看>>
Poj 1961 KMP
查看>>
windows部署jenkins持续集成maven测试项目不能访问测试报告
查看>>
Hadoop之Hive篇
查看>>
The fundamental differences between "GET" and "POST"
查看>>
从mixin到new和prototype:Javascript原型机制详解
查看>>
Vue.js组件之间的通信
查看>>
XP安装IIS名称以无效字符开头问题
查看>>
C#中泛型的使用
查看>>
ORA-01033: ORACLE initialization or shutdown in progress问题
查看>>
蓝桥杯试题利用数学知识经典解法,1.三个空瓶子换一瓶水;2.猜最后一个字母——猎八哥FLY...
查看>>
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
查看>>
JVM学习笔记(三)------内存管理和垃圾回收【转】
查看>>
input子系统四 input事件处理【转】
查看>>
C语言ASM汇编内嵌语法【转】
查看>>
【原创】Windows Phone真机抓包并分析应用程序的网络通讯(Android、iPhone也适用)...
查看>>
JAVA中ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题...
查看>>
为什么给的待遇很丰厚,我的90后员工还是要走?
查看>>
剖析产品 找准用户 做个创业“老炮儿” --司马亮创业回忆录(二)
查看>>
oracle EXP导出一张表时使用query参数指定where条件
查看>>