转载: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. 浮动元素垂直居中,bootstrap栅格布局垂直居中

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. LeetCode664. Strange Printer

    There is a strange printer with the following two special requirements: The printer can only print a ...

  3. qt 问题及处理

    1. 包依赖问题 在windows平台时,通过microsoft process Explorer可以查看所以来的dll.并将这些dll复制到应用程序目录,加上qt.conf就可以使用了. [Path ...

  4. servlet 学习笔记(三)

    同一用户的不同页面共享数据有以下四种方法: 1.sendRedirect()跳转 2.session技术 3.隐藏表单提交(form) 4. cookie技术(小甜饼) --------------- ...

  5. 一步一步学习IdentityServer3 (8)

    IdentityServer3结合Hangfire及Cookies中间件实现授权 Idr3数据库Token过期管理 GlobalConfiguration.Configuration.UseSqlSe ...

  6. CCF CSP 201703-5 引水入城(50分)

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-5 引水入城 问题描述 MF城建立在一片高原上.由于城市唯一的水源是位于河谷地带的 ...

  7. day6 shelve模块

        shelve模块 shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式,shelve模块是对pickle模块的补充.我们知道 ...

  8. ava包(package)的命名规范,java中package命名规则

    Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...

  9. Spring Boot 教程demo

    https://github.com/ityouknow/spring-boot-examples

  10. Noip模拟题 Matrix [递推,组合数]

    Matrix 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小 z 的女朋友送给小 z 一个 n × n 的矩阵.但是矩阵实在太大了,小 z 的女朋友拿不动,只能带给他两个长度为 n ...