转载: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. Java字符串拼接效率对比

    1.来自:http://blog.csdn.net/Zen99T/article/details/51255418 2.来自:http://blog.csdn.net/kimsoft/article/ ...

  2. [扩展推荐] Laravel 中利用 GeoIP 获取用户地理位置信息

    我最近需要一个用户地域检测来设置用户的默认区域和货币.由 Daniel Stainback 创建的 torann/geoip  很好地满足为Laravel 5 项目提供 GeoIP 服务的要求. 这个 ...

  3. nginx + tomcat 集群记录

    昨天晚写的时候已经下班了.时间紧迫.写的略简! 昨天说过.接到部署的任务之后.首先想到的是apache httpserver 毕竟pache.我们接触的比较多!然而部署之后遇到了很多问题.比如apac ...

  4. How to detect whether socket is still connected...

    How to detect whether socket is still connected… */--> div.org-src-container { font-size: 85%; fo ...

  5. 一步一步学习IdentityServer4 (4) 处理特殊需求之-登录等待页面

    用IdentityServer3的时候登录如果采用Post方式大家会发现有中间有一个等待Submit空白页面,界面不友好,现在我想把这个修改自定义的页面Loading 在Identityserver3 ...

  6. hdu 2069 1 5 10 25 50 这几种硬币 一共100个(母函数)

    题意: 有50 25 10 5 1 的硬币 一共最多有100枚 输入n输出有多少种表示方法 Sample Input1126 Sample Output413 # include <iostre ...

  7. react篇章-React Props

    state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变.这就是为什么有些容器组件需要定义 state 来更新和修改数据. 而子组件只能通过 pro ...

  8. 深度学习基础系列(七)| Batch Normalization

    Batch Normalization(批量标准化,简称BN)是近些年来深度学习优化中一个重要的手段.BN能带来如下优点: 加速训练过程: 可以使用较大的学习率: 允许在深层网络中使用sigmoid这 ...

  9. Python 学习经历分享

    如果说 Java 是亲儿子的话,那么 Python 应该就是干儿子了.看了一下所有关于 Python 的笔记,我发现原来我在 4 月份的时候就已经涉足 Python 了,但是到目前为止才真正算做出了一 ...

  10. [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...