Have you tried prefetch=0 ?  I was doing some similar testing a while ago and 
as I recall, prefetch=0 was the setting that behaved best for my round-robin 
consumer setup.


From: Joe Smith [mailto:joesmithc...@yahoo.com]
Sent: Wednesday, June 08, 2011 5:32 PM
To: users@activemq.apache.org
Subject: Not able to load-balance messages in a cluster using PrefetchPolicy

Hi,
We are using 5.4.2 running on Linux w/Java 1.6.   The cluster has 3 primary 
brokers and corresponding slaves (residing on separate hosts).  We have 3 msg 
consumer processes  (using Springframework w/3 concurrent threads each), 
connected to each broker.  Occasionally a consumer process gets a message that 
has long running time due to interaction with another external system.  So a 
msg could take up to 20 min to process (waiting for the other system to 
complete their task).
To better load balance the msgs - to prevent msgs from being stuck behind an 
earlier/long-running msg, we use the prefetchPolicy.queuePrefetch=1 
configuration on the ConnectionFactory.
The prefetch works - where newer msgs get distributed to other consumer threads 
that are free to work in a single consumer process.  It looks like the msgs are 
dispatched to the 3 consumer processes (instead of 9 consumer threads) in a 
round-robin fashion in the cluster.  Since we have 3 independent consumer 
processes (spring/jvm), we have seen multiple msgs get dispatched to one 
consumer process and waiting, while the other 2 consumer processes connected to 
the other 2 brokers are idle.
Is there a correct configuration that will distribute the msgs from one broker 
to another without being stuck behind a long-running consumer thread?  We can 
work around the issue by increasing the number of consumer threads within each 
consumer process, but thought there could be a better, more efficient solution.
We have used the following config params:
- ConnectionFactory
-       prefetchPolicy
-       dispatchAsync = false
-       useAsyncSend = false
-       alwaysSessionAsync = false
- springframework DefaultMessageListenerContainer
-       receiveTimeout = 0
- broker config xml
-       conduitSubscriptions="false"
-       we added ?jms.prefetchPolicy.all=1 to the NetworkConnector's uri 
attribute, we also tried with just .queuePrefetch instead of .all.
-       we've tried different strict ordering dispatch policy - made no 
difference
Things we've noticed.
-       In springframework we can set the value for prefetchPolicy to either 1 
or 0, but the behavior seems to be the same.  However, we could not use value 0 
when we use our pure Java client as MessageListener.
-       Msgs are dispatched to the 3 brokers in a more or less round-robin 
fashion.  We have notice occasionally that each consumer process still gets a 
batch of msgs.  Once it gets a batch, it does not release any queued msgs to 
other brokers/consumers that are free.
There are many configuration parameters.  We may have missed some critical ones.
Thanks for your help.
Attached is the springframework config.  It's one file but I duplicated the 
beans for ConnectionFactory, listener, containers, etc to simulate the 3 
independent processes.  The number of thread are all set to one for testing 
purposes.
The activemq.xml is pretty much the default.





-----------------------------------------
***Note:The information contained in this message may be privileged
and confidential and protected from disclosure. If the reader of
this message is not the intended recipient, or an employee or agent
responsible for delivering this message to the intended recipient,
you are hereby notified that any dissemination, distribution or
copying of this communication is strictly prohibited.  If you have
received this communication in error, please notify the Sender
immediately by replying to the message and deleting it from your
computer.  Thank you.  Premier Inc.

Reply via email to