为高并发程序部署ActiveMQ

来源:互联网 发布:红蜘蛛软件多少钱 编辑:程序博客网 时间:2024/05/16 01:18
为高并发程序部署ActiveMQ,
单个代理需要处理成千上万的连接和消息队列.
默认情况下,ActiveMQ被设计成尽可高效的传输消息以确保低延迟和良好的性能.
但是,你也可以进行一些配置使的ActiveMQ代理可以同时处理大量并发的连接以及大量的消息队列.

默认情况下,ActiveMQ使用阻塞IO来处理传输连接,这种方式为每一个连接分配一个线程.你可以为ActiveMQ代理使用非阻塞IO(同时客户端可以使用默认的传输)以减少线程的使用.可以在ActiveMQ的配置文件中通过传输连接器配置非阻塞IO.下面的是配置非阻塞IO的示例:
代码:配置NIO传输连接器
<broker>  <transportConnectors>  <transportConnector name="nio" uri="nio://localhost:61616"/> </<transportConnectors> </broker> 

除了为每个连接使用一个线程的阻塞IO,ActiveMQ还可以为每一个客户端连接使用一个消息分发线程.你可以通过将系统参数org.apache.activemq.UseDedicatedTaskRunner设置为false来设置ActiveMQ使用一个搞线程池.下面是一个示例:
ACTIVEMQ_OPTS="-Dorg.apache.activemq.UseDedicatedTaskRunner=false"

确保ActiveMQ代理用于足够的内存来处理大量的并发连接,需要分两步进行:
首先,你需要确保运行ActiveMQ的JVM在启动之前已经配置了足够的内存.可以使用 JVM的-Xmx选项来配置,如下所示:
ACTIVEMQ_OPTS="-Xmx1024M?-Dorg.apache.activemq.UseDedicatedTaskRunner=false"

其次,需要确保JVM配置了适量的专门供ActiveMQ代理使用的内存.这个配置可用通过<system-Usage>元素的limit属性来配置.一个不错的根据经验得到的规则时,在连接数为几百个时配置512MB为最小内存.
如果测试发现内存不够用,可以增加内存配置.你可以按照下面代码示例来配置ActiveMQ使用的内存限制:
代码:为ActiveMQ代理设置内存使用限制
<systemUsage><systemUsage>
<memoryUsage><memoryUsage limit="512mb"/></memoryUsage>
<storeUsage><storeUsage limit="10gb" name="foo"/></storeUsage>
<tempUsage><tempUsage limit="1gb"/></tempUsage>
</systemUsage></systemUsage>

同样,简易减少每个连接的CPU负载.如果你正使用Open-Wire格式的消息,关闭tight encoding选项,开启该选项会导致CPU占有过多.Tight encoding选项可以通过客户端连接的URI中的参数设置以便关闭该选项.下面是示例代码:
String uri = "failover://(tcp://localhost:61616?" + wireFormat.tightEncodingEnabled=false)";
ConnectionFactory cf = new ActiveMQConnectionFactory(uri);

了解了一些扩展ActiveMQ代理处理大量连接的调优选项之后,我们在了解一些让ActiveMQ处理大量消息队列的调优选项.
默认的消息队列配置中使用一个独立的线程负责将消息存储中的消息提取到消息队列中而后再被分发到对其感兴趣的消息消费者.如果有大量的消息队列,建议通过启用optimizeDispatch这个属性
改善这个特性,示例代码如下所示:
<destinationPolicy><policyMap>
<policyEntries><policyEntry queue=">" optimizedDispatch="true"/></policyEntries>
</policyMap></destinationPolicy>

注意,代码清单中使用通配符>表示该配置会递归的应用到所有的消息队列中.
为确保扩展配置既可以处理大量连接也可以处理海量消息队列,请使用JDBC或更新更快的KahaDB消息存储.默认情况下ActiveMQ使用KahaDB消息存储.
到目前位置,我们关注了连接数扩展,减少线程使用以及选择正确的消息存储.下面的示例配置代码展示了ActiveMQ配置中为扩展进行了调优:
代码:为扩展进行调优的配置示例代码
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="amq-broker" dataDirectory="${activemq.base}/data">
<persistenceAdapter> <kahaDB directory="${activemq.base}/data" journalMaxFileLength="32mb"/> </persistenceAdapter>
<destinationPolicy> <policyMap> <policyEntries> <policyEntry queue="&gt;" optimizedDispatch="true"/></policyEntries></policyMap></destinationPolicy>
<systemUsage> <systemUsage> 
<memoryUsage> <memoryUsage limit="512mb"/> </memoryUsage> 
<storeUsage><storeUsage limit="10gb" name="foo"/></storeUsage><tempUsage>
<tempUsage limit="1gb"/></tempUsage>
</systemUsage></systemUsage>
<transportConnectors><transportConnector name="openwire" uri="nio://localhost:61616"/></transportConnectors>
</broker>
注意示例代码中所有为调优而建议的配置条目,这些调优条目在默认的配置文件中并没有配置,所以请确保给予充分重视.
原创粉丝点击