3 min read

(For more resources related to this topic, see here.)

Acknowledgements (Intermediate)

This task will examine reliable message delivery from the RabbitMQ server to a consumer.

Getting ready

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.

How to do it…

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.

  1. We pass to the {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) {

  2. When our message has been processed we call 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.

  1. Edit the consumer.js script located in the folder Message-Acknowledgement. Simply comment out the line q.shift(), which will stop the consumer from acknowledging the messages.
  2. Open a command-line console and start RabbitMQ:

    rabbitmq-server

  3. Now open a command-line console, navigate to our source code examples folder, and locate the folder 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

  4. Let’s open another command-line console and run 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.

  5. If you press Ctrl + C while on the command-line console, the consumer script is stopped, and then list the queues again you will notice the message has returned to the queue.

    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.

Summary

This article explained a reliable message delivery process in RabbitMQ using Acknowledgements. It also listed the steps that will give you acknowledegements for a messaging application using scripts in RabbitMQ.

Resources for Article :


Further resources on this subject:


Packt

Share
Published by
Packt

Recent Posts

Top life hacks for prepping for your IT certification exam

I remember deciding to pursue my first IT certification, the CompTIA A+. I had signed…

3 years ago

Learn Transformers for Natural Language Processing with Denis Rothman

Key takeaways The transformer architecture has proved to be revolutionary in outperforming the classical RNN…

3 years ago

Learning Essential Linux Commands for Navigating the Shell Effectively

Once we learn how to deploy an Ubuntu server, how to manage users, and how…

3 years ago

Clean Coding in Python with Mariano Anaya

Key-takeaways:   Clean code isn’t just a nice thing to have or a luxury in software projects; it's a necessity. If we…

3 years ago

Exploring Forms in Angular – types, benefits and differences   

While developing a web application, or setting dynamic pages and meta tags we need to deal with…

3 years ago

Gain Practical Expertise with the Latest Edition of Software Architecture with C# 9 and .NET 5

Software architecture is one of the most discussed topics in the software industry today, and…

3 years ago