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

      是否持久化

  • 相关阅读:
    宫立秋20201015-3 每周例行报告
    宫立秋 20201008-1 每周例行报告
    分析“中国铁路12306”查询某个火车经过的车站和预计到达时间的request请求和respond响应。
    来自童晶老师的游戏开发课程作业
    飞机大战
    总结
    20201207-总结
    实时时钟
    作业要求 20201126-1 每周例行报告
    要求 20201120-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/10392506.html
Copyright © 2011-2022 走看看