RabbitMQ El Kitabı

İLERİ

Quorum Queues & High Availability

Quorum Queue, mesajların birden fazla sunucuda kopyalanarak saklandığı queue tipidir. Bir sunucu çökse bile mesajlar diğerlerinde durur — veri kaybı olmaz.

Seviye: İleri — Raft consensus ve distributed systems bilgisi faydalıdır. Önce Clustering ve Node Discovery sayfasını okuyun.

📖 Teknik detay: Quorum Queue, Raft consensus algoritması kullanır. Her queue'nun bir "leader" ve birden fazla "follower" kopyası vardır. Mesaj, çoğunluğa (majority) yazıldıktan sonra onaylanır. 3 node'luk cluster'da 1 node düşse bile sistem çalışmaya devam eder.

Publisher ⭐ Leader rabbit@node1 Write + Read operations WAL → Segment → Snapshot Follower rabbit@node2 Log replication ✓ Follower rabbit@node3 Log replication ✓ publish replicate replicate ack confirm (after majority) Node Down rabbit@node2 ☠ Unreachable New Leader rabbit@node3 Election → Promoted ✓ Queue hâlâ available (2/3 = majority) Normal Operation Failure Scenario

Ne Zaman Kullan / Kullanma

Quorum Queue Kullan Classic Queue Yeterli Gerçek Hayat
Mesaj kaybı kabul edilemez Geçici/ephemeral veriler (cache invalidation) Fintech: ödeme event'leri → Quorum
Multi-node cluster (3+ node) Tek node dev ortamı SaaS: prod 3-node → Quorum, dev → Classic
Auto-failover gerekli Manual failover tolere edilir E-ticaret: Black Friday kesinti = gelir kaybı
Poison message koruması lazım Tüm mesajlar güvenli şekilde işlenebilir Marketplace: malformed JSON → delivery-limit korur
Consumer timeout kontrolü Consumer'lar hızlı ve güvenilir IoT: cihaz offline → timeout ile ack iptal

Önemli kısıt: Quorum Queue exclusive ve auto-delete desteklemez. RPC reply queue'ları veya temporary queue'lar için Classic Queue kullanmalısın.

Fault Tolerance Tablosu

Cluster Size Quorum (Majority) Tolere Edilen Kayıp Partition Safe? Öneri
1 1 0 — Sadece dev
2 2 0 Kullanmayın
3 2 1 node Production min
4 3 1 node Koşullu 3 ile aynı tolerans
5 3 2 node Yüksek HA
7 4 3 node Nadiren gerekir, perf düşer

Neden Tek Sayı? Çift sayı node'da partition oluşursa, iki eşit tarafın hiçbiri majority oluşturamaz. 4 node = 3 node ile aynı fault tolerance (1 kayıp). Kaynak israfı olmadan HA istiyorsanız 3 veya 5 kullanın.

Quorum Queue vs Classic Queue

Özellik Quorum Queue Classic Queue
Replication Raft (N replicas) Single node
Leader election Otomatik (Raft) —
Data safety Majority write guarantee Single disk write
Poison message delivery-limit (default: 20)
Consumer timeout (4.3+)
Delayed retry Native (4.3+)
Message priority 0-31 strict (4.3+) 0-255
Exclusive queue
Auto-delete
Memory kullanımı ~32 bytes/msg index + WAL Değişken
Throughput (4.3) Yüksek (optimized) Yüksek (single node)

CMR — Continuous Membership Reconciliation

CMR, quorum queue'ların otomatik olarak target group size'a büyümesini sağlar. Yeni node eklendiğinde veya bir node kalıcı olarak çıkarıldığında, CMR queue membership'i hedef değere getirmeye çalışır.

# CMR'ı aktifleştir
quorum_queue.continuous_membership_reconciliation.enabled = true
quorum_queue.continuous_membership_reconciliation.target_group_size = 3
quorum_queue.continuous_membership_reconciliation.auto_remove = true
quorum_queue.continuous_membership_reconciliation.interval = 3600000

# VEYA policy ile (daha esnek):
# rabbitmqctl set_policy cmr-policy ".*" #     '{"target-group-size": 3}' #     --apply-to "quorum_queues" --priority 0
# Queue member'larını listele
rabbitmq-queues quorum_status payment-processing

# Yeni node'a member ekle
rabbitmq-queues add_member payment-processing rabbit@node4

# Node kaldır (shrink)
rabbitmq-queues delete_member payment-processing rabbit@node2

# Tüm queue'ları yeni node'a grow et
rabbitmq-queues grow rabbit@node4 all

# Leader'ları rebalance et (restart/maintenance sonrası)
rabbitmq-queues rebalance quorum

# Belirli queue pattern'ı rebalance
rabbitmq-queues rebalance quorum --queue-pattern "orders.*"

Node Removal: Bir node'u cluster'dan kalıcı olarak çıkardığınızda (forget_cluster_node), o node üzerindeki tüm quorum queue replica'ları otomatik silinir. Önce rabbitmq-queues shrink ile member'ları başka node'lara taşıyın.

Gerçek hayat senaryosu: SaaS order processing: 5-node cluster, quorum size=3. 2 node aynı anda çökse bile queue'lar available kalır. CMR aktif: yeni node eklendiğinde 10 saniye içinde reconciliation tetiklenir ve under-replicated queue'lar otomatik büyütülür. Ops team müdahalesi gereksiz.

Node Kaybı Senaryoları

Senaryo 3-node cluster (quorum=2) 5-node cluster (quorum=3) Yapılacak
1 node down Available Available Leader re-election (<10sn), müdahale gerekmez
2 node down Unavailable Available 3-node: acil müdahale! 5-node: monotor et
Leader down New leader elected New leader elected Publisher confirm timeout olabilir, retry yeterli
Network partition Partition handling policy'ye bağlı Minority side unavailable pause_minority önerilir
Disk full (1 node) Diğerleri çalışır Diğerleri çalışır Alarm tetiklenir, publish durur (o node'da)

Rollback Adımları (Node Kaybı):

  1. rabbitmq-diagnostics cluster_status ile durumu doğrula
  2. Down node recover edilebilir mi kontrol et (systemctl start rabbitmq-server)
  3. Recover edilemezse: rabbitmqctl forget_cluster_node rabbit@dead-node
  4. Under-replicated queue'ları büyüt: rabbitmq-queues grow rabbit@new-node all
  5. Leader'ları rebalance et: rabbitmq-queues rebalance quorum

Cloud Managed RabbitMQ Seçenekleri

Platform Servis Max Version Quorum Queue Streams Not
AWS Amazon MQ for RabbitMQ 3.13.x Single/multi-AZ, otomatik failover
CloudAMQP Dedicated/Shared 4.x En güncel, Tiger plan ile dedicated
Azure Tanzu RabbitMQ (Marketplace) 3.13.x Bitnami Helm chart tabanlı
Self-hosted K8s RabbitMQ Cluster Operator 4.x En esnek, ops yükü sizde

AWS Amazon MQ kısıtlamaları: Erlang cookie erişimi yok, plugin kurulumu sınırlı, max instance size = mq.m5.4xlarge. Streams desteği henüz yok. Quorum queue kullanılabilir ama cluster resize işlemi manuel ticket gerektirir.

Gerçek hayat senaryosu: Fintech startup — hızlı MVP için CloudAMQP Tiger plan ile başladı (tam kontrol, güncel versiyon). Traffic 10x büyüdüğünde maliyet nedeniyle K8s Cluster Operator'a geçiş yaptı. Geçiş sırasında Shovel ile zero-downtime migration uygulandı.