zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/tommyli/p/1740090.html
Copyright © 2011-2022 走看看