• 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"}
    });

  • 相关阅读:
    转载:C#中的属性、和字段的区别
    在idea中创建一个maven web工程及解决工程创建过慢问题
    注解&动态代理
    Listener&Filter
    Ajax&jQuery
    JSP&EL&JSTL
    Cookie&Session
    HttpServletRequest&HttpServletResponse
    Http协议&Servlet
    XML
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/10248477.html
Copyright © 2020-2023  润新知