You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Johan Stuyts <j....@zybber.nl> on 2009/06/12 13:45:25 UTC

Opinion about lossy, failover, load-balanced topology

Hi,

I have little experience using messaging systems, so I would like to hear  
peoples opinion about a topology I am thinking about using.

The purpose of the system is to allow front-end servers (producers) to  
asynchronously send commands to multiple back-end servers (consumers), and  
allow the front-ends to collect the responses using temporary queues.

I do not care about reliability. All messages will be non-persistent and  
will have a short time-to-live. If a response does not arrive within a  
certain timeout, the front-end will handle that by, for example,  
displaying an error message.

I do care about failover for back-end servers, and load balancing the  
requests over the back-end servers.

To satisfy these requirements, I want to embed a broker inside every  
front-end and have the back-ends connect to the brokers of front-ends.

For example, assume the following components are used:
- 2 front-ends: X and Y
- 2 business-logic back-ends: BL1 and BL2
- 4 compute-intensive back-ends: CI1-CI4
- 1 non-critical back-end: NC

Both X and Y have 3 queues (I am thinking about using queues at this  
moment, but a single queue with message filters might work better and/or  
be more convenient. I just have not investigated the latter enough yet.  
Advice is appreciated):
- business-logic: bl
- compute-intensive: ci
- non-critical: nc

Here is the wiring. The back-ends know to which front-ends they must  
connect by explicit configuration. The back-ends will connect to the  
front-ends using the failover protocol with a single URI, so connections  
to front-ends will automatically be restored in case of problems. I will  
start a thread in the back-end for each connection to a front-end, so  
messages from multiple front-ends are consumed simultaneously:
- both BL1 and BL2 connect to X.bl and Y.bl
   - load balancing: both BL1 and BL2 consume messages and only as fast as  
they can process them
   - failover: if either BL1 or BL2 fails, the other will still handle  
messages of both front-ends
- CI1 and CI2 connect to X.ci, and CI3 and CI4 connect to Y.ci
   - load balacing: all back-ends, CI1-CI4, consume messages and only as  
fast as they can process them
   - failover: if one of them fails, the front-end from which it consumed  
messages will still have another back-end consuming messages
- NC connects to X.nc and Y.nc
   - load balancing: not necessary, NC is fast enough
   - failover: not applicable because the back-end is non-critical

If you need load balancing you automatically get failover, and vice versa.  
So if load balancing would be needed in the case of NC, then you  
automatically get failover even though that is not a requirement for that  
back-end type.

The brokers are load balanced by given each front-end its own broker  
inside the same JVM. There is no failover for brokers, because the  
assumption is that if the broker has problems, then the whole front-end  
will have problems, so the front-end won't be sending messages anyway.

For the compute-intensive back-ends I chose to have the back-ends connect  
to a single front-end to reduce the number of incoming connections of  
brokers and the number of outgoing connections of the back-end. An  
alternative solution with better load balancing in case of failure of one  
of the back-ends, would be to have CI1-CI4 connect to both X.ci and Y.ci.

I have looked at the topologies described on the ActiveMQ site, but prefer  
the one I describe above (assuming there are no problems with it) because  
it is easier to set up and very flexible.

Will this topology work? Thanks in advance for your help.

-- 
Kind regards,

Johan Stuyts