ActiveMQ与MSMQ的异同

.NET下发送和接收ActiveMQ

    A:下载ActiveMQ,地址http://activemq.apache.org/download.html 

    B:执行/bin/win32/InstallService.bat.Windows服务中可以看到名称为ActiveMQ的服务被建立。它提供了管理工具http://localhost:8161 

    A:下载.netAPIhttp://activemq.apache.org/nms/。主要涉及两个DLLApache.NMS.ActiveMQ.dllApache.NMS.dll。需要自己从下载的文件中提取文件另建工程编译出这两个类库。同时下载的文件主要有两部分源代码和测试代码

    B:引入DLL建立测试工程。一下列出发送和收取的代码

代码
            Uri connecturi = new Uri("tcp://localhost:61616?jms.prefetchPolicy.all=100");

            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,

4Active支持软件级别的负载均衡而MSMQ不支持。

A:都支持事务

B:都支持同步和异步两种接收方式

C:消息都具有快递方式和可恢复方式(永久存储)。对于快递方式稍有差异MSMQ的快递方式只有在删除,重启机器的时候消息才会销毁而ActiveMQ可以设置保存一定时间后销毁。

D:都支持点对点和发布订阅两种模式 

 

ActiveMQ和msmq性能对比

机器配置:CPU 双核 2.83GHZ,内存 1.98GB OS windows2003 SP2 

1 启动停机测试

ActiveMQ

重启

20W数据需要1分钟,100W3分钟,200W10分钟左右。

这里需要说明的是,恢复时间主要消耗在kaha上,如果使用jdbc存储,所有恢复时间都在1分钟之内。

停机

amq停机速度很快,基本没有出现过需要强制kill的情况

MSMQ

无论重启或是停机在20W100W已及200W数据下都瞬间完成。但是清空百万级别的队列操作无法响应,必须KILL进程。(有时导致死机)

2 5分钟内25个用户发送性能测试对比

队列为空的情况下

ActiveMQ发送1k10K,100K发送总量为5k4.5k4.2K平均每秒发送19,15,15

MSMQ发送1k,10k,100k发送总量为42w31w8,6w平均每秒发送1.4K1k286

25个线程1分钟Active发送1k10K,100K发送总量为20w12w5K

 

队列为1W(时间为1分钟)

多线程ActiveMQ发送1k10K,100K发送总量为17w12w1.6w

MSMQ发送接收1k,10k,100k发送总量为5.8w1.4w1.3k平均每秒发送95623020

 

队列为10W(时间为1分钟)

多线程ActiveMQ发送1k10K,100K发送总量为13w7w2.5w

MSMQ发送1k,10k,100k发送总量为6.3w1.4w1.2k平均每秒发送1k23619

 

3  5分钟内25个用户发送接收性能对比

       队列为空的情况下

       ActiveMQ发送并接收1k10k100k总量为8W4w6K,平均每秒300,100,30

       Msmq发送并接收1k10k100k总量为29w7.9w1.1w平均每秒900,250,40

25个线程1分钟Active发送接收1k10K,100K发送总量为35w12w1.1w

 

队列为1W(时间为1分钟)

多线程ActiveMQ发送接收1k10K,100K发送总量为32w12w2w

MSMQ发送1k,10k,100k发送总量为5w1.2w1k平均每秒发送80019019

 

队列为10W(时间为1分钟)

多线程ActiveMQ发送接收1k10K,100K发送总量为34w13w2.5w

MSMQ发送接收1k,10k,100k发送总量为4.6w1.2w1k平均每秒发送74320518

4 发送容量

       ActiveMQ单条发送100*1024*1024字节数据出错,90*1024*1024正常

       ActiveMQ单条发送2*1024*1024字节数据出错,1*1024*1024正常

发送速率

       队列为空

       ActiveMQ发送1K数据耗费260MS10K278MS100K300MS

       MSMQ发送1K数据耗费290MS10K319MS100K350MS

       队列长1000

       ActiveMQ发送1K数据耗费312MS10K356MS100K266MS

       MSMQ发送1K数据耗费10MS10K10MS100K11MS

       队列长1w

       ActiveMQ发送1K数据耗费313MS10K272MS100K351MS

       MSMQ发送1K数据耗费10MS10K10MS100K11MS

       队列长10w

       ActiveMQ发送1K数据耗费350MS10K340MS100K322MS

       MSMQ发送1K数据耗费11MS10K11MS100K14MS

       队列长100w

       ActiveMQ发送1K数据耗费339MS10K340MS100K346MS

       MSMQ发送1K数据耗费10MS10K11MS100K14MS

       队列长1000w

       ActiveMQ发送1K数据耗费754MS10K733MS100K758MS

       MSMQ报错“资源不足“

       队列长2100w

       ActiveMQ发送1K数据耗费782MS10K792MS100K782MS 

 一些结论

1ActiveMQ尽量少的建立连接,多次发送可以共用一个连接。如果每次都建立连接进行发送那么它和MSMQ没有可比性,即MSMQ性能远远高于ActiveMQ。但是如果减少连接申请那么它性能原高于MSMQ

2ActiveMQ的消息容量远高于MSMQ

3ActiveMQ在发送和接收同步的时候效率最高

4ActiveMQ在大容量(百万级别)表现更高的性能

5ActiveMQ更灵活的操控和扩展

更加详尽的ActiveMQ性能测试/Files/tommyli/ActiveMQ测试报告.pdf 

posted @ 2010-05-20 15:38  李占卫  阅读(4736)  评论(5编辑  收藏  举报