Fictional female specialist in a generated RabbitMQ quorum queue and acknowledgement teaching scene.

WIUNIX ACADEMY

RabbitMQ quorum queues: confirms, redelivery and idempotent effects

Reproduce the commit-before-ACK gap with one synthetic durable effect, handle unroutable publishes and inspect real queue quorum.

Advanced35 min readUpdated
Make this guide yours

YOUR SYSTEM. YOUR STEPS.

Where are you working?

Choose your OS and version. The prerequisites, commands and troubleshooting follow your environment.

Debian 12 — existing installation checksReviewed against official documentation ·

USE YOUR OWN VALUES

Configure this tutorial

Set the example values for your environment; related explanations and copy panels update together. Never enter passwords, private keys or tokens. Values stay in this tab and are not sent to the server or share links. Check actual DNS, certificates and network policy before running commands.

Different IP addresses, domains or ports? Open the settings below, change the values and select “Apply to tutorial”, then copy the updated commands.

Set values for my environment8 editable values

THE OUTCOME

What will you have at the end?

Reproduce the commit-before-ACK gap with one synthetic durable effect, handle unroutable publishes and inspect real queue quorum.

Supported operating systems and versions

Documented paths for Ubuntu, Debian and Red Hat families with preinstalled compatible products/clients. The first step states each branch’s limits. Service commands were not executed during authoring.

Before you begin

  • Existing authorized service and protected client authentication; use the isolated fixture scope specified below.

Two confirmations, two different responsibilities

Publisher confirms describe broker acceptance; consumer acknowledgements describe delivery processing on the consumer channel. Neither proves the other. For a routable quorum queue, acceptance involves a replica quorum; an unroutable publish can still receive a publisher ACK. This guide demonstrates mandatory-return handling and the crash gap after a synthetic business commit but before consumer ACK. It is not an exactly-once promise.

Use a disposable vhost on an existing healthy cluster

Use an existing maintained RabbitMQ4.x three-node staging cluster, approved private TLS listener, trusted CA and a dedicated vhost/user. Provision Pika1.3+ on a test client beforehand. This article does not install brokers, change cluster membership, stop nodes or test a network partition. Quorum queues need a majority of their actual members; three cluster nodes alone do not prove three queue replicas.

Keep one stable message identity across uncertainty

Set public endpoint, vhost, brand-new queue, probe ID and a new private lab root. The endpoint must be covered by the trusted certificate; do not disable hostname verification. Credentials are entered only through a private terminal prompt. Browser values stay in this tab and copy panels update only after Apply. A retry of the same logical operation must retain its message ID; changing IDs to escape uncertainty defeats deduplication.

01

LET’S BUILD

Verify the installed tools and the host on which commands run

The Python/Pika client and the three-node RabbitMQ 4.x lab must already exist. RabbitMQ documents Debian 12/13, Ubuntu 26.04 and current RHEL/Rocky/Alma 9/10 broker installation paths. Ubuntu 26.10 is not listed as a supported broker OS: use that selection only for a separately provisioned compatible Python client, and run node CLI panels on the existing supported broker nodes. No broker package, Erlang repository or node is created here. On all broker families, rabbitmq-diagnostics and rabbitmq-queues use the broker account’s existing cookie access; do not copy that credential to the client. The private CA example changes from /etc/ssl/certs/academy-rabbitmq-ca.pem to /etc/pki/tls/certs/academy-rabbitmq-ca.pem for the RHEL client; it must be supplied by the lab administrator.

These are documented command paths, not executed compatibility tests. Read /etc/os-release and verify the exact product/version before continuing. Existing accounts, approved network access and protected credentials are prerequisites. Do not restart existing services to provision tools, initialize a database, open a firewall port or alter a system Python installation to make this exercise run.

The application Python environment must already contain a compatible dependency. RHEL 9 defaults to Python 3.9 and RHEL 10 to 3.12; verify the printed interpreter and library versions. This page does not install pip packages into system Python.

bash

Approved administration client; node-specific checks only on the existing node

cat /etc/os-release
id
python3 --version
python3 -c "import ssl,sqlite3,pika; print(pika.__version__); print(ssl.OPENSSL_VERSION); print(sqlite3.sqlite_version)"
test -r "/etc/ssl/certs/academy-rabbitmq-ca.pem"
How do I know it worked?

The OS, tool path and version match the selected procedure; stop before data changes if they do not.

02

LET’S BUILD

Inspect health and existing queue names

Run as the existing authorized RabbitMQ OS administrator on a staging node, using its protected cookie. Never put the cookie in command arguments. Confirm all three nodes are healthy and the selected queue name is absent in the dedicated vhost. Queue names and counts can be sensitive; retain output privately. No force_boot, reset, purge or member removal belongs in this exercise.

bash

Isolated three-node RabbitMQ staging cluster

rabbitmq-diagnostics check_running
rabbitmq-diagnostics cluster_status
rabbitmqctl list_queues -p 'academy_lab' name type durable messages_ready messages_unacknowledged consumers
How do I know it worked?

Healthy staging membership and an unused queue name are recorded.

03

LET’S BUILD

Create a new private fixture directory

Run as the test-client account under an existing private writable parent. An existing root or symlink must abort. The supplied default assumes the parent belongs to this test account; choose an appropriate private lab location rather than changing shared-directory permissions. Only the synthetic SQLite ledger and this script will be written here.

bash

Provisioned staging client with Pika1.3+

test ! -e '/home/academy/rabbitmq-probe-20261028' && test ! -L '/home/academy/rabbitmq-probe-20261028' || exit 1
(umask 077; mkdir -- '/home/academy/rabbitmq-probe-20261028') || exit 1
nano '/home/academy/rabbitmq-probe-20261028/confirm-ack-probe.py'
How do I know it worked?

A private new directory and editor are ready.

Explore all tutorials ↗