Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rabbitmq amqp - listening to ack messages from consumer

I have a producer and broker on the same machine. The producer sends messages like so:

channel = connection.createChannel();

//Create a durable queue (if not already present)
channel.queueDeclare(merchantId, true, false, false, null);

//Publish message onto the queue
channel.basicPublish("", consumerId, true, false,
    MessageProperties.MINIMAL_PERSISTENT_BASIC, "myMessage");

The consumer sits on another machine and listens to messages. It uses explicit acknowledgement like so:

while (true) {
    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
    //Handle message here  
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}   

From what I understand, the ack is meant for the broker to dequeue the message.

But how can my producer come to know about the ack that the consumer sent?

like image 495
arahant Avatar asked Dec 19 '14 20:12

arahant


People also ask

How does RabbitMQ ack work?

ack for a persistent message routed to a durable queue will be sent after persisting the message to disk. The RabbitMQ message store persists messages to disk in batches after an interval (a few hundred milliseconds) to minimise the number of fsync(2) calls, or when a queue is idle.

Does RabbitMQ support AMQP?

RabbitMQ implements version 0-9-1 of the AMQP specification in the core, with a number of extensions to the specification. RabbitMQ implements AMQP 1.0 via a plugin. However, AMQP 1.0 is a completely different protocol than AMQP 0-9-1 and hence not a suitable replacement for the latter.

What is consumer ack in RabbitMQ?

Delivery processing acknowledgements from consumers to RabbitMQ are known as acknowledgements in messaging protocols; broker acknowledgements to publishers are a protocol extension called publisher confirms. Both features build on the same idea and are inspired by TCP.

How do you consume messages from RabbitMQ?

In order to consume messages there has to be a queue. When a new consumer is added, assuming there are already messages ready in the queue, deliveries will start immediately. The target queue can be empty at the time of consumer registration. In that case first deliveries will happen when new messages are enqueued.


1 Answers

Producers and consumers normally don't interact. This is by AMQP protocol design. For example, consuming a specific message may be done a long time after it was published, and there is no sense in leaving the producer up and running for a long time. Another example is when a publisher sends one message to a broker, and due to routing logic that message gets duplicated to more than one queue, leading to ambiguity (because multiple consumers can acknowledge the same message). AMQP protocol is asynchronous (mostly), and letting the publisher know about its message being consumed just doesn't fit the AMQP async model.

There are exceptions from that, notably, RPC calls. Then the producer becomes a producer-consumer. It sends a message and then immediately waits for a reply (there is a good RabbitMQ manual - Direct reply-to related to RPC with RabbtiMQ).

In general, you can ensure that a message is delivered to a broker with Confirms (aka Publisher Acknowledgements) alongside with Dead Letter Exchanges and Alternate Exchanges. Those cover most cases under which a message can be lost from its normal flow.

like image 52
pinepain Avatar answered Sep 23 '22 22:09

pinepain