RabbitMQ 消息确认
AMQP协议:是一个金融级的消息队列,确保消息万无一失
1、消息发布端的确认
手动确认消息是否已经发送
场景:发布消息到RabbitMQ中,我们需要知道这个消息是否发布成功了。
*发布确认影响性能 confirm机制对性能的影响 < tx机制对性能的影响
1)、confirm机制
1 channel.ConfirmSelect(); 2 channel.BasicPublish("headersExchange", string.Empty, properties, Encoding.UTF8.GetBytes("来自.net的问候")); 3 var isAllPublished = channel.WaitForConfirms();
2)、tx机制
1 try 2 { 3 //发布消息 4 //String exchange, 交换机名称 5 //String routingKey, routingKey 6 //IBasicProperties basicProperties, 发布属性 7 //Byte[] body 消息内容 8 channel.TxSelect(); 9 channel.BasicPublish("headersExchange", string.Empty, properties, Encoding.UTF8.GetBytes("来自.net的问候")); 10 channel.TxCommit(); 11 } 12 catch (Exception) 13 { 14 channel.TxRollback(); 15 }
2、消息消费端的确认
自动确认:消息出队列的时候就自动确认
手动确认:消息出队列之后,要应用程序自己去确认是否已经消费完毕,如果消费端拿到消息之后没有手动确认,这个时候消息不会被丢失。
1 //直接获取消息 2 //String queue, 队列名称 3 //Boolean autoAck 是否自动确认(一般设置为true) 4 var result = channel.BasicGet("headersQueue", false); 5 //手动确认 6 //UInt64 deliveryTag, 7 //Boolean multiple 结果是否为多条数据 8 channel.BasicAck(result.DeliveryTag, false);
手动拒绝:消费端拒绝队列发送过来的消息
1 //直接获取消息 2 //String queue, 队列名称 3 //Boolean autoAck 是否自动确认(一般设置为true) 4 var result = channel.BasicGet("headersQueue", false); 5 //手动确认 6 //UInt64 deliveryTag, 7 //Boolean multiple 结果是否为多条数据 8 channel.BasicAck(result.DeliveryTag, false); 9 //手动拒绝(单个) 10 //UInt64 deliveryTag, 11 //Boolean requeue 是否重新放回队列,true==是,false==丢弃 12 channel.BasicReject(result.DeliveryTag, true); 13 //手动拒绝(单或多均可) 14 //UInt64 deliveryTag, 15 //Boolean multiple, 是否多条数据 16 //Boolean requeue 是否重新放回队列,true==是,false==丢弃 17 channel.BasicNack(result.DeliveryTag, false, true);
重新递送【商家补发】:类似于快递丢单,商家只能重新发一次
1 //直接获取消息 2 //String queue, 队列名称 3 //Boolean autoAck 是否自动确认(一般设置为true) 4 var result = channel.BasicGet("headersQueue", false); 5 //手动确认 6 //UInt64 deliveryTag, 7 //Boolean multiple 结果是否为多条数据 8 channel.BasicAck(result.DeliveryTag, false); 9 //手动拒绝(单个) 10 //UInt64 deliveryTag, 11 //Boolean requeue 是否重新放回队列,true==是,false==丢弃 12 channel.BasicReject(result.DeliveryTag, true); 13 //手动拒绝(单或多均可) 14 //UInt64 deliveryTag, 15 //Boolean multiple, 是否多条数据 16 //Boolean requeue 是否重新放回队列,true==是,false==丢弃 17 channel.BasicNack(result.DeliveryTag, false, true); 18 //重新递送 19 //Boolean requeue true==重新入队列,可能会被其他消费者所接收;false==重新给当前消费者递送 20 channel.BasicRecover(false);
消息中的Properties属性
创建方式
1 //设置消息属性 2 var properties = channel.CreateBasicProperties();
1.Persistent:Bool
是否持久化
作者:奇
出处:https://www.cnblogs.com/fanqisoft/p/10392506.html
版权:本作品采用「本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。」许可协议进行许可。
如果文章内容对您有所帮助,欢迎赞赏.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!