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("\n\n");
                Console.Out.WriteLine(task.Exception);
                Console.Out.WriteLine("\n\n");
            }
        });

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

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

posted @ 2017-07-11 21:37  Leo  阅读(1621)  评论(0编辑  收藏  举报