This task will examine reliable message delivery from the RabbitMQ server to a consumer.
If a consumer takes a message/order from our queue and the consumer dies, our unprocessed message/order will die with it.
In order to make sure a message is never lost, RabbitMQ supports message acknowledgments or acks. When a consumer has received and processed a message, an acknowledgment is sent to RabbitMQ from the consumer informing RabbitMQ that it is free to delete the message. If a consumer dies without sending an acknowledgment, RabbitMQ will redeliver it to another consumer.
Let's navigate to our source code examples folder and locate the folder Message-Acknowledgement
. Take a look at the consumer.js script and examine the changes we have made to support acks.
{ack:true}
option to the q.subscribe
function, which tells the queue that messages should be acknowledged before being removed:q.subscribe({ack:true}, function(message) {
q.shift
, which informs RabbitMQ that the message has been processed, and it can now be removed from the queue:q.shift();
You can also use the prefetchCount
option to increase the window of how many messages the server will send you before you need to send an acknowledgement. {ack:true, prefetchCount:1}
is the default and will only send you one message before you acknowledge. Setting prefetchCount
to 0
will make that window unlimited. A low value will impact performance, so it may be worth considering a higher value.
Let's demonstrate this concept.
Message-Acknowledgement
. Simply comment out the line q.shift()
, which will stop the consumer from acknowledging the messages.rabbitmq-server
Message-Acknowledgement
. Execute the following command:Message-Acknowledgement> node producer
Let the producer create several message/orders; press Ctrl + C while on the command-line console to stop the producer creating orders. Now execute the following to begin consuming messages:
Message-Acknowledgement> node consumer
list_queues
:rabbitmqctl list_queues messages_ready messages_unacknowledged
The response should display our shop queue; details include the name, the number of messages ready to be processed, and one message which has not been acknowledged.
Listing queues ... shop.queue 9 1 ...done.
Listing queues ... shop.queue 10 0 ...done.
If you edit the change we made to consumer.js
script and re-run these steps, the application will work correctly, consuming messages one at a time and sending an acknowledgment to RabbitMQ when each message has been processed.
18.224.30.19