[rabbitmq-discuss] Message durability and partition tolerence
Jonathan Oliver
jonathan.s.oliver42 at gmail.com
Tue Nov 8 16:26:45 GMT 2011
Since the introduction of better clustering support and message queue
failover in v2.6, my company is starting to consider moving to RabbitMQ.
But we had a few questions about the roadmap.
We are looking to ensure that a message is only considered received by an
exchange from a producing app when at least two physical instances of
Rabbit acknowledge the receipt of the message--similar to Riak's method.
Furthermore, we are looking to ensure that a message is considered
consumed (ack'd) when when at least one physical instance receives the ack,
which may result in a message being delivered more than once. Essentially,
we'd like to propose a configuration where Rabbit can fall on the AP side
of CAP instead of the CA side.
I should mention that we're fully aware that the above scenario may cause a
message to be pushed to consumers more than once and how messages may get
out of order. In general, however, these concepts are very much a part of
message queuing system guarantees--that of *at-least-once* delivery where
order is not strictly guaranteed. If we needed *at-most-once* delivery and
strict ordering, we'd use RPC. In many regards, this is similar to the
Amazon SQS architecture with a few key differences--one of the most
important being stateful connections and "push" capabilities between the
server and connected consumers which is where Amazon's SQS offering falls
apart--that and message size restrictions.
I can see that many systems really want to ensure at-most-once delivery (or
close to it) and how the requirement to re-order messages makes things
difficult, but by relaxing the constraints (at least in some
configurations), it enables so much more. For example, if an instance of
Rabbit goes offline under the current HA configuration, when it rejoins the
cluster the queues are wiped clean. Yuck. So much for guaranteed
delivery. While under some kind of partition-tolerant configuration, the
queues wouldn't need to be cleaned. Instead, the consuming application
would be responsible for message idempotency.
At the same time, I realize that you guys might be bumping against
restrictions in the AMQP standard, for example multiple consumers receiving
copies of the message where one consumer ack's the message, while another
nack's the message. But that's something where the messaging system can't
determine the proper course of action without knowing the business context.
In that case, I would imaging it should present that nack back to the
producer as it currently does.
The bottom line in my question and proposal really has to do with message
loss. If the idea is to *not lose messages*, I can see a
partition-tolerant configuration bringing a lot to the table and where the
consuming application must be resilient to duplicate messages and ordering,
thus freeing up RabbitMQ from having to worry so much about that.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20111108/08c1f831/attachment.htm>
More information about the rabbitmq-discuss
mailing list