惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

博客园 - Leo

在Windows上使用Docker 创建MongoDB 副本集的极简方法(翻译) 19-EasyNetQ:用EasyNetQ.Hosepipe重新提交错误信息 18-EasyNetQ:发生错误的情况 17-EasyNetQ:非泛型的发布&订阅扩展方法 16-EasyNetQ之自动订阅者 15-EasyNetQ之对延迟消息插件的支持 - Leo - 博客园 14-EasyNetQ之用Future Publish发布预定中事件 12-EasyNetQ之消息版本控制 11-EasyNetQ之多态发布和订阅 10-EasyNetQ之控制队列名称 9-EasyNetQ之基于主题的路由 - Leo - 博客园 8-EasyNetQ之Send & Receive 7-EasyNetQ之Request & Response 6-EasyNetQ之订阅 5-EasyNetQ之Publish(黄亮翻译) 4-EasyNetQ之Logging(黄亮翻译) 3-在EasyNetQ上使用SSL连接(黄亮翻译) 2-用EasyNetQ连接RabbitMQ(黄亮翻译) 1-EasyNetQ介绍(黄亮翻译) - Leo - 博客园
13-EasyNetQ之发布者确认
Leo · 2017-07-11 · via 博客园 - Leo

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