• 13-EasyNetQ之发布者确认


    AMQP发布消息默认情况下是非事务性的,不能确保你的消息真正送达代理。AMQP可以去指定事务性发布,但是RabbitMQ这样会非常慢,我们没有让EasyNetQ API去支持此功能。为了高效的确保投递成功,RabbitMQ推荐使用'Publish Confirms'。简单来讲,这是AMQP的一个扩展,当你的消息被代理成功接收以后,提供了一个回调支持。

    成功接收意味着什么呢?

    • 一个瞬态消息被确认那一刻,消息已进入队列。
    • 一个持久化消息被确认时,消息会持久化到磁盘,或者每一个队列上的消息已被消费掉。
    • 一个不可路由的瞬态消息被发后,就直接被确认了。

    更多关于消息确认方面的内容,请看the announcement on the RabbitMQ blog.

    启用消息确认,需要通过在连接字符串中设置 publisherConfirms=true.

    bus = RabbitHutch.CreateBus("host=localhost;publisherConfirms=true;timeout=10");
    

    异步的bus.Publish(..)方法在返回之前会等待消息确认。在超时之前(超时时间同样被配置在连接字符串中),消息确认会无失效,这将引起异常抛出。在异步发布方法上启用发布者确认将明显变慢。如果有性能上的担心,你应该考虑使用PublishAsync方法。

    bus.PublishAsync(new MyMessage
        {
            Text = "Hello World"
        }).ContinueWith(task =>
            {
                // 这里仅仅检测task已完成
                // IsCompleted 为true,如果task在故障状态中,
                // 应该使用 if (task.IsCompleted && !task.IsFaulted) 去检测是否成功。
                if (task.IsCompleted) 
                {
                    //Console.Out.WriteLine("{0} Completed", count);
                }
                if (task.IsFaulted)
                {
                    Console.Out.WriteLine("
    
    ");
                    Console.Out.WriteLine(task.Exception);
                    Console.Out.WriteLine("
    
    ");
                }
            });
    

    在收到确认消息之前,这将会返回。如果没有确认消息,或者收到一个NACK确认信息,这个task在失败状态下将会执行完成。

    英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Publisher-Confirms
    中文地址:http://www.cnblogs.com/HuangLiang/p/EasyNetQ_Publisher_Confirms.html
    我的微信订阅号:open_dotNET

  • 相关阅读:
    元素居中显示
    文本框 获取焦点 失去焦点 实时监听
    cookie/ localStorage /sessionStorage区别
    h5新增标签
    css3属性中的transform属性
    精简 闭包
    let const定义及用法
    关于arguments映射的问题
    Linux云自动化运维第二课
    下载模版的具体代码
  • 原文地址:https://www.cnblogs.com/HuangLiang/p/EasyNetQ_Publisher_Confirms.html
Copyright © 2020-2023  润新知