[rabbitmq-discuss] Fwd: Client-connection failover workarounds (ruby)
Matthias Radestock
matthias at lshift.net
Sat Feb 6 18:42:19 GMT 2010
Peter,
Peter Fitzgibbons wrote:
> I'm thinking about how to handle client-connection failover. By this
> I mean clientA has a producerP that needs to have reliable and
> tolerant connections to rabbitA and rabbitB. This is so that if the
> connection/pid of rabbitA goes down, producerP sends it's next message
> to rabbitB with as little handling (and wall-clock time) as possible.
> [...]
> The best solution I can think of right now is to have a rabbitP on the
> same machine as producerP, which is clustered to the "real" cluster,
> so if rabbitA goes down, the built-in clustering failover will handle
> the proper interaction. My issue with this is considering how this is
> configured and maintained when the farm of servers with producerP gets
> to be 1000+. Even if this doesn't scale to the google-farm level,
> what about farm = 10, 30 ?
Having a local broker is indeed a common approach to get higher
resilience, particularly since it allows producers to offload messages
even when the connection to the main brokers is down for prolonged
periods of time, e.g. in the event the main brokers are across a WAN and
there is a WAN failure.
As you suspect, making all these brokers part of a cluster would indeed
be problematic for high node counts, even more so when going across a
WAN. Besides, RabbitMQ's clustering is really designed for scaling, not
improved reliability.
But you do not need to cluster the brokers. Instead you could stick our
experimental shovel (see
http://www.lshift.net/blog/2010/02/01/rabbitmq-shovel-message-relocation-equipment)
onto each local node and configure it to shovel messages to the main
broker pair. The shovel has built-in re-connection and failover logic
for that.
Of course having a local broker is no panacea for reliability, since
that broker itself becomes a point of failure. Whether that is a problem
depends on how high you place the reliability bar.
An alternative approachh is to make the clients themselves deal with
re-connection and failover. Check out the experimental
http://hg.rabbitmq.com/rabbitmq-java-messagepatterns/ and
http://hg.rabbitmq.com/rabbitmq-dotnet-messagepatterns/ libraries which
do that for a specific type of messaging (point-to-point, though most of
the logic should be easily ported to other types).
Regards,
Matthias
More information about the rabbitmq-discuss
mailing list