Consumer Acknowledgement & Publisher Confirms

Consumer Acknowledgements and Publisher Confirms | RabbitMQ
<!--
https://www.rabbitmq.com/docs/confirms

A publisher consumer flow will look like the following

  1. Publisher App
  1. Connection & Channel
  1. Rabbit Node (which is one server instance inside the Rabbit Broker)
    1. Exchange
    1. Queue
  1. Connection & Channel
  1. 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

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:

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.