In general, the out of the box ActiveMQ configuration works very well for the majority of usecases. One place where you will want to tweak things is in the area of supporting large numbers of concurrent connections.
The good news is that ActiveMQ is well capable and with the tweaks below you should be well on your way to supporting thousands of concurrent connections. Without further adieu, here’s what you need to do:
1) In your brokers
<!-- The transport connectors ActiveMQ will listen to --> <transportConnectors> <!-- use tcp port for network connectors only --> <transportConnector name="openwire" uri="tcp://localhost:61616"/> <!-- use nio port for producers/consumers --> <transportConnector name="openwire nio" uri="nio://localhost:62828?useQueueForAccept=false"/> </transportConnectors>
2) Again, in your brokers
<amq:destinationPolicy> <amq:policyMap> <amq:policyEntries> <amq:policyEntry queue=">" optimizedDispatch="true" lazyDispatch="false" producerFlowControl="false" memoryLimit="128 mb" strictOrderDispatch="true"> <amq:dispatchPolicy> <amq:strictOrderDispatchPolicy /> </amq:dispatchPolicy> <amq:messageGroupMapFactory> <amq:simpleMessageGroupMapFactory/> </amq:messageGroupMapFactory> <amq:subscriptionRecoveryPolicy> <amq:timedSubscriptionRecoveryPolicy recoverDuration="360000" /> </amq:subscriptionRecoveryPolicy> </amq:policyEntry> </amq:policyEntries> </amq:policyMap> </amq:destinationPolicy>
For more info on optimizedDispatch see Hiram‘s article here
3) At the OS level increase the number of file descriptors available to the broker
>ulimit -n 4096
4) Use a broker with a version > 5.3.0.3
5) Tweak your TCP/IP layer to support the connection load
On some operating systems you may need to tune the tcp/ip stack to be able to handle the incoming connection load. Below are the settings I’ve found worked well for Linux and Solaris.
Linux tcp tuning settings:
sudo /sbin/sysctl -w net.core.netdev_max_backlog=3000 sudo /sbin/sysctl -w net.ipv4.tcp_fin_timeout=15 sudo /sbin/sysctl -w net.core.somaxconn=3000
Note: The net.core.netdev_max_backlog controls the size of the incoming packet queue for upper-layer (java) processing.
Solaris tcp tuning settings:
# ndd -set /dev/tcp tcp_fin_wait_2_flush_interval 67500 # ndd -set /dev/tcp tcp_keepalive_interval 30000 # ndd -set /dev/tcp tcp_conn_req_max_q 8000
Lastly, when testing I’ve found the ActiveMQ jmx mbeans and jconsole to be indispensable in terms of monitoring thread counts and the number of concurrent connections. If all is configured properly each 16 incoming connections should result in one new thread in the broker VM.
These minor changes should allow you to support several thousand concurrent connections on conventional hardware. If you happen to try the settings above let me know how it goes.