[rabbitmq-discuss] [ANNOUNCEMENT] Introducing Lyra: A High Availability RabbitMQ Client
Matthias Radestock
matthias at rabbitmq.com
Sat Nov 2 10:52:57 GMT 2013
Jonathan,
On 02/11/13 03:59, Jonathan Halterman wrote:
> Another approach suggested by Brett - this one seems pretty sound. Start
> by tracking the max delivery tag for a channel. If a channel is closed
> and recovered, we increment subsequent delivery tags by the max tag we
> observed for the previous channel. When the user acks/nacks/rejects a
> delivery tag, we decrement by the max tag. If the decremented value is
> <= 0, then we know the delivery tag is for a previously closed channel.
> [...]
> What do you think of this approach?
That's a pretty neat idea. I was thinking of using the upper bits of the
delivery tag to indicate the version, but that uses up the delivery tag
range too quickly. Brett's idea is much better.
I can see just one problem with it: when an application uses multi-ack
(http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.ack.multiple)
and the delivery_tag is for a new message, then only new messages, not
old ones, are acked, which may surprise the app when it later on gets
the same old messages redelivered.
OTOH that really is a more general issue with automatic recovery.
Without recovery, an application can assume that it will not see a
message twice on the same channel. With recovery that assumption no
longer holds. Now, one would hope few apps rely on the former, so I
reckon as long as this potentially breaking behaviour is documented
prominently then it's not an issue.
Matthias.
More information about the rabbitmq-discuss
mailing list