RabbitMQ系列

RabbitMQ(一)——简介

RabbitMQ(二)——模式类型

RabbitMQ(三)——简单模式

RabbitMQ(四)——工作队列模式

RabbitMQ(五)——发布订阅模式

RabbitMQ(六)——路由模式

RabbitMQ(七)——主题模式

RabbitMQ(八)——消息确认

RabbitMQ(九)——消息持久化

RabbitMQ(十)——消息优先级

前言

  为什么要使用消息确认?

    某些场景中需要确保每条消息都要被成功处理,消息确认分为两种:

    • 一种是生产者发送消息到Broker时,Broker给生产者发送消息确认回执,告诉生产者消息已被成功发送到Broker。
    • 另外一种是消费者接收到Broker发送的消息时,消费者给Broker发送确认回执,用于通知消息已被成功消费。

第一种:生产者端消息确认

  生产者向Broker发送消息,Broker接收到消息后给生产者发送确认回执。主要有两种方式:Tx机制模式和Confirm模式

  Tx机制模式:

    Tx机制可以叫事务机制,RabbitMQ中有三个Tx机制的方法:TxSelect(),TxCommit(),TxRollback()。

    channel.TxSelect()将当前channel设置成transaction模式开启事务,channel.TxCommit()提交事务,channel.TxRollback()回滚事务使用Tx机制,首先使用channel.TxSelect()开启事务,然后发布消息给Broker服务器,如果执行channel.TxCommit()成功了表示消息被Broker接收了。当channel.TxCommit()提交时失败,可以捕获异常然后channel.TxRollback()回滚事务。

channel.TxSelect();
try {
for (int i = 0; i < 10; i++)
{
string msg = $"第{i + 1}条消息";
//5.发布消息
channel.BasicPublish("", "simple", null, Encoding.UTF8.GetBytes(msg));
Console.WriteLine($"已发送消息:{msg}");
}
channel.TxCommit();
}
catch
{
channel.TxRollback();
}

  

  Confirm模式:

    Confirm主要方法:ConfirmSelect() , WaitForCnofirms()和WaitForCnofirmOrDie()。

    channel.ConfirmSelect()表示开启Confirm模式。channel.WaitForConfirms()等待所有消息确认,如果所有的消息都被服务端成功接收返回true,只要有一条没有被成功接收就返回false。channel.WaitForConfirmsOrDie()与channel.WaitForConfirms()相似,也是等待消息确认,区别在于该方法没有返回值,只要有任意一条消息没被成功接收,会抛出一个OperationInterrupedException类型异常; 

        //
// 摘要:
// Wait until all published messages have been confirmed.
//
// 参数:
// timeout:
// How long to wait (at most) before returning whether or not any nacks were returned.
//
// timedOut:
// True if the method returned because the timeout elapsed, not because all messages
// were ack'd or at least one nack'd.
//
// 返回结果:
// True if no nacks were received within the timeout, otherwise false.
//
// 言论:
// Waits until all messages published since the last call have been either ack'd
// or nack'd by the broker. Returns whether all the messages were ack'd (and none
// were nack'd). Note, throws an exception when called on a non-Confirm channel.
[AmqpMethodDoNotImplementAttribute(null)]
bool WaitForConfirms(TimeSpan timeout, out bool timedOut);
//
// 摘要:
// Wait until all published messages have been confirmed.
//
// 参数:
// timeout:
// How long to wait (at most) before returning whether or not any nacks were returned.
//
// 返回结果:
// True if no nacks were received within the timeout, otherwise false.
//
// 言论:
// Waits until all messages published since the last call have been either ack'd
// or nack'd by the broker. Returns whether all the messages were ack'd (and none
// were nack'd). Note, throws an exception when called on a non-Confirm channel.
[AmqpMethodDoNotImplementAttribute(null)]
bool WaitForConfirms(TimeSpan timeout);
//
// 摘要:
// Wait until all published messages have been confirmed.
//
// 言论:
// Waits until all messages published since the last call have been either ack'd
// or nack'd by the broker. Returns whether all the messages were ack'd (and none
// were nack'd). Note, throws an exception when called on a non-Confirm channel.
[AmqpMethodDoNotImplementAttribute(null)]
bool WaitForConfirms();
//
// 摘要:
// Wait until all published messages have been confirmed.
//
// 言论:
// Waits until all messages published since the last call have been ack'd by the
// broker. If a nack is received, throws an OperationInterrupedException exception
// immediately.
[AmqpMethodDoNotImplementAttribute(null)]
void WaitForConfirmsOrDie();
//
// 摘要:
// Wait until all published messages have been confirmed.
//
// 言论:
// Waits until all messages published since the last call have been ack'd by the
// broker. If a nack is received or the timeout elapses, throws an OperationInterrupedException
// exception immediately.
[AmqpMethodDoNotImplementAttribute(null)]
void WaitForConfirmsOrDie(TimeSpan timeout);

Confirm API

//开启事务
//channel.TxSelect();
channel.ConfirmSelect();
try {
for (int i = 0; i < 10; i++)
{
string msg = $"第{i + 1}条消息";
//5.发布消息
channel.BasicPublish("", "simple", null, Encoding.UTF8.GetBytes(msg));
Console.WriteLine($"已发送消息:{msg}");
}
//channel.TxCommit();
channel.WaitForConfirmsOrDie();
Console.WriteLine("发送完成");
}
catch(Exception ex)
{
//channel.TxRollback();
Console.WriteLine(ex.Message);
}

第二种:消费者端消息确认

  Broker发送到消费者时,提供了两种消息确认方式:自动确认和显示确认。

  自动确认:

    当Broker向消费者发送消息后,不等消息处理结束,立即自动返回一个确认回执。使用:设置消费方法的参数autoAck为true。当Broker接收到确认回执时会删除消息,如果消费者在接收到消息并返回了确认回执后,然后消息还没处理消费者挂了,这条消息就找不回了。

channel.BasicConsume("simple", true, consumer);

  显示确认:

    自动确认会出现消息丢失,如果让消息处理完再返回确认回执那么久不存在消息丢失问题了,这就是显示确认的思路。使用:先设置消费方法的参数autoAck为false,再使用channel.BasicAck()或channel.BasicReject()方法确认、拒绝消息。

//确认消息:deliveryTag参数是分发的标记,multiple表示是否确认多条
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
//拒绝消息:deliveryTag参数也是分发的标记,requeue表示消息被拒绝后是否重新入队
channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false);

    当使用显示确认时,如果消费者处理完消息不发送回执,那么消息不会被删除,消息的状态一直是Unacked,这条消息也不会再发送给其他消费者。如果一个消费者在处理消息时尚未发送确认回执的情况下挂了,那么消息会被重新放入队列(状态从Unacked变成Ready),有其他消费者存在时,消息会发送给其他消费者。

consumer.Received += (model, e) =>
{
byte[] message = e.Body.ToArray(); //返回消息确认(true/false,自动/手动确认),没确认就不会消费掉消息
if (Encoding.UTF8.GetString(message).Contains("1"))
{
Console.WriteLine("接收消息:" + Encoding.UTF8.GetString(message));
channel.BasicAck(e.DeliveryTag, false);
}
else
{
Console.WriteLine("拒绝消息:" + Encoding.UTF8.GetString(message));
//拒绝消息 false:拒绝后丢弃 true:拒绝后重新入队
channel.BasicReject(e.DeliveryTag, false);
} };
//消费者开启监听
channel.BasicConsume("simple", false, consumer);

RabbitMQ(八)——消息确认的更多相关文章

  1. Java使用RabbitMQ之消息确认(confirm模板)

    RabbitMQ生产者消息确认Confirm模式,分为普通模式.批量模式和异步模式,本次举例为普通模式. 源码: package org.study.confirm4; import com.rabb ...

  2. RabbitMQ的消息确认机制

    一:确认种类 RabbitMQ的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是 ...

  3. RabbitMq初探——消息确认

    消息确认机制 前言 消息队列的下游,业务逻辑可能复杂,处理任务可能花费很长时间.若在一条消息到达它的下游,任务刚处理了一半,由于不确定因素,下游的任务处理进程 被kill掉啦,导致任务无法执行完成.而 ...

  4. RabbitMq之消息确认

    最近阅读了rabbitmq的官方文档,然后结合之前面试时被问到关于消息队列的问题来探索一下关于消息队列的消息确认机制. 其实消息确认就是消费者确认消息被消费了, 生产者确认消息已经发送到了消息队列中了 ...

  5. RabbitMQ学习笔记六:RabbitMQ之消息确认

    使用消息队列,必须要考虑的问题就是生产者消息发送失败和消费者消息处理失败,这两种情况怎么处理. 生产者发送消息,成功,则确认消息发送成功;失败,则返回消息发送失败信息,再做处理. 消费者处理消息,成功 ...

  6. RabbitMQ 之消息确认机制(事务+Confirm)

    概述 在 Rabbitmq 中我们可以通过持久化来解决因为服务器异常而导致丢失的问题,除此之外我们还会遇到一个问题:生产者将消息发送出去之后,消息到底有没有正确到达 Rabbit 服务器呢?如果不错得 ...

  7. RabbitMQ (十一) 消息确认机制 - 消费者确认

    由于生产者和消费者不直接通信,生产者只负责把消息发送到队列,消费者只负责从队列获取消息(不管是push还是pull). 消息被"消费"后,是需要从队列中删除的.那怎么确认消息被&q ...

  8. springboot整合rabbitmq,支持消息确认机制

    安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...

  9. 快速掌握RabbitMQ(三)——消息确认、持久化、优先级的C#实现

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

  10. RabbitMQ的消息确认ACK机制

    1.什么是消息确认ACK. 答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失.为了确保数据不会丢失,RabbitMQ支持消 ...

随机推荐

  1. python之异步任务框架Celery

    官网参考: Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest ...

  2. Ubuntu桌面远程登陆配置

    (1) 查看Ubuntu版本号 lsb_release -a (2) (a) 安装vim和Openssh-server sudo apt-get update sudo apt-get install ...

  3. PowerShell一键下载Nuget某个包的所有版本

    一转眼好几年没有写博客了,来博客园冒个泡,最近由于工作需要,内网办公,幸运的是只需要上传一个*.nupkg一个包信息就可以在私有nuget下载到了,下面就用PowerShell编写下载脚本,需要注意的 ...

  4. Flutter showModalBottomSheet改变高度

    showModalBottomSheet改变高度 将isScrollControlled设置为true,此时弹窗会全屏展示,再返回一个带高度的SizedBox,就可以指定弹窗的高度了 showModa ...

  5. Qt/C++控件设计器/属性栏/组态/可导入导出/中文属性/串口网络/拖曳开发

    一.功能特点 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个. 拖曳到画布自动生成对应的控件,所见即所得. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小 ...

  6. 前后端分离模式下Java Web开发中的技术栈概图

    参考链接1:前后端的分离模式 参考链接2:浅谈前后端分离开发模式 参考链接3:前后端分离开发模式介绍

  7. 网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别

    本文引用了作者Fundebug的"一文搞懂TCP与UDP的区别"一文的内容,感谢无私分享. 1.引言 网络协议是每个搞网络通信应用开发(比如IM.推送.网关等等)的程序员都必须要掌 ...

  8. 1. C++快速入门--变量和基本类型, 类别

    文章使用obsidian编写, 双链部分可能失效 1 基本内置类型 1.1 算术类型 算术类型介绍 bool 类型 字符类型 整数类型 实数浮点.虚数浮点和 复数浮点 参看如下表 带符号和无符号类型的 ...

  9. 敏捷开发:如何高效开每日站会(Daily Stand-up Meeting)

    介绍 在敏捷开发框架 Scrum 中,每日站会(Daily Stand-up Meeting,又叫 Daily Scrum)是 Sprint 迭代开发中,一个很重要的流程,一个重要的例会.在有限的时间 ...

  10. Solution Set -「NOIP Simu.」20221024

    \(\mathscr{A}\sim\) 断   给定一棵含有 \(n\) 个点的树, 所有点初始时为白色. 再给出 \(m\) 个形如 \((u,v)\) 的点对, 要求 \(u\) 到 \(v\) ...