首页 > 其他分享 >RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

时间:2022-08-29 10:01:04浏览次数:106  
标签:false 入门 RabbitMQ 消息 Rabbit var channel

系列目录

RabbitMQ 入门系列:1、MQ的应用场景的选择与RabbitMQ安装。

RabbitMQ 入门系列:2、基础含义:链接、通道、队列、交换机。

RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。

RabbitMQ 入门系列:4、基础编码:官方SDK使用:链接创建、单例改造、发送消息、接收消息。

RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。

RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。

RabbitMQ 入门系列:7、保障消息:不重复消费:产生消息的唯一ID。

RabbitMQ 入门系列:8、扩展内容:接收信息时:可否根据RoutingKey过滤监听信息,答案是不能。

RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。

RabbitMQ 入门系列:10、扩展内容:延时队列:延时队列插件及其有限的适用场景。

前言:

本篇简单介绍如何保障消息不丢失的处理方式。

1、保障消息不丢失:发送方

主要是通过消息确认或事务,来保障这个过程,下面见具体代码:

1、通过确认机制处理的代码:

复制代码
using RabbitMQ.Client;
using System.Text;using (var channel = Rabbit.Instance.DefaultConnection.CreateModel())
{
    channel.ConfirmSelect();//开启确认
    channel.QueueDeclare("FirstQueue", false, false, false);
    channel.BasicPublish("", "FirstQueue", false, null, Encoding.UTF8.GetBytes("这是要发送的内容"));
    if (channel.WaitForConfirms(TimeSpan.FromSeconds(10)))//设置最长超时时间
    {
        //发送确认成功
    }
    else
    {
        //超时或失败,需要处理是否重发消息。
    }
}
复制代码

2、通过事务机制处理的代码:

复制代码
using RabbitMQ.Client;
using System.Text;

using (var channel = Rabbit.Instance.DefaultConnection.CreateModel())
{
    channel.TxSelect();
    channel.QueueDeclare("FirstQueue", false, false, false);
    channel.BasicPublish("", "FirstQueue", false, null, Encoding.UTF8.GetBytes("这是要发送的内容"));
    try
    {
        channel.TxCommit();
    }
    catch (Exception)
    {
        channel.TxRollback();
        //处理事务提交失败的逻辑。
    }
}
复制代码

2、保障消息不丢失:RabbitMQ端

对于RabbitMQ端的消息保障,我们人为可以处理的是,设置创建的队列或消息是否持久化。

通过创建持久化的队列或消息,可以保障消息写入硬盘,重启时仍能还原信息。

//第二个参数:是否持久化
channel.QueueDeclare("FirstQueue", true, false, false);

3、保障消息不丢失:接收方

接收方主要是通过消息确认,来指示是否收到信息。

复制代码
var channel = Rabbit.Instance.DefaultConnection.CreateModel();

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var message = Encoding.UTF8.GetString(ea.Body.ToArray());
    Console.WriteLine("收到默认消息 {0}", message);
};
channel.BasicConsume(queue: "FirstQueue",
                      autoAck: true,
                      consumer: consumer);
复制代码

在以上代码中,通过指定autoAck可以自动回应收到信息,但这种自动模式,不一定能保证确认信息发回服务端。

因此,要100分百保证,需要手动回应:

复制代码
var channel = Rabbit.Instance.DefaultConnection.CreateModel();

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var message = Encoding.UTF8.GetString(ea.Body.ToArray());
    Console.WriteLine("收到默认消息 {0}", message);
  try
    {
     //先处理业务,这里会有重复消费的问题,下一篇介绍。 channel.BasicAck(ea.DeliveryTag, false); } catch (Exception err) { //处理确认失败的情况。 } }; channel.BasicConsume(queue: "FirstQueue", autoAck: false, consumer: consumer);
复制代码

说明:

为了避免消息丢失问题,消息的确认,最好在是业务处理完再进行确认。

否则会出现第三方中介出问题时,或业务处理出问题时,或刚确认好消息,业务还没处理就系统异常,导致消息未消费就丢失的问题。

 

4、发送方:补充:还有一种情况:通过交换机发送过去,但交换机没送到指定的队列时

这时候应答也是正常的,但数据丢失,这种情况,是这样处理的:

 

就两点:

1、发送信息BasicPublish方法的第三个参数:mandatory设置为true。

2、定义接收的回调:BasicReturn事件。

总结:

本篇简单介绍如何使用RabbitMQ消息时,做到消息的可靠性,不丢失。

版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
个人微信公众号
创业QQ群:617713515
Donation(扫码支持作者):支付宝:
Donation(扫码支持作者):微信:
      转 https://www.cnblogs.com/cyq1162/p/16603046.html

标签:false,入门,RabbitMQ,消息,Rabbit,var,channel
From: https://www.cnblogs.com/wl-blog/p/16634903.html

相关文章

  • RabbitMQ 入门系列:7、保障消息不重复消费:产生消息的唯一ID。
    系列目录RabbitMQ入门系列:1、MQ的应用场景的选择与RabbitMQ安装。RabbitMQ入门系列:2、基础含义:链接、通道、队列、交换机。RabbitMQ入门系列:3、基础含义:持久化、......
  • Java入门-程序员的世界“Hello,World!”
    HelloWorld!java大小写敏感,尽量使用英文,用英文符号使用cmd输出建文件夹存放代码,新建Java文件,编写代码如下,编译javacjava,生成class文件,运行class文件:publicclassHell......
  • Java入门-编程环境搭建和IDEA软件安装
    JDK8下载安装若之前下载过JDK,则卸载JDK:删除java的安装目录、删除JAVA_HOME、删除path下关于java的目录、cmdjava_version安装JDK:百度JDK8、找到下载地址、同意协议、下......
  • Python入门系列(三)一学就会-基础数据类型
    数据类型您可以使用type()函数获取任何对象的数据类型。x=5print(type(x))数字类型x=1#inty=2.8#floatz=1j#complexInt,或integer,是一个长度不......
  • Java入门
    Java的特性及优势:简单性面向对象可移植性高性能分布式动态式多线程安全性健壮性Java的三大版本JavaSE:标准版(桌面程序,控制台开发…)JavaME:嵌入式开发(手机,小家电…)JavaEE:E企业......
  • 第1章 java入门
    主要内容:Java的地位Java的诞生java的特点安装JDK简单的java应用程序注释编程风格反编译1.1java的地位 ......
  • Java基础入门
    Java配置环境系统环境变量设置NameValueJAVA_HOMED:\Environment\java\jdk-14.0.1CLASSPATH;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Pat......
  • RabbitMQ 入门系列:6、保障消息:不丢失:发送方、Rabbit存储端、接收方。
    系列目录RabbitMQ入门系列:1、MQ的应用场景的选择与RabbitMQ安装。RabbitMQ入门系列:2、基础含义:链接、通道、队列、交换机。RabbitMQ入门系列:3、基础含义:持久化、......
  • Django入门到放弃之缓存及信号机制
    1.缓存介绍在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时......
  • Django入门到放弃之数据库配置
    1.配置连接MySQL数据库settings:DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'homework1009','USER':'......