Consumer Acknowledgement & Publisher Confirms
A publisher consumer flow will look like the following
- Publisher App
- Connection & Channel
- Rabbit Node (which is one server instance inside the Rabbit Broker)
- Exchange
- Queue
- Connection & Channel
- Consumer App
Publisher Confirms
When the publisher app confirms with the rabbit node if message has been received.
TODO
Consumer Acknowledgement
When the consumer confirms with the rabbit node the the message has been successfully processed.
Messages when initially received are considered unacknowledged; when you ack or nack a message you are saying “I have finished processing this, respond accordingly”.
Delivery Tags
A tag received by the consumer, to identify the message.
Delivery tags are scoped per channel, so when acknowledging a message you must use the same channel with that delivery tag.
Consumer Acknowledgement Modes
basic.ack- positive acknowledgement - message can be deleted
basic.nack- negative acknowledgement - same as reject, but can be used for bulk reject
basic.reject- negative acknowledgement - message can be deleted, and will be requeued or dead-lettered or discarded based on your setup
If in fire-and-forget mode, messages are deleted upon receival by client, and are immediately removed. This is an unsafe mode.
Positive Acknowledgement
This example shows how to ack.
Note: that auto ack is false, so you explicity determine if something was acknowledged or not.
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.ReceivedAsync += async (_, eventArgs) =>
{
var body = eventArgs.Body.ToArray();
// Positively acknowledge a single delivery.
// RabbitMQ can now consider this delivery handled and discard the message.
await channel.BasicAckAsync(
deliveryTag: eventArgs.DeliveryTag,
multiple: false);
};
await channel.BasicConsumeAsync(
queue: queueName,
autoAck: false,
consumer: consumer);Negative Acknowledgement & Requeue
When requeue is set to:
true- the message will be requeued, and placed in its current position in the queue (if possible)
false- it will be dead lettered
- nothing - it will be disguarded
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.ReceivedAsync += async (_, eventArgs) =>
{
var body = eventArgs.Body.ToArray();
// Requeue the delivery.
await channel.BasicRejectAsync(
deliveryTag: eventArgs.DeliveryTag,
requeue: true,
multiple: false);
};
await channel.BasicConsumeAsync(
queue: queueName,
autoAck: false,
consumer: consumer);Prefetch
Determines how many unacknowledged messages are allowed per channel.
0 means no limit, this can lead to a heap overflow.