封装RabbitMQ.NET Library 的一点经验总结

这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单。为了节省时间我主要按照Library的执行顺序来介绍,在你看来这里仅仅是一个简单的经验总结,但是在我看来这些经验只有在你真正的封装rabbitmq客户端库的时候且将你的客户端安全稳定的发布上线后才会真的发现这些问题。

比如你的库只是链接单个Node的时候和链接高可用集群的HAProxy时候是完全两回事。当你未能在你的库里使用反向注入LOG接口的时候一旦在线上发生网络解析和序列化等一系列在线问题时候你是多么无能为力。当你使用同步循环获取队列消息的时候一旦发生异常你的链接就会断掉等等这些细节。我总结了我在编写这个library的时候慢慢稳定下来的过程和经验。至少目前来看网络上的文章,当然我是指.NET/C#方面的,都没有讲到这些问题,大部分的文章都是简单的介绍了一个最最基本的使用和最最基本的demo而已,达不到企业级使用的要求。在这个过程中,感谢我的团队和给过我指导的同事,让我明白了一些技术道理。

好东西不能石沉大海,尤其是.NET领域更需要这样的东西来填补这一空缺。废话不多说了,进入主题,那些编写框架和组件的大道理这里就不讲了,我只说重点。

1.发送链接、通道和接受链接、通道要关注点分离

就是说你的接受Channel和发送的Channel要分离开,如果不分开会出现偶发性的消息串掉的错误,我这里现在没有环境无法重现截图。我是在做压力测试的时候,用了一个Channel的时候Debug抛出来的异常。如果你有洁癖建议把IConnection也分离开。这样不容易出错,就算出错排错也会很容易。

(图1:分开接受和发送的IConnection、Channel)

还有一点,不要将这些对象直接散落在直接使用的Client类中,要建立起一个使用上下文,就算你暴露在外面的是一个具体的类但是那个类也是一个空壳子。

2.客户端发送消息的时候要标记上消息的持久化状态

我们可以在创建队列的时候设置此队列是持久化的,但是队列中的消息要在我们发送某个消息的时候打上需要持久化的状态标记。

(图2:标记此消息是需要持久化的)

3.要在监听的线程入口后加try{}catch{}

(图1:在线程内部方法中加try{}catch{})

这个点很多做封装的人会容易忽视掉,我这里补充下为了保持这个文章的完整性。

其实在我之前的“.NET应用架构设计—服务端开发多线程使用小结(多线程使用常识)”一文中有讲到过。

这个时候你的try{}catch{}其实是不会捕获到任何ListenInit方法中的异常的,因为他在另外一个线程上下文中执行的。具体原理这里就不解释了。但是可以很容易的理解就是,你这个方法一旦执行就会立马返回了。

4. 初始化的监听连接的时候要订阅Shutdown事件记录下LOG

(图4:监听Shutdown事件,记录下LOG便于排查和监管服务的稳定性)

5. 要在内部定义一个LOG反向注入接口

(图5:组件内部的LOG接口)

此接口就是你内部用来将信息传输出去的渠道,而且这个渠道是活的,有各个应用系统决定怎么记录。

简单处理你还需要一个LOG接口服务定位器对象,要不然你拿不到这个接口实例。

(图6:LOG location对象)

6. 千万不要使用while(true)接受消息

如果我们是使用死循环的方式在接受消息,那么一旦当你的接受消息的程序出现异常那么你的while直接就会跳出,你的链接可能是还链接在服务器上但是你的channel已经断开,说白了你的消息是不会接受到的,而且这样的开发方法很不稳定也不优雅。我们可以使用面向事件的消费者来接受消息。

(图7:使用Eventing类型的消费者接受消息)

7.设置一次只接受一个消息,而不是直接LOCK住所有的队列消息

默认情况下,一个队列里不管多少消息当你一个TCP连接打上去之后会LOCK住所有的消息,也就是说一个连接彻底占用了所有的消息,此时消息不会被其他集群的机器消费。

(图8:一次只取一个消息进行消费)

但是如果你对消息的处理的前后顺序有要求就不能这么做,你需要独立注册一个队列,然后将这样的一此只消费一个消息配置话。

8.自动重新连接,不需要手动处理自动连接

(图9:创建出一个会自动重连的Connection对象)

9.心跳超时时间(集群、高可用部署时至关重要的设置)

(图10:设置心跳超时时间)

如果你连接单台节点的时候不设置这个值是没问题的,但是如果你连接的是类似HAProxy虚拟节点的时候就会出现TCP被断开的可能性。如果你不设置这个心跳超时时间,它默认是不进行心跳保持的,就会出现网络中的某个设置断开空闲的TCP连接资源。就这个问题一直搞的我们的团队到第二天两点钟。大家要记住这个点。

10.消费失败的消息要重新放入队列

(图11:重新放入队列,推送给其他消费着)

总结:

最后,我是基于Rabbitmq.Client 版本3.5.3.0的基础上开发的,这个大家要注意。版本不一样会有一定的差异性。希望此文对大家在使用rabbitmq的同志有一点帮助,谢谢。

github地址:https://github.com/Plen-wang/rabbitmqclient

 

作者:王清培

出处:http://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

时间: 2024-09-21 23:45:22

封装RabbitMQ.NET Library 的一点经验总结的相关文章

在redhat Linux9下安装Oracle9.2.0的一点经验

oracle 这个也是我曾经写在大富翁论坛上的笔记,今天也一并转贴一下:http://www.delphibbs.com/keylife/iblog_show.asp?xid=6526 如下:--- 在redhat Linux9下安装Oracle9.2.0的一点经验 作者:jrq 摘要:简述在redhat Linux9环境下安装Oracle9.2.0数据库的过程. 关键字:Oracle9i  redhat Linux9  内核参数  环境变量       一直是在redhat Linux7.1环

做完一个小网站的一点经验总结(1): asp.net 与access数据库结合

access|asp.net|数据|数据库 第一次跟别人做东西,自己的一点经验,写下来,虽然比较菜,但还是要做点记录,如有错误缺漏,请各位不吝赐教,谢谢: )以前都是用asp.net 与sqlServer2000 结合做东西的,这次是用access,虽然是第一次用,但感觉与sqlServer2000的用法区别不大,以下对二者的用法做比较:SqlServer2000:    1>命名空间  using System.Data;                          using Syst

总结自己接触和学习设计的一点经验

随着公司影响力的壮大和产品的不断提升,相关的形象设计要逐步跟得上,需要逐渐提升,所以就招一个应届生美工,算是一块成长.应届生有拼劲.肯学,但也好高骛远,起点都差不多,如何培养美工就变得至关重要了.总结自己接触和学习设计的一点经验与大家分享,希望得到大家更多的建议. 一.配色 其实对色彩的感觉是设计师应具备的最基本素质,其作品不管是对网页界面.系统界面.还是产品包装等等都有广泛应用.基本的一些理论,什么冷暖色.对比色/补色.色彩心理.搭配原则等等,满大街都是,有意者随便搜一两篇看看就行.色彩对于美

编写图片空间QTP脚本时的一点经验

我录制QTP脚本的思路是让能跑起来的都跑起来,不能跑起来的暂时不管,同时先采取固化脚本的思路写脚本(详细),完成后再加入参数化,让脚本灵活起来!呵呵! 以下是我编写图片空间时的一点经验! 经验1:用FireEvent方法处理TOP菜单中弹出的子菜单 Browser("淘宝网-店铺管理平台").Page("淘宝网-店铺管理平台").Link("素材管理(1)").Click Browser("淘宝网-店铺管理平台").Page(

关于大型页游后端管理系统的一点经验和个人见解_相关技巧

前言: 做过游戏开发的人都知道,端游可以用c++,页游可以用sl或者as3,鉴于这段时间一直在看网页游戏开发的知识,所以关于游戏开发,我有一点自己的见解.就拿as3的网页游戏,一般游戏开发前端可以用as3做前端,后端用erlang,不了解这两种东西的朋友可以百度或者google一下.然后游戏数据管理和交互怎么呢!请看我下面分析! 本文主要内容: 前言 游戏数据交互 后端数据管理总结 一个简单的demo 游戏数据交互 一般一个大型的网页游戏有一个或者多个数据库以上,这些数据库内部有大量的数据表,表

地方特色网络棋牌游戏推广的一点经验

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 离开网络游戏行业已经三年多了,回想那段岁月还是非常难忘的,那时带着几个业务员跑遍了广西.湖北和河南三省十七个市,见识了不少,锻炼了不少,也收获了不少,尽管由于种种原因那个游戏项目我们没能坚持下去,但那时的激情和快乐时常令我回味至今.先讲讲这个游戏项目的背景吧,我们当时做的是地方特色网络棋牌游戏,具体名字在这里就不讲了,目前市场上做的好的有黄金

做论坛积累的一点经验

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 论坛不同于普通的门户网站博客网站等,它的SEO受到很多限制,很多常用的SEO技巧用在论坛上行不通的,下面介绍一下我做论坛的一点经验,希望大家多多交流. 一.论坛使用的心得 首先,建论坛常用的几个程序我就不用一一介绍了,只推荐两个最常用的Discuz和PHPwind,我用的后者,感觉后者稍微容易入手,论坛基本框架都已经设定好了,所以关键词密度在

我做软件推广的一点经验

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 我做软件推广的一点经验,半个月软件下载量上百万条 最近在做8UFTP客户端工具的推广,顺便整理了一点软件推广的经验,供大家参考. 我是分为下面几步去操作的 首先我到软件下载站上去发布软件,比如天空.非凡.华军软件园.多特软件园.IT168下载软件.硅谷动力下载站提交8UFTP软件.现在这些网站都需要注册,华军软件园还需要邀请码才能注册.注册之

给大学生网上开店一点经验

不用高额的投资.不用花费大量的时间,只需在网上点击鼠标就可以自己当老板,学习之余有另一番体验. 如今不少大学生认为,网上开店可以锻炼个人能 力,积累经营经验.另外,由于资金缺乏.经验不足是自主创业的最大难题,而网上开店却能在一定程度上"扬长避短".所以,成本低.回报快.容易操作的网上 开店眼下已经风靡各大高校. 校园BBS成"风水宝地" 现在,各大高校BBS都有专门的版块给学生商家免费做广告.发布信息等,比如北大未名BBS的 "ADAgent"(