Skip to content

Widhian Bramantya

coding is an art form

Menu
  • About Me
Menu
rabbitmq

Reliable Messaging with RabbitMQ: Acknowledgments, Durability, and Persistence

Posted on September 8, 2025September 8, 2025 by admin

One of the main reasons people use RabbitMQ is reliability. In many systems, losing a message is not acceptable. Imagine if an order is placed in an e-commerce system but disappears before the payment service sees it, that would be a big problem.

RabbitMQ offers three important features to ensure reliable messaging: Acknowledgments, Durability, and Persistence. Let’s understand each of them.

1. Acknowledgments (ACKs)

What it is

Acknowledgment means the consumer tells RabbitMQ that it has received and processed a message successfully.

  • If the consumer sends back an ACK → RabbitMQ can safely delete the message from the queue.
  • If the consumer does not send ACK (because it crashed or disconnected) → RabbitMQ will re-send the message to another consumer.

Example

Goal: Consumer uses manual ACK. On success → Ack; on failure → Nack(requeue=true) so the message is re-delivered.

Consumer:

// ACK EXAMPLE: manual ack + retry on error
conn := mustConn(); defer conn.Close()
ch, err := conn.Channel()
if err != nil { log.Fatal(err) }
defer ch.Close()

// declare a queue (durability optional here; focus: ACK)
_, err = ch.QueueDeclare("orders_queue_ack", true, false, false, false, nil)
if err != nil { log.Fatal(err) }

// fair dispatch: 1 message at a time
if err := ch.Qos(1, 0, false); err != nil { log.Fatal(err) }

msgs, err := ch.Consume("orders_queue_ack", "", false, false, false, false, nil)
if err != nil { log.Fatal(err) }

for d := range msgs {
	log.Printf("process: %s", d.Body)
	// simulate work
	if string(d.Body) == "fail" {
		// negative ack -> requeue for retry
		_ = d.Nack(false, true) // multiple=false, requeue=true
		continue
	}
	time.Sleep(500 * time.Millisecond)
	_ = d.Ack(false) // confirm processed
}

Options

  • Auto ACK: RabbitMQ deletes the message immediately after delivery (less safe).
  • Manual ACK: The consumer decides when to send ACK (recommended for reliability).
See also  RabbitMQ Performance Tuning: Optimizing Throughput and Latency
Pages: 1 2 3
Category: RabbitMQ

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Linkedin

Widhian Bramantya

Recent Posts

  • Log Management at Scale: Integrating Elasticsearch with Beats, Logstash, and Kibana
  • Index Lifecycle Management (ILM) in Elasticsearch: Automatic Data Control Made Simple
  • Blue-Green Deployment in Elasticsearch: Safe Reindexing and Zero-Downtime Upgrades
  • Maintaining Super Large Datasets in Elasticsearch
  • Elasticsearch Best Practices for Beginners
  • Implementing the Outbox Pattern with Debezium
  • Production-Grade Debezium Connector with Kafka (Postgres Outbox Example – E-Commerce Orders)
  • Connecting Debezium with Kafka for Real-Time Streaming
  • Debezium Architecture – How It Works and Core Components
  • What is Debezium? – An Introduction to Change Data Capture
  • Offset Management and Consumer Groups in Kafka
  • Partitions, Replication, and Fault Tolerance in Kafka
  • Delivery Semantics in Kafka: At Most Once, At Least Once, Exactly Once
  • Producers and Consumers: How Data Flows in Kafka
  • Kafka Architecture Explained: Brokers, Topics, Partitions, and Offsets
  • Getting Started with Apache Kafka: Core Concepts and Use Cases
  • Security Best Practices for RabbitMQ in Production
  • Understanding RabbitMQ Virtual Hosts (vhosts) and Their Uses
  • RabbitMQ Performance Tuning: Optimizing Throughput and Latency
  • High Availability in RabbitMQ: Clustering and Mirrored Queues Explained

Recent Comments

  1. Playing with VPC AWS (Part 2) – Widhian's Blog on Playing with VPC AWS (Part 1): VPC, Subnet, Internet Gateway, Route Table, NAT, and Security Group
  2. Basic Concept of ElasticSearch (Part 3): Translog, Flush, and Refresh – Widhian's Blog on Basic Concept of ElasticSearch (Part 1): Introduction
  3. Basic Concept of ElasticSearch (Part 2): Architectural Perspective – Widhian's Blog on Basic Concept of ElasticSearch (Part 3): Translog, Flush, and Refresh
  4. Basic Concept of ElasticSearch (Part 3): Translog, Flush, and Refresh – Widhian's Blog on Basic Concept of ElasticSearch (Part 2): Architectural Perspective
  5. Basic Concept of ElasticSearch (Part 1): Introduction – Widhian's Blog on Basic Concept of ElasticSearch (Part 2): Architectural Perspective

Archives

  • October 2025
  • September 2025
  • August 2025
  • November 2021
  • October 2021
  • August 2021
  • July 2021
  • June 2021
  • March 2021
  • January 2021

Categories

  • Debezium
  • Devops
  • ElasticSearch
  • Golang
  • Kafka
  • Lua
  • NATS
  • Programming
  • RabbitMQ
  • Redis
  • VPC
© 2025 Widhian Bramantya | Powered by Minimalist Blog WordPress Theme