[zeromq-dev] Load balancing REQ/REP sockets

Martin Sustrik sustrik at 250bpm.com
Thu Mar 18 08:41:15 CET 2010


Hi Brian,

>> The whole XREQ/XREP business is still messy. If you absolutely need it at
>> the moment you can use XREQ to connect and load-balance messages to mutliple
>> REPs. That way you'll get what you need without a need to do any special
>> processing on the REP side.
> 
> I have tried the XREQ -> multiple REP socket topology.  The requests
> are load balanced to the REP sockets and there can be multiple
> requests in the air at a time.  BUT, the notion of load balancing is a
> bit odd.  The load balancing logic is here:
> 
> http://github.com/sustrik/zeromq2/blob/master/src/lb.cpp#L90
> 
> The idea is that the next send will happen on the current+1 active
> pipe.  Basically, this round-robins the requests to the different REP
> sockets.  But, in my mind, this strategy is not a completely useful
> load balancing.  Here is why.  Some requests may take longer/shorter
> for the REP socket to process.  With the current approach, a REP
> socket that handles a very short request, will have to sit there doing
> nothing until its turn comes again.  Likewise, a REP socket that gets
> a very time consuming request will continue to get new requests,
> though it is busy.
> 
> A more useful and dynamic load balancing approach would be would be
> the following:
> 
> * Look at the current + 1 pipe.  If it is not servicing a request, use it.
> * If the current + 1 pipe is busy, see if the current + 2 pipe is
> servicing a request.  If not use it.
> * Continue through the active pipes.  If all are busy, use the current
> + 1 anyways.
> 
> Is there a way of telling if a pipe is servicing a request?  Would it
> make sense to implement this?  This more dynamic load balancing would
> be incredibly useful.

Yes. The meachism intended for this kind of thing is "queue limits" 
mechanism recently ported from 0MQ/1.0.

You can set ZMQ_HWM socket option on a socket, specifying max number of 
messages it can hold. Once the limit is reached for specific connection 
it stops accepting new messages and load balancing skips it in the 
round-robin.

However, the number of requests "on the fly" can be pretty high. There 
can be messages in the sender's queue, in secder's TCP tx window, on the 
network (queue on a switch etc.), in receiver's rx window and in 
receiver's queue.

What you are speaking about is making it work in lock-step fashion, i.e. 
no new message is sent until the reply is received. This should work on 
a REQ socket. If it does not, it should be fixed.

With XREQ socket the situation is a bit more complex. The user can send 
many requests without waiting for a reply. Some of the requests are 
routed through a single connection. At the end of the connection there 
may be another load-balancer, such as zmq_queue. If it worked in 
lock-step fashion. The second load-balancer would be completely useless 
as there would be at most one request processed at a time.

Thoughts?
Martin



More information about the zeromq-dev mailing list