RRabbitMQ Handbook

İLERİ

Federation & Shovel (Multi-DC)

Birden fazla datacenter'ın (İstanbul + Frankfurt gibi) birbiriyle mesaj paylaşması gerektiğinde ne yaparsın? RabbitMQ cluster'ı farklı şehirler arası çalışamaz (ağ gecikmesine dayanamaz).

Seviye: İleri — Multi-DC mimari bilgisi ve network topolojisi deneyimi gerektirir.

📖 Teknik detay: Clustering LAN-only'dir. WAN için: Federation (exchange/queue seviyesinde çoğaltma) veya Shovel (queue→queue tek yönlü aktarım) kullanılır.

DC-1 (Europe) Cluster (3 nodes) orders exchange orders queue Federation Link Upstream DC-2 (US-East) Cluster (3 nodes) orders exchange orders queue Local consumers Downstream WAN (AMQP/TLS) Asenkron, tolerates disconnection

Federation vs Shovel

Özellik Federation Shovel
Seviye Exchange veya Queue Queue-to-queue (veya exchange)
Yön Pull (downstream, upstream'den çeker) Push (source'dan destination'a iter)
Topology Declarative (policy-based) Explicit (per-shovel config)
Cluster-aware Failover built-in Reconnect built-in
Use case Multi-DC event distribution, hierarchical topology Basit queue forwarding, migration
Complexity Orta (policy + upstream tanımı) Düşük (source + destination URI)
Loop prevention Built-in (max-hops) Manuel yönetilmeli

Ne Zaman Kullan

Senaryo Çözüm Neden
Multi-DC event replication Federation (Exchange) Her DC'de local consumer, upstream'den event pull
Active-active multi-region Federation (bidirectional) Her site publish + consume, loop prevention ile
Queue migration (cluster arası) Shovel Basit A→B forwarding, geçici kullanım
Farklı vhost'lar arası mesaj taşıma Shovel veya Federation Aynı cluster içi bile olabilir
Aynı LAN, HA gereksinimi Clustering + Quorum Federation/Shovel gereksiz overhead
# 1. Federation plugin aktifleştir (her node'da)
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management

# 2. Upstream tanımla (downstream cluster'da çalıştır)
rabbitmqctl set_parameter federation-upstream dc1-upstream     '{"uri":"amqps://federation-user:[email protected]:5671?cacertfile=/certs/ca.pem&certfile=/certs/client.pem&keyfile=/certs/client-key.pem","expires":3600000,"reconnect-delay":5}'

# 3. Policy ile federation'ı aktifleştir
rabbitmqctl set_policy federate-orders     "^orders."     '{"federation-upstream-set":"all"}'     --apply-to exchanges     --priority 10

# 4. Federation link durumunu kontrol et
rabbitmqctl federation_status
# Dynamic Shovel tanımla
rabbitmqctl set_parameter shovel migrate-orders     '{"src-protocol":"amqp091","src-uri":"amqp://oldcluster.internal","src-queue":"legacy-orders","dest-protocol":"amqp091","dest-uri":"amqp://newcluster.internal","dest-queue":"orders-v2","reconnect-delay":5,"ack-mode":"on-confirm"}'

# Shovel durumunu kontrol et
rabbitmqctl shovel_status

# Shovel'ı kaldır
rabbitmqctl clear_parameter shovel migrate-orders

Federation ≠ Clustering: Federation asenkron çalışır, strong consistency garanti etmez. Aynı mesaj birden fazla DC'de bulunabilir (eventual consistency). Ordering garantisi yoktur. Business logic'in buna uygun olması gerekir.

Gerçek hayat senaryosu: Multi-region e-ticaret: Europe DC (primary) + US-East DC (secondary). Order event'leri Europe'da publish edilir. US-East DC federation ile bu event'leri pull eder ve local analytics/recommendation servislerini besler. Europe çökerse US-East cached data ile read-only devam eder.