2. Durability
What it is
Durability means the queue itself will survive a broker restart.
- If a queue is not durable → it disappears when RabbitMQ restarts.
- If a queue is durable → it will be recreated after restart.
Example
Goal: Ensure the infrastructure (exchange and queue) survives a broker restart.
// durability_example.go package main import ( "log" amqp "github.com/rabbitmq/amqp091-go" ) func mustConn() *amqp.Connection { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Fatal(err) } return conn } func main() { conn := mustConn() defer conn.Close() ch, err := conn.Channel() if err != nil { log.Fatal(err) } defer ch.Close() // Durable direct exchange if err := ch.ExchangeDeclare( "orders_ex", "direct", true, // durable false, // autoDelete false, // internal false, // noWait nil, ); err != nil { log.Fatal(err) } // Durable queue q, err := ch.QueueDeclare( "orders_queue_durable", true, // durable false, // autoDelete false, // exclusive false, // noWait nil, ) if err != nil { log.Fatal(err) } // Bind queue to exchange with a routing key if err := ch.QueueBind(q.Name, "order.created", "orders_ex", false, nil); err != nil { log.Fatal(err) } // Publish (message persistence is not the focus here) if err := ch.Publish( "orders_ex", "order.created", false, false, amqp.Publishing{Body: []byte("Order #123 created")}, ); err != nil { log.Fatal(err) } log.Println("published to a durable exchange/queue (infra survives restarts)") }
Note: Durability ensures the exchange/queue definitions persist. To persist messages, see the next example.
How to enable
When declaring a queue, set it as durable = true.
Category: RabbitMQ