zoukankan      html  css  js  c++  java
  • 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

      是否持久化

  • 相关阅读:
    Linux下vi和vim模式相互切换
    Linux文件系统目录
    华硕笔记本(UEFI)支持U盘启动
    什么是RSS feed?订阅RSS有什么好处?
    JSTL的时间格式化标签的使用
    token session区别 以及JWT无状态token
    c++ 重载成员函数的地址如何获取
    c++ __VA_ARGS__
    协程任务调度器
    yield return 1
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/10392506.html
Copyright © 2011-2022 走看看