专栏首页跟着阿笨一起玩NET通过内存盘提高MSMQ的消息吞吐能力

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

转载:http://www.ikende.com/blog/00f2634be4704b79a3e22439edeb1343

由于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的吞吐能力,一个读写效率高的磁盘是比较重要的.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 推荐一个代码自动完成的工具AutoCode

    本文转载:http://www.cnblogs.com/xiaoxiangfeizi/archive/2012/07/24/2605884.html

    跟着阿笨一起玩NET
  • 向服务器发送josn字符串,服务器端解析

    跟着阿笨一起玩NET
  • 以读取博客园随笔备份为例 将xml 序列化成json,再序列化成对象

    资源下载:http://files.cnblogs.com/codealone/ConsoleApplication2.zip

    跟着阿笨一起玩NET
  • 如何一步一步用DDD设计一个电商网站(十一)—— 最后的准备

    最近实在太忙,上周停更了一周。按流程一步一步走到现在,到达了整个下单流程的最后一公里——结算页的处理。从整个流程来看,这里需要用户填写的信息是最多的,那么在后...

    Zachary_ZF
  • 开源工具软件XMusicDownloader——音乐下载神器

    XMusicDownloader,一款 支持从百度、网易、qq和酷狗等音乐网站搜索并下载歌曲的程序。

    用户1177380
  • .NET Core 3.x之下的配置框架

    首先我们使用.NET Core的配置框架需要安装额外的NuGet扩展包,下面是列举最常用的几个扩展包以及所对应的配置功能

    ryzenWzd
  • ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

    我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结...

    蒋金楠
  • 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

    HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称。如下面...

    蒋金楠
  • .NET手撸绘制TypeScript类图——上篇

    近年来随着交互界面的精细化, TypeScript越来越流行,前端的设计也越来复杂,而 类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式。许多工...

    心莱科技雪雁
  • 设计模式学习(四): 1.简单工厂 (附C#实现)

    New ? ? 这是一个典型的情况, 我们需要在运行时来实例化一些具体的类. 在需要修改或者扩展的时候我们就需要改这段代码. 一个程序中可能会多次出现类似的代码...

    solenovex

扫码关注云+社区

领取腾讯云代金券