通过内存盘提高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()]
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的消息吞吐能力的更多相关文章
- CENTOS 修改MYSQL文件到内存盘
# 必须说明的是: # 0 内存盘的特性是断电就丢数据. # 1 对数据时效性要求高的自己做主从 # 2 重启or关机必须导出数据和开机加载数据. # 3 最好弄个脚本 开关机自己调用. # 4 简单 ...
- RAMDISK 内存盘工具推荐
好了直接推荐, 1.魔方内存盘 使用方便 ,但是关机后消失.绿色 2.Primo Ramdisk Ultimate Edition5.5 3.GiliSoft RAMDisk 4.QSoft RAM ...
- 激活老电脑的第二春:内存盘为Chrome浏览器做缓存
AMD Radeon RAMDisk 4.2.1 正式版 下载地址:http://dl.pconline.com.cn/html_2/1/73/id=7204&pn=0.html 适用于:wi ...
- centos7下做内存盘的方法
在找这个资料的时候,基本没几个能用的或者过时了的,或者是换了概念,做的不是需要的那种盘,只有少数文章有提到关键部分应该怎么去操作,现在还是自己总结一下 内存盘tmpfs和ramdisk的区别 这个在网 ...
- CUDA Pro:通过向量化内存访问提高性能
CUDA Pro:通过向量化内存访问提高性能 许多CUDA内核受带宽限制,而新硬件中触发器与带宽的比率不断提高,导致带宽受限制的内核更多.这使得采取措施减轻代码中的带宽瓶颈非常重要.本文将展示如何在C ...
- 四种途径提高RabbitMQ传输消息数据的可靠性(一)
前言 RabbitMQ虽然有对队列及消息等的一些持久化设置,但其实光光只是这一个是不能够保障数据的可靠性的,下面我们提出这样的质疑: (1)RabbitMQ生产者是不知道自己发布的消息是否已经正确达到 ...
- 【转】MSMQ 微软消息队列 简单 示例
MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程 ...
- msmq中消息的数量
using System.Diagnostics; PerformanceCounter objCounter = new PerformanceCounter("MSMQ Queue&qu ...
- 【c#】队列(Queue)和MSMQ(消息队列)的基础使用
首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择.然后就写两个队列的简单应用. Queue 命名空间 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非 ...
随机推荐
- Docker容器跨主机通信之:直接路由方式
一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...
- MySQL通过rpm安装及其单机多实例部署
1. CentOS 下安装 MySQL Oracle 收购 MySQL 后,CentOS 为避免 MySQL 闭源的风险,改用 MySQL 的分支 MariaDB:MariaDB 完全兼容 MySQL ...
- overlay实现容器跨主机通信
本节内容: Docker容器跨主机通信方案 环境信息 升级内核 安装docker 防火墙设置和开启内核转发 安装启动consul 启动Docker 创建overlay network 创建容器 测试容 ...
- HTML5元素1
文档和元数据元素 元素 说明 类型 HTML5与其他的变化 base 设置相对URL的基础 元数据 无变化 body 表示HTML文档的内容 无 有变化 DOCTYPE 表示HTML文档的开始 无 有 ...
- 初始Winsock编程
1.套接字的创建和关闭 使用套接字之前,必须使用socket函数创建一个套接字,此函数调用成功将返回一个套接字句柄. 1 SOCKET socket( 2 int af, //用来指定套接字使用的地址 ...
- JSP的学习三(中文乱码)
1). 在 JSP 页面上输入中文, 请求页面后不出现乱码: 保证 contentType="text/html; charset=UTF-8", pageEncoding=&qu ...
- jump game(贪心算法)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [CodeForces]CodeForces 13D 几何 思维
大致题意: 给出N个红点和M个蓝点,问可以有多少个红点构成的三角形,其内部不含有蓝点 假设我们现在枚举了一条线段(p[i],p[j]),我们可以记录线段下方满足(min(p[i].x,p[j].x)& ...
- Spring 定时操作业务需求
1.定时分析 在业务需求中有的需要检测用户的状态,通过对用户状态的检测做出对此状态相应的操作,如果这种检测由运营人工检测,不仅工作量大,而且准确性不高,人工无法很好的完成工作: 问题根源:在检测用户状 ...
- web服务端安全之分布式拒绝服务攻击
一.DDOS攻击的原理分布式拒绝服务,Distributed Denial of Service,利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务.通过大量合法的请 ...




