zoukankan      html  css  js  c++  java
  • RabbitMQ 消息确认机制以及lazy queue+ disk消息持久化

    一:Basic的一些属性,一些方法


    1. 消费端的确认

    自动确认: message出队列的时候就自动确认【broke】 basicget。。。

    手工确认: message出队列之后,要应用程序自己去确认是否已经消费完毕,如果consumer拿到message之后,没有手工确认,这个时候message不会被丢失

    void BasicAck(ulong deliveryTag, bool multiple);

    multiple: true,表示的所有message都会被确认。。。。

    手工拒绝: consumer拒绝服务器发送过来的消息。。。

    《1》 直接扔了。。。

    《2》 给快递师傅。。。

    重新递送: 【商家补发】 快递丢单。。。商家只能重新发一次。。。


    Basic提供了那些方法来做到这些事情。
    //扔掉消息
    channel.BasicReject(result.DeliveryTag, false);

    //退回消息
    channel.BasicReject(result.DeliveryTag, true);

    //批量退回或删除,中间的参数 是否批量 true是/false否 (也就是只一条)
    channel.BasicNack(result.DeliveryTag, true, true);


    //补发消息 true退回到queue中(有可能被其它的consumer接收到)/false只补发给当前的consumer
    channel.BasicRecover(true);


    2. 发布端的确认 手工确认消息是否已经发送到了broke。。。。

    confirm机制。。。

    tx机制: 【事务控制】

    publish 送message到rabbitmq中,我们一定要知道,这个消息已经发送成功了。。。。 也就是,rabbitmq
    一定要告诉publish,这条消息已经被确认收到。。。

    影响性能的,,, confirm机制 < tx机制【最耗费性能】


    //发布确认
    channel.ConfirmSelect();

    for (int i = 0; i < 10; i++)
    {
    channel.BasicPublish(string.Empty, "mytest", null, Encoding.UTF8.GetBytes(string.Format("{0} 你好", i)));
    }

    var isallpublished = channel.WaitForConfirms();

    我们声明队列和交换机的时候设置了持久化,并且将队列和交换机保存到了mnesia数据库中,但是我们发布的消息如何进行持久化?

    通过懒队列 lazy queue 设置
    lazy queue+ disk,消息放到磁盘到
    //声明一个懒队列
    channel.QueueDeclare("lazyqueue", true, false, false, new Dictionary<string, object>
    {
    { "x-queue-mode","lazy"}
    });

  • 相关阅读:
    【转载】通用 application 彻底退出应用 获崩溃异常,保存错误日志,并重启应用
    【转载】 Android App 内存泄露之Thread
    【转载】ViewHolder的简洁写法
    Android知识整理(5) apk反编译与代码混淆
    CAS单点登录客户端配置
    一位知乎网友的人生感悟
    Android知识整理(4) 关于Android应用的退出
    Android知识整理(3) 两种自定义样式的Checkbox
    Android知识整理(2)【转】android中三种onClick事件的实现方式与对比
    Android知识整理(1) Pull解析器解析XML
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/10248477.html
Copyright © 2011-2022 走看看