[zeromq-dev] Load Balancing/Distributing/Queuing Algos: A Discussion

Stefan Sandberg keffo.sandberg at gmail.com
Mon Aug 23 11:50:55 CEST 2010

I'd like to suggest something inbetween...

Currently zmq does loadbalancing with the assumption that everything 
connected is of equal quality,
currently just round-robin'izes over that set equally, which only ever 
really makes if you have a rack of identical hardware.

What I'd like is a generic 'choice' device, which will continually rate 
all sockets based on stuff that zmq can
already figure out behind the scenes, like latency/throughput/idletime 
etc etc..

Ie, keep a list of connections, continually try to rate them based on 
their lowlevel behaviour, and then let the
choice-device iterate over a sorted set..
It would involve sorting obviously, but a very well tuned lockless 
priority-queue implementation,
and a customizable update-rate would bring the sorting overhead to a 
minimum, imo.

The default behaviour could simply be the current round-robin, or a more 
fancy randomized set etc,
since they just set weights on each client connection.

Now the nifty bit would be a simple api function to offset the low-level 
socket heuristics already provided by zmq,
with your own custom stuff, like offset a connection by worker cpu/ram etc.

So to summarize, zmq tries to prioritize based on how it's own, 
low-level, sockets are behaving,
but each connection's internal 'worth' can be offset with an api 
function at will.

Just thoughts!

On 2010-08-17 13:35, Pieter Hintjens wrote:
> On Tue, Aug 17, 2010 at 12:57 PM, Peter Alexander<vel.accel at gmail.com>  wrote:
>> Hi Pieter and thanks for your reply to this question in the other thread. I
>> moved it here to see if we could all discuss this some more and come to some
>> possible conclusion and/or road-map.
>> I feel it's important to, in some way, make a selection of
>> balancing/distributing algorithms an optional flag which could maybe part of
>> the flag set in zmq_setsockopts().
> Discussion is always good.  I see two possible types of distribution algorithm:
> * Stateless distribution, which works with no knowledge of the state
> of the workers.  We currently have round-robin but random scatter
> could be an alternative.  This could be trivially added as a socket
> option on REQ/XREQ and PUSH.
> * Stateful distribution, which requires data back from workers to make
> an informed choice.  This cannot work with PUSH without significant
> changes.  It can work with REQ/REP if we use the REQ to return state.
> The service (REP side) can then distribute work to the client workers
> (REQ side) based on any algorithm it likes.  I'd assume (but need to
> try) that with XREQ/XREP and identities, it's 100% customizable.
>> Using other mechanisms to overcome the built in round-robin, for example,
>> defeats the efficiency of 0mq and therefore it needs to be built-in, imo.
> Not really... so long as you're not trying to distribute over multiple
> sockets, it's fine.
> The other idea is to wait for policy/transport separation
> (http://www.zeromq.org/docs:3_0) and then define your own socket types
> with specific distribution algorithms.
> -
> Pieter Hintjens
> iMatix - www.imatix.com
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev

More information about the zeromq-dev mailing list