好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

通过内存盘提高MSMQ的消息吞吐能力

通过内存盘提高MSMQ的消息吞吐能力

通过内存盘提高MSMQ的消息吞吐能力

由于MSMQ的消息交互都需要对磁盘进行读写操作,所以提高MSMQ的消息吞吐能力相对比较有效的方法就是提高磁盘读写能力.可以简单地把MSMQ的消息,日志等文件存储到不同的磁盘来降低MSMQ对一个磁盘IO依赖从而达到更高的读写效能.由于MSMQ一般都是存储流水数据,如果消息结构比较少和消费积累量不高的情况把MSMQ存储放到内存则是一个非常不错的选择,这样能够大大提高MSMQ的读写效能(缺点:断电部分数据存在丢失).下面针对MSMQ内存存储的一些实现和简单测试.

构建内存盘

首先要从内存中创建一个盘出来,这个可以通过一些工具就能实现,这里选择了Dataram RAMDisk(这款工具如果的虚拟4G以下的空间是免费的).对于要分析多少内存则根据实际情况需要,以下是简单地分析2G空间构建一个磁盘出来.如果你存储的消息不大,而消息停留时间不长的情况其实足够用的.

创建完成后只需要点击Start RAMDisk按钮即可产生一个内存盘.

制定内存盘备份

完全把数据存放到内存中风险还是比较大的,可以根据实里需要把内存盘的数据写入一个镜象文件中. Dataram RAMDisk这个工具想得比较周到的它提供了 内存盘数据来源的镜象文件和定期保存镜象的设置.

 

保存镜象信息就根据实际情况设置.

更改MSMQ存储路径

当内存盘构建完成后你只需要把MSMQ的文件存储路径指向内存盘即可.

 

性能测试对比

MSMQ的存储指向内存盘后,其实整体的读写效率是不是会提高呢?下面做个简单的测试.

测试消息的结构:

?

[ProtoContract]

     public   class   Employee

     {

         [ProtoMember(1)]

         public   string   EmployeeID { get ; set ; }

         [ProtoMember(2)]

         public   string   FirstName { get ; set ; }

         [ProtoMember(3)]

         public   string   LastName { get ; set ; }

         [ProtoMember(4)]

         public   string   Title { get ; set ; }

         [ProtoMember(5)]

         public   string   Address { get ; set ; }

         [ProtoMember(6)]

         public   string   City { get ; set ; }

         [ProtoMember(7)]

         public   string   Region { get ; set ; }

         [ProtoMember(8)]

         public   string   PostalCode { get ; set ; }

         [ProtoMember(9)]

         public   string   Notes { get ; set ; }

         [ProtoMember(10)]

         public   string   Extension { get ; set ; }

     }

     [ProtoContract]

     public   class   Order

     {

         [ProtoMember(1)]

         public   string   OrderID { get ; set ; }

         [ProtoMember(2)]

         public   string   CustomerID { get ; set ; }

         [ProtoMember(3)]

         public   string   EmployeeID { get ; set ; }

         [ProtoMember(4)]

         public   DateTime OrderDate { get ; set ; }

         [ProtoMember(5)]

         public   DateTime RequiredDate { get ; set ; }

         [ProtoMember(6)]

         public   string   ShipName { get ; set ; }

         [ProtoMember(7)]

         public   string   ShipAddress { get ; set ; }

         [ProtoMember(8)]

         public   string   ShipCity { get ; set ; }

         [ProtoMember(9)]

         public   string   ShipRegion { get ; set ; }

         [ProtoMember(10)]

         public   string   ShipPostalCode { get ; set ; }

         [ProtoMember(11)]

         public   string   ShipCountry { get ; set ; }

     }

普通磁盘测试结果

 

内存盘测试结果

从测试结构来看,内存盘的收益还是很明显的.接收消息和发送消息都有着1/3的提高.由于消息的并不大,在队列中停留的时间不长,在跑了3亿多的消息调度后内存占用的空间只用了30MB,这么小空间内存盘的镜象短时间进一个保存应该不会存在多大问题.但内存盘毕竟有风险存在,如果你的业务调度消息是完全不允许丢失的话那还是不建议用内存盘做MSMQ的存储.

这个测试结果也说明了一个问题,如果想提高MSMQ的吞吐能力,一个读写效率高的磁盘是比较重要的.

可靠、高性能的Socket TCP通讯组件
开源数据库访问组件
c#组件设计交流群:47164588 
c# socket :136485198  微博http://weibo.com/ikende

 

 

 

?  上一篇: MSMQ实现自定义序列化存储

HtmlAgilityPack 抓取页面的乱码处理

利用HtmlAgilityPack抓取页面很方便,但是当页面是gb2312编码时候就会出现乱码,上网查了一下说是默认的获取页面方法不够成熟,具体什么的我也不知道,姑且就认为是不够成熟吧。

?

HtmlWeb htmlWeb = new   HtmlWeb();

HtmlDocument htmlDocument = htmlWeb.Load(@url);

解决方法如下:

新建一个方法来获取 HtmlDocument,传进来的是抓取页面的地址

?

private   static   HtmlDocument GetHtmlDocument( string   url)

  {

      HttpWebRequest httpWebRequest = WebRequest.Create( new   Uri(@url)) as   HttpWebRequest;

      httpWebRequest.Method = "GET" ;

      WebResponse webResponse = httpWebRequest.GetResponse();

      Stream stream = webResponse.GetResponseStream();

      HtmlDocument htmlDocument = new   HtmlDocument();

      htmlDocument.Load(stream);

 

      return   htmlDocument;

  }

根据@无机の剑 的评论,用这个属性就解决了(O(∩_∩)O~):

?

HtmlWeb htmlWeb = new   HtmlWeb();

htmlWeb.OverrideEncoding = Encoding.GetEncoding( "gb2312" );

 这样就可以啦!至于后面的使用方法都一样,具体可以参考这个博客,讲的很详细哈  http://www.cnblogs.com/linfei721/archive/2013/05/08/3066697.html

 

 

分类:  C#

标签:  HtmlAgilityPack ,  乱码 ,  页面抓取

作者: Leo_wl

    

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

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于通过内存盘提高MSMQ的消息吞吐能力的详细内容...

  阅读:38次