ActiveMQ与MSMQ的异同
.NET下发送和接收ActiveMQ
A:下载ActiveMQ,地址http://activemq.apache.org/download.html
B:执行/bin/win32/InstallService.bat.在Windows服务中可以看到名称为ActiveMQ的服务被建立。它提供了管理工具http://localhost:8161
A:下载.netAPI。http://activemq.apache.org/nms/。主要涉及两个DLL,Apache.NMS.ActiveMQ.dll和Apache.NMS.dll。需要自己从下载的文件中提取文件另建工程编译出这两个类库。同时下载的文件主要有两部分源代码和测试代码
B:引入DLL建立测试工程。一下列出发送和收取的代码
IConnectionFactory factory = new NMSConnectionFactory(connecturi);
using (IConnection connection = factory.CreateConnection())
using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
{
IDestination destination = SessionUtil.GetDestination(session, "queue://textMQ");
using (IMessageConsumer consumer = session.CreateConsumer(destination))
using (IMessageProducer producer = session.CreateProducer(destination))
{
connection.Start();
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
#region text
ITextMessage request = session.CreateTextMessage(sb.ToString());
producer.Send(request);
ITextMessage message = consumer.Receive() as ITextMessage;
if (message == null)
{
Console.WriteLine("No message received!");
}
else
{
//Console.WriteLine("Received message with ID: " + message.NMSMessageId);
//Console.WriteLine("Received message with text: " + message.Text);
}
#endregion
}
}
ActiveMQ和MSMQ的异同
1:发送的内容
ActiveMQ可以发送值类型也可以发送引用类型,而MSMQ只能发送值类型。
2:消息的格式
ActiveMQ支持的消息格式有
ITextMessage
IMapMessage Key-Value消息
IBytesMessage
IObjectMessage
IStreamMessage
MSMQ支持的消息格式有
XmlMessageFormatter
BinaryMessageFormatter
ActiveXMessageFormatter
2:消息的划分
MSMQ将消息划分为
用户队列(1公共队列:在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。2专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。3“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。4“响应队列”包含目标应用程序接收到消息时返回给发送应用程序响应消息。)
系统队列(1“日记队列”可选地存储发送消息的副本和从队列中移除的消息副。2“死信队列”存储无法传递或已过期的消息的副本。3“报告队列”包含指示消息到达目标所经过的路由的消息,还可以含测试消息。每台计算机上只能有一个报告队列。4“专用系统队列”是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。
ActiveMQ没有类似的划分
3:消息的等级
MSMQ将消息等级进行如下划分
Lowest
= 0,
VeryLow
= 1,
Low
= 2,
Normal
= 3,
AboveNormal
= 4,
High
= 5,
VeryHigh
= 6,
Highest
= 7,
而ActiveMQ的划分为
Lowest = 0,
VeryLow = 1,
Low = 2,
AboveLow = 3,
BelowNormal =
4,
Normal = 5,
AboveNormal =
6,
High = 7,
VeryHigh = 8,
Highest = 9,
4:Active支持软件级别的负载均衡而MSMQ不支持。
A:都支持事务
B:都支持同步和异步两种接收方式
C:消息都具有快递方式和可恢复方式(永久存储)。对于快递方式稍有差异MSMQ的快递方式只有在删除,重启机器的时候消息才会销毁而ActiveMQ可以设置保存一定时间后销毁。
ActiveMQ和msmq性能对比
机器配置:CPU 双核 2.83GHZ,内存 1.98GB OS windows2003 SP2
1 启动停机测试
ActiveMQ
重启
20W数据需要1分钟,100W在3分钟,200W在10分钟左右。
这里需要说明的是,恢复时间主要消耗在kaha上,如果使用jdbc存储,所有恢复时间都在1分钟之内。
停机
amq停机速度很快,基本没有出现过需要强制kill的情况
MSMQ
无论重启或是停机在20W,100W已及200W数据下都瞬间完成。但是清空百万级别的队列操作无法响应,必须KILL进程。(有时导致死机)
2
5分钟内25个用户发送性能测试对比
队列为空的情况下
ActiveMQ发送1k,10K,100K发送总量为5k,4.5k,4.2K平均每秒发送19,15,15
MSMQ发送1k,10k,100k发送总量为42w,31w,8,6w平均每秒发送1.4K,1k,286
25个线程1分钟Active发送1k,10K,100K发送总量为20w,12w,5K
队列为1W(时间为1分钟)
多线程ActiveMQ发送1k,10K,100K发送总量为17w,12w,1.6w
MSMQ发送接收1k,10k,100k发送总量为5.8w,1.4w,1.3k平均每秒发送956,230,20
队列为10W(时间为1分钟)
多线程ActiveMQ发送1k,10K,100K发送总量为13w,7w,2.5w
MSMQ发送1k,10k,100k发送总量为6.3w,1.4w,1.2k平均每秒发送1k,236,19
3 5分钟内25个用户发送接收性能对比
队列为空的情况下
ActiveMQ发送并接收1k,10k,100k总量为8W,4w,6K,平均每秒300,100,30条
Msmq发送并接收1k,10k,100k总量为29w,7.9w,1.1w平均每秒900,250,40条
25个线程1分钟Active发送接收1k,10K,100K发送总量为35w,12w,1.1w
队列为1W(时间为1分钟)
多线程ActiveMQ发送接收1k,10K,100K发送总量为32w,12w,2w
MSMQ发送1k,10k,100k发送总量为5w,1.2w,1k平均每秒发送800,190,19
队列为10W(时间为1分钟)
多线程ActiveMQ发送接收1k,10K,100K发送总量为34w,13w,2.5w
MSMQ发送接收1k,10k,100k发送总量为4.6w,1.2w,1k平均每秒发送743,205,18
4 发送容量
ActiveMQ单条发送100*1024*1024字节数据出错,90*1024*1024正常
ActiveMQ单条发送2*1024*1024字节数据出错,1*1024*1024正常
5 发送速率
队列为空
ActiveMQ发送1K数据耗费260MS,10K278MS,100K300MS
MSMQ发送1K数据耗费290MS,10K319MS,100K350MS
队列长1000
ActiveMQ发送1K数据耗费312MS,10K356MS,100K266MS
MSMQ发送1K数据耗费10MS,10K10MS,100K11MS
队列长1w
ActiveMQ发送1K数据耗费313MS,10K272MS,100K351MS
MSMQ发送1K数据耗费10MS,10K10MS,100K11MS
队列长10w
ActiveMQ发送1K数据耗费350MS,10K340MS,100K322MS
MSMQ发送1K数据耗费11MS,10K11MS,100K14MS
队列长100w
ActiveMQ发送1K数据耗费339MS,10K340MS,100K346MS
MSMQ发送1K数据耗费10MS,10K11MS,100K14MS
队列长1000w
ActiveMQ发送1K数据耗费754MS,10K733MS,100K758MS
MSMQ报错“资源不足“
队列长2100w
ActiveMQ发送1K数据耗费782MS,10K792MS,100K782MS
一些结论
1:ActiveMQ尽量少的建立连接,多次发送可以共用一个连接。如果每次都建立连接进行发送那么它和MSMQ没有可比性,即MSMQ性能远远高于ActiveMQ。但是如果减少连接申请那么它性能原高于MSMQ。
2:ActiveMQ的消息容量远高于MSMQ
3:ActiveMQ在发送和接收同步的时候效率最高
4:ActiveMQ在大容量(百万级别)表现更高的性能
5:ActiveMQ更灵活的操控和扩展
更加详尽的ActiveMQ性能测试/Files/tommyli/ActiveMQ测试报告.pdf