转载: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()]
public string EmployeeID { get; set; }
[ProtoMember()]
public string FirstName { get; set; }
[ProtoMember()]
public string LastName { get; set; }
[ProtoMember()]
public string Title { get; set; }
[ProtoMember()]
public string Address { get; set; }
[ProtoMember()]
public string City { get; set; }
[ProtoMember()]
public string Region { get; set; }
[ProtoMember()]
public string PostalCode { get; set; }
[ProtoMember()]
public string Notes { get; set; }
[ProtoMember()]
public string Extension { get; set; }
}
[ProtoContract]
public class Order
{
[ProtoMember()]
public string OrderID { get; set; }
[ProtoMember()]
public string CustomerID { get; set; }
[ProtoMember()]
public string EmployeeID { get; set; }
[ProtoMember()]
public DateTime OrderDate { get; set; }
[ProtoMember()]
public DateTime RequiredDate { get; set; }
[ProtoMember()]
public string ShipName { get; set; }
[ProtoMember()]
public string ShipAddress { get; set; }
[ProtoMember()]
public string ShipCity { get; set; }
[ProtoMember()]
public string ShipRegion { get; set; }
[ProtoMember()]
public string ShipPostalCode { get; set; }
[ProtoMember()]
public string ShipCountry { get; set; }
}

普通磁盘测试结果

内存盘测试结果

总结

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

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

通过内存盘提高MSMQ的消息吞吐能力的更多相关文章

  1. CENTOS 修改MYSQL文件到内存盘

    # 必须说明的是: # 0 内存盘的特性是断电就丢数据. # 1 对数据时效性要求高的自己做主从 # 2 重启or关机必须导出数据和开机加载数据. # 3 最好弄个脚本 开关机自己调用. # 4 简单 ...

  2. RAMDISK 内存盘工具推荐

    好了直接推荐, 1.魔方内存盘  使用方便 ,但是关机后消失.绿色 2.Primo Ramdisk Ultimate Edition5.5 3.GiliSoft RAMDisk 4.QSoft RAM ...

  3. 激活老电脑的第二春:内存盘为Chrome浏览器做缓存

    AMD Radeon RAMDisk 4.2.1 正式版 下载地址:http://dl.pconline.com.cn/html_2/1/73/id=7204&pn=0.html 适用于:wi ...

  4. centos7下做内存盘的方法

    在找这个资料的时候,基本没几个能用的或者过时了的,或者是换了概念,做的不是需要的那种盘,只有少数文章有提到关键部分应该怎么去操作,现在还是自己总结一下 内存盘tmpfs和ramdisk的区别 这个在网 ...

  5. CUDA Pro:通过向量化内存访问提高性能

    CUDA Pro:通过向量化内存访问提高性能 许多CUDA内核受带宽限制,而新硬件中触发器与带宽的比率不断提高,导致带宽受限制的内核更多.这使得采取措施减轻代码中的带宽瓶颈非常重要.本文将展示如何在C ...

  6. 四种途径提高RabbitMQ传输消息数据的可靠性(一)

    前言 RabbitMQ虽然有对队列及消息等的一些持久化设置,但其实光光只是这一个是不能够保障数据的可靠性的,下面我们提出这样的质疑: (1)RabbitMQ生产者是不知道自己发布的消息是否已经正确达到 ...

  7. 【转】MSMQ 微软消息队列 简单 示例

    MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程 ...

  8. msmq中消息的数量

    using System.Diagnostics; PerformanceCounter objCounter = new PerformanceCounter("MSMQ Queue&qu ...

  9. 【c#】队列(Queue)和MSMQ(消息队列)的基础使用

    首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择.然后就写两个队列的简单应用. Queue 命名空间 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非 ...

随机推荐

  1. SQL2008数据库导出到SQL2000全部步骤过程

    2008转到2000的步骤 1. 在sql2008上生成for 2000版本的数据库脚本 -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例, 右键要转到2000的库 ...

  2. SQL Server数据库存在判断语句及系统表简介

    Transact-SQL Exists Sentences--判断数据库是否存在IF EXISTS(SELECT * FROM master.sysdatabases WHERE name=N'库名' ...

  3. [水煮 ASP.NET Web API2 方法论](1-4)从 MVC Controller 链接到 API Controller 以及反向链接

    问题 想创建一个从 ASP.NET MVC controller 到 ASP.NET Web API controller 的直接链接,或者反向链接. 解决方案 可以使用 System.Web.Htt ...

  4. 【BZOJ】1016: [JSOI2008]最小生成树计数

    题解 考虑kruskal 我们都是从边权最小的边开始取,然后连在一起 那我们选出边权最小的一堆边,然后这个图就分成了很多联通块,把每个联通块内部用矩阵树定理算一下生成树个数,再把联通块缩成一个大点,重 ...

  5. 第一个web程序(ServletRequest , ServletResponse)

    一.ServletRequest 1.获取参数的方法(四种) > String getParameter(String name): 根据请求参数的名字, 返回参数值. 若请求参数有多个值(例如 ...

  6. PostgreSQL 入门

    1.连接数设置为:-1.表示链接数不受限制,理论上可以使用无数个链接. 2.使用外键约束,外键用来在两个表的数据之间建立连接,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的 ...

  7. GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系

    GTK,GTK+, Qt是图形界面开发库(GUI Toolkit),用户可以使用这些开发库编写GUI应用,其中GTK+是GTK的升级版. KDE,GNOME,Unity是linux下的桌面环境(Des ...

  8. Java反射机制的缺点

    来自官方指南(Tutorial):http://docs.oracle.com/javase/tutorial/reflect/index.html 反射的用途 Uses of ReflectionR ...

  9. NPOI操作Excel文件

    首先,通过NuGet添加NPOI. NPOI依赖SharpZipLib,通过NuGet添加SharpZipLib. 然后添加NPOI. 添加后项目的引用列表如下: 把DataTable转换成Excel ...

  10. Tensorflow学习:(一)tensorflow框架基本概念

    一.Tensorflow基本概念 1.使用图(graphs)来表示计算任务,用于搭建神经网络的计算过程,但其只搭建网络,不计算 2.在被称之为会话(Session)的上下文(context)中执行图 ...