这一篇文章让我们看看在消息系统中可能发生的各种错误的情况下,看下EasyNetQ如何处理它们。

订阅服务挂了

当你写了一个windows 服务,用来订阅一个NewCustomerMessage消息。
如果这个服务失败时会发生什么呢?为了效率,EasyNetQ为订阅功能实现了一个基于内存的内部使用的队列。消息通过网络从RabbitMQ中接收到后,会把消息放到这个内存队列中。一个订阅者线程从这个内存队列拿走消息后,回调自己提供的消息处理代码。一旦这个回调完成后,EasyNetQ会发送'Ack'给RabbitMQ。没有收到'Ack'前,这个消息不会从RabbitMQ消息队列中被删除。如果你的服务在处理这个消息时挂掉了,这个消息(所有的消息都在EasyNetQ内存队列中)仍将呆在RabbitMQ队列中。直到你的服务再次连接上后,这些消息将会再次被发送。

我的订阅者消费消息的速度比消息发布速度慢

EasyNetQ利用了RabbitMQ服务的特性,设置prefetch-count值为一个比较可用的值(当前是50).这意味着,将最多不会超过50条消息在消费者的内存队列中。这样会防止在你的正在订阅的应用发生内存超出异常。一旦未Ack消息数累积到这个值后,RabbitMQ将停止发送消息,只是保留这些消息在EasyNetQ的内存队列中。当然,最终这个队列将会吃掉你的RabbitMQ服务器上的所有磁盘空间。你应该在这个地方做下监控,确保在发生这种情况发生前你能够得到警报。

在我的订阅者和RabbitMQ代理之间发生网络故障

如前面文章用EasyNetQ连接RabbitMQ所述,EasyNetQ实现了一个延迟连接策略。这个策略假设这个代理不会总是可用的。当你第一次通过使用RabbitHutch.CreateBus连接到这个代理时,EasyNetQ开启一个连接,不断循环尝试去连接代理,如果你指定的连接字符串地址的代理没有处于可用状态,你会从消息信息日志中看到'Trying to Connect'。订阅者能够使用bus.Subscribe方法去订阅,即使当这个代理不可用时。这个订阅的细节会被EasyNetQ缓存。 当代理恢复可用时,这个正在不断循环尝试连接将会成功连接到代理,并且所有缓存的订阅一同恢复。
同样,当EasyNetQ和代理连接中断时,它将返回到循环连接,你在日志中看'Trying to Connect'信息。一旦连接重新建立,被缓存的订阅者将再次被建立。最后结论就是,在正在运行环境中,无论在网络断开时,或是你需要在被你的RabbitMQ代理拒绝时,你能够保留你的订阅者。

当消费一个消息时,订阅回调抛出异常

如果你的订阅回调抛出异常,EasyNetQ将会拿到这个正在被消费的消息,包装这个消息到一个指定错误消息中。这个错误消息将会被发布到EasyNetQ的错误队列(名字是EasyNetQ_Default_Error_Queue)。你应该监控这个错误队列中的消息。这个错误消息包括所有必要的信息,例如需要重新发布的原始消息,以及异常的类型,异常信息和堆栈信息。你可能使用EasyNetQ.Hosepipe工具重新发布错误信息。参考下一篇文章EasyNetQ.Hosepipe

英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Error-Conditions
本文地址:http://www.cnblogs.com/HuangLiang/p/EasyNetQ-Error-Conditions.html
我的微信订阅号:open_dotNET

18-EasyNetQ:发生错误的情况的更多相关文章

  1. EasyNetQ使用(九)【非泛型的发布&订阅扩展方法,发生错误的情况 】

    自从EasyNetQ第一个版本开始,它就可以发布/订阅特定类型的消息. bus.Subscribe<MyMessage>("subscriptionId", x =&g ...

  2. 接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。

    [2015/8/5 19:28:49]错误信息:接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定 ...

  3. Web开发中的18个关键性错误

    前几年,我有机会能参与一些有趣的项目,并且独立完成开发.升级.重构以及新功能的开发等工作. 本文总结了一些PHP程序员在Web开发中经常 忽略的关键错误,尤其是在处理中大型的项目上问题更为突出.典型的 ...

  4. 【已解决】Https请求——基础连接已经关闭 发送时发生错误

    本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...

  5. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

  6. 打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹

    打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问 在win98,winme,win2000,win2003下都能正常上传文件夹,但在winxp+sp2下同样的文件夹就可能出现问题 1. 打开 ...

  7. 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时)

    今天忽然间发现远程连接别人数据库会出现  已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - 等待的操作过时)  这种情况 ...

  8. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)

    之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...

  9. phpMyAdmin提示“无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装。”

    这是以前学生在使用phpwamp时遇到的一个问题(其他环境或是自己搭建时遇到此问题,解决方式同理) 其实这个问题与PHPWAMP本身无关,是电脑设置的问题,一般正常情况下不会出现这个问题. 现在把学生 ...

随机推荐

  1. 如何使用kali的Searchsploit查找软件漏洞

    Searchsploit Searchsploit会通过本地的exploit-db, 查找软件漏洞信息 打开kali的命令行, 输入: searchsploit 查看系统帮助 查找mssql的漏洞 如 ...

  2. Linux(Debian、Ubuntu、Deepin等)安装最新版Chrome Unstable

    将下载源加入到系统的源列表 sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ ...

  3. SQL万能语句-经典操作

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  4. Mac 多个JDK的版本 脚本切换

    这里配置jdk7和jdk8版本的切换 1.官网下载jdk7和jdk8 地址:http://www.oracle.com/technetwork/java/javase/downloads 2.安装两个 ...

  5. Log POST Data in Nginx

    先编译Nginx的echo module: ./configure --add-module=./echo-nginx-module-0.54 make make install 可以在github上 ...

  6. http服务器开发笔记(一)——先跑起来

    做了很多年的web相关开发,从来也没有系统的学习http协议,最近正好工作不怎么忙,准备系统的学习一下. 接下来准备自己写一小型的http服务器来学习,因为现在对JavaScript比较熟悉,所以决定 ...

  7. ASP.NET MVC + ECharts图表案例

    废话不多说直接讲讲今天要做的事. 利用微软爸爸的MVC框架结合百度的良心产品ECharts图表进行动态图表的生成,本文以柱状图为例. ECharts下载以及相关文档:http://echarts.ba ...

  8. js获取页面宽高

    网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...

  9. 基于Mac制作iPhone铃声教程,iTunes定制铃声

    前言: 网上太多制作方法了,不管是借助第三方软件还是基于iTunes的,不过这些方法都太旧了,有时看起来 ,界面的变化或其他原因,导致很不爽. 正好记录下我最近使用的一种方法: 正文: 一.下载你需要 ...

  10. mybatis介绍与环境搭建

    一.不用纯jdbc的原因,即缺点. 1.数据库理解,使用时创建,不用时释放,会对数据库进行频繁的链接开启和关闭,造成数据库的资源浪费,影响数据库的性能.设想:使用数据库的连接池.2.将sql语句硬编码 ...