Eksiksiz RabbitMQ Rehberi — Özellikler, Pattern'ler ve Best Practice'ler

9 Ağustos 2026 · netologist · 18 dakika, 3709 kelime ·

AMQP temellerinden exchange tiplerine, güvenilirlik mekanizmalarına, clustering/HA’ya, mesajlaşma pattern’lerine, performans ayarlarına ve production best practice’lerine kadar derinlemesine, uygulayıcı seviyesinde bir referans.


İçindekiler

  1. Temel Kavramlar
  2. Exchange Tipleri
  3. Kuyruklar: Tipler ve Özellikler
  4. Mesaj Özellikleri ve Teslimat Semantiği
  5. Publisher Confirms ve Güvenilir Yayınlama
  6. Consumer Acknowledgment ve Prefetch (QoS)
  7. Dead Letter Exchange (DLX)
  8. TTL: Mesaj ve Kuyruk
  9. Gecikmeli (Delayed) Mesajlar
  10. Öncelikli Kuyruklar (Priority Queues)
  11. Clustering ve Yüksek Erişilebilirlik
  12. Federation ve Shovel
  13. Güvenlik
  14. Yönetim, İzleme ve Gözlemlenebilirlik
  15. Mesajlaşma Pattern’leri
  16. Connection ve Channel Yönetimi Best Practice’leri
  17. Idempotency ve Hata Yönetimi
  18. Performans Ayarlama
  19. Sık Yapılan Hatalar
  20. Hızlı Referans / Cheat Sheet

1. Temel Kavramlar

RabbitMQ, AMQP 0-9-1 protokolünü uygular (MQTT, STOMP ve AMQP 1.0 için eklentiler de mevcuttur). Temel kavramlar:

Altın kural: Producer’lar asla “bir kuyruğa” yayın yapmaz. Her zaman bir routing key ile bir exchange’e yayın yaparlar. Mesajın nereye gideceğine exchange karar verir.

Producer → Exchange → (Binding + Routing Key) → Queue → Consumer

2. Exchange Tipleri

2.1 Direct Exchange

Mesajları, binding key’i mesajın routing key’i ile tam olarak eşleşen kuyruklara yönlendirir.

Exchange: orders.direct
Binding: routing_key = "order.created" → Queue: orders.created.q
Binding: routing_key = "order.cancelled" → Queue: orders.cancelled.q

Kullanım alanı: Hedefin deterministik olduğu görev yönlendirmesi (örn. olay tipine göre yönlendirme).

2.2 Fanout Exchange

Routing key’i tamamen görmezden gelerek bağlı tüm kuyruklara yayın yapar.

Kullanım alanı: Pub/Sub — bildirimler, cache invalidation, birden fazla bağımsız servise olay yayınlama.

Exchange: notifications.fanout
→ Queue: email.service.q
→ Queue: sms.service.q
→ Queue: audit.log.q

2.3 Topic Exchange

Routing key üzerinde wildcard kullanarak pattern eşleştirmesi yapar:

Routing key formatı: <bölge>.<önem_derecesi>.<servis>

Binding: "eu.*.payments"    → "eu.error.payments" ile eşleşir
Binding: "*.critical.#"     → "us.critical.payments.timeout" ile eşleşir
Binding: "eu.#"             → "eu." ile başlayan her şeyle eşleşir

Kullanım alanı: Esnek olay yönlendirmesi — loglama sistemleri, çok boyutlu filtreleme.

2.4 Headers Exchange

Routing key yerine mesajın header özniteliklerine göre yönlendirme yapar. x-match argümanını kullanır:

{
  "x-match": "all",
  "format": "pdf",
  "type": "report"
}

Kullanım alanı: Pratikte nadiren kullanılır — routing key pattern’leri (topic) genellikle yeterlidir ve daha hızlıdır. Headers exchange’i yalnızca yönlendirme kriterleri doğal olarak bir string key’e sığmadığında kullanın.

2.5 Varsayılan (İsimsiz) Exchange

Her kuyruğun otomatik olarak, kuyruk adını routing key olarak kullanarak bağlandığı özel bir direct exchange (""). routing_key = "my_queue" ile ""‘a yayın yapmak mesajı doğrudan my_queue‘ya iletir. Basit noktadan-noktaya senaryolar için kullanışlıdır, ancak büyük sistemlerde buna aşırı bağımlı olmaktan kaçının — açık exchange’ler yönlendirme topolojisini görünür ve geliştirilebilir kılar.

2.6 Alternate Exchange (AE)

Hiçbir yere yönlendirilemeyen (eşleşen binding olmayan) mesajları almak üzere yapılandırılmış bir exchange. Sessiz mesaj kaybını önler.

rabbitmqctl set_policy AE-orders "^orders\." '{"alternate-exchange":"orders.unrouted"}' --apply-to exchanges

3. Kuyruklar: Tipler ve Özellikler

3.1 Classic Queues (Klasik Kuyruklar)

Orijinal kuyruk tipi. Tek node veri yapısıdır, artık kullanımdan kaldırılan classic mirrored queues (ha-mode politikası ile mirror edilir) aracılığıyla replike edilir. HA için yerini quorum queue’lara bırakmaktadır.

3.2 Quorum Queues (RabbitMQ 3.8+‘dan itibaren çoğu dayanıklı iş yükü için önerilir)

Raft konsensüs algoritması üzerine kuruludur. Veri güvenliği önceliklidir:

# Argümanlarla bir quorum queue tanımlama
channel.queue_declare(queue='orders.q', durable=True, arguments={'x-queue-type': 'quorum'})

3.3 Streams (RabbitMQ 3.9+)

Ekleme-yalnızca (append-only) log soyutlaması (Kafka topic’lerine benzer). Şunları destekler:

arguments={'x-queue-type': 'stream', 'x-max-length-bytes': 20_000_000_000}

Streams’i şu durumda seçin: replay, geniş fan-out veya event-sourcing benzeri semantiklere ihtiyacınız varsa. Quorum Queues’ü şu durumda seçin: güçlü güvenlik garantileriyle geleneksel work-queue semantiğine ihtiyacınız varsa. Yeni sistemlerde Classic Queue’lardan kaçının — özellikle geçici/exclusive kuyruk semantiğine veya 3.13 öncesi mesaj başına önceliğe ihtiyacınız yoksa.

3.4 Exclusive ve Auto-Delete Kuyruklar

3.5 Kuyruk Uzunluk Limitleri ve Overflow Davranışı

arguments={
  'x-max-length': 100000,
  'x-max-length-bytes': 500_000_000,
  'x-overflow': 'reject-publish'  # veya 'drop-head' (varsayılan)
}

reject-publish, kritik veriler için daha güvenlidir — en eski mesajları sessizce düşürmek yerine yeni yayınları nack’ler.


4. Mesaj Özellikleri ve Teslimat Semantiği

Her zaman bilinçli olarak ayarlanması gereken temel AMQP mesaj özellikleri:

ÖzellikAmaç
delivery_mode2 = kalıcı (kuyruk durable ise broker yeniden başlatıldığında hayatta kalır), 1 = geçici
content_typeörn. application/json — consumer’ların doğru şekilde deserialize etmesine yardımcı olur
message_idDedup/tracing için benzersiz ID
correlation_idBir isteği bir yanıta bağlar (RPC için gereklidir)
reply_toYanıtlayanın cevabı yayınlaması gereken kuyruk adı
timestampMesajın oluşturulma zamanı
expirationMesaj başına TTL, ms cinsinden (string olarak)
headersSerbest formatlı anahtar-değer metadata (tracing, versiyonlama, yönlendirme)
app_id / typeDebugging/gözlemlenebilirlik için kullanışlı

RabbitMQ’nun varsayılan teslimat garantisi “en az bir kez” (at-least-once) şeklindedir (ack’lerle birlikte) — kutudan çıktığı haliyle asla “tam olarak bir kez” (exactly-once) değildir. Consumer’ları idempotent olacak şekilde tasarlayın (bkz. §17).


5. Publisher Confirms ve Güvenilir Yayınlama

Confirm mekanizması olmadan, bir yayın sessizce başarısız olabilir (ağ kesintisi, broker persist etmeden önce çökmesi) ve bunu asla bilemezsiniz.

Publisher Confirms (confirm.select), broker’ın her yayınlanan mesajı güvenli bir şekilde işledikten sonra (durable kuyruklar için diske kaydedildiğinde veya diğerleri için yönlendirildiğinde) asenkron olarak onaylamasını sağlar.

channel.confirm_delivery()  # pika senkron yardımcı fonksiyonu

# Asenkron pattern (throughput için önerilir):
channel.confirm_select()
outstanding = {}

def on_ack(frame):
    outstanding.pop(frame.delivery_tag, None)

def on_nack(frame):
    # yeniden yayınla veya uyar — broker mesajı işleyemedi
    handle_failed_publish(frame.delivery_tag)

channel.add_on_return_callback(on_returned)  # mandatory=True ile yönlendirilemeyen mesajlar için

Önerilen best practice pattern:

  1. Confirm mekanizmasını channel başına bir kez etkinleştirin.
  2. Bekleyen (onaylanmamış) mesajları delivery_tag‘e göre bir map’te takip edin.
  3. Yönlendirilemeyen mesajları tespit etmeniz gerekiyorsa mandatory=True ile yayın yapın (bir basic.return handler’ıyla birlikte), ya da bunun yerine bir Alternate Exchange kullanın (yüksek throughput altında mesaj başına mandatory bayrağından daha ölçeklenebilirdir).
  4. Throughput için confirm’leri toplu (batch) işleyin — her mesajın ack’ini tek tek beklemeyin; birçoğunu yayınlayın, ardından ack’leri asenkron olarak takip edin.
  5. Nack veya timeout durumunda, backoff ile yeniden deneyin veya “onaylanmamış” bir denetim kuyruğuna dead-letter yapın.

Transaction’lar vs Confirms

AMQP transaction’ları (tx.select, tx.commit) mevcuttur ancak çok daha yavaştır (her transaction için senkron round-trip) — publisher confirms modern ve performanslı alternatiftir ve neredeyse her zaman tercih edilmelidir.


6. Consumer Acknowledgment ve Prefetch (QoS)

6.1 Ack Modları

6.2 Prefetch (QoS)

basic.qos(prefetch_count=N), bir consumer’ın aynı anda tutabileceği onaylanmamış mesaj sayısını sınırlar. Bu, consumer throughput’u ve adaleti için en önemli tek ayar noktasıdır.

channel.basic_qos(prefetch_count=50)

6.3 Manuel Ack Sıralaması

Ack’ler bir channel üzerindeki teslimata göre sırayla gönderilmelidir; multiple=True ile belirli bir delivery tag’e kadar toplu ack gönderebilirsiniz — ancak dikkatli olun: bu, o tag’e kadar (dahil) her şeyi ack’ler, bu yüzden bunu bir channel’ı paylaşan eşzamanlı worker’lardan koordinasyon olmadan asla yapmayın.


7. Dead Letter Exchange (DLX)

Mesajlar şu durumlarda “ölür”:

  1. requeue=False ile reddedildiğinde (basic.nack/basic.reject)
  2. TTL süresi dolduğunda
  3. Kuyruk uzunluk limiti aşıldığında (overflow reject)

Ölü mesajları bir DLX’e yönlendirmek için kuyruğu yapılandırın:

channel.queue_declare(
    queue='orders.q',
    durable=True,
    arguments={
        'x-dead-letter-exchange': 'orders.dlx',
        'x-dead-letter-routing-key': 'orders.failed'
    }
)

Standart pattern — DLX + TTL kullanarak backoff ile yeniden deneme:

orders.q  --(reddet/süresi dolsun)-->  orders.retry.dlx
                                              |
                                              v
                                   orders.retry.q (TTL=5000ms, consumer yok,
                                                    DLX geri orders.q'ya işaret eder)
                                              |
                             (TTL süresi dolduktan sonra, mesaj dead-letter olur)
                                              v
                                        orders.q  (tekrar denenir)

Bu “park yeri kuyruğu” (parking lot queue) pattern’i, herhangi bir eklentiye ihtiyaç duymadan gecikmeli yeniden deneme uygular. Header tabanlı bir yeniden deneme sayacı ekleyin (RabbitMQ tarafından otomatik olarak eklenen x-death dizisi) ve yeniden denemeleri sınırlamak ve N denemeden sonra manuel inceleme için son bir poison-message / DLQ (dead-letter queue) kuyruğuna yönlendirmek için x-death[0].count değerini inceleyin.

def handle_message(ch, method, properties, body):
    headers = properties.headers or {}
    deaths = headers.get('x-death', [])
    retry_count = deaths[0]['count'] if deaths else 0
    if retry_count >= 5:
        ch.basic_publish(exchange='orders.poison', routing_key='', body=body)
        ch.basic_ack(method.delivery_tag)
        return
    # ... işle, DLX üzerinden yeniden deneme tetiklemek için requeue=False ile nack et

Production kuyrukları için her zaman bir DLX yapılandırın. DLX’i olmayan bir kuyruk, reddedilen/süresi dolan mesajları sessizce kaybeder.


8. TTL: Mesaj ve Kuyruk

Mesaj başına TTL:

properties = pika.BasicProperties(expiration='60000')  # 60 saniye, ms cinsinden string olarak

Kuyruk başına TTL (kuyruktaki tüm mesajlara uygulanır):

arguments={'x-message-ttl': 60000}

Kuyruk TTL’i (kullanılmayan bir kuyruğu otomatik silme):

arguments={'x-expires': 1800000}  # 30 dakika kullanılmadıktan sonra kuyruğu sil

Not: hem mesaj başına hem de kuyruk başına TTL ayarlanmışsa, her mesaj için düşük olan değer kazanır. Ayrıca, classic kuyruklarda TTL süresinin dolması kuyruğun başında tembel (lazy) olarak değerlendirilir — henüz süresi dolmamış bir mesajın arkasında sıkışmış uzun ömürlü bir mesaj, başa gelene kadar dead-letter olmaz (classic kuyruk davranışı quorum/stream’den biraz farklıdır).


9. Gecikmeli (Delayed) Mesajlar

RabbitMQ’da kutudan çıktığı haliyle yerleşik bir “X dakika bekle sonra teslim et” primitifi yoktur. İki yaklaşım vardır:

9.1 Delayed Message Exchange Eklentisi (community plugin)

rabbitmq-plugins enable rabbitmq_delayed_message_exchange
channel.exchange_declare(
    exchange='delayed.exchange',
    exchange_type='x-delayed-message',
    arguments={'x-delayed-type': 'direct'}
)
properties = pika.BasicProperties(headers={'x-delay': 15000})  # 15sn gecikme

Kullanımı basittir, ancak gecikmeli mesajları içeride Mnesia’da saklar; bu da çok yüksek hacimlerde veya çok uzun gecikmelerde iyi ölçeklenmez — orta düzey kullanım için uygundur.

9.2 TTL + DLX “Park Yeri” Pattern’i (native, daha ölçeklenebilir)

§7’deki yeniden deneme pattern’iyle aynı mekanizma: x-message-ttl ayarlı ve consumer’ı olmayan bir kuyruğa yayın yapın, TTL süresi dolduğunda gerçek hedefe geri dead-letter yapılsın. Sadece core primitifleri kullandığı için yüksek ölçekli veya uzun gecikmeli senaryolarda tercih edilir.


10. Öncelikli Kuyruklar (Priority Queues)

channel.queue_declare(queue='tasks.q', arguments={'x-max-priority': 10})
properties = pika.BasicProperties(priority=8)

11. Clustering ve Yüksek Erişilebilirlik

11.1 Cluster Temelleri

11.2 HA için Quorum Queues (Önerilir)

rabbitmqctl set_policy ha-orders "^orders\." '{"x-queue-type":"quorum"}' --apply-to queues

11.3 Classic Mirrored Queues (Legacy — yeni dağıtımlarda kaçının)

ha-mode politikaları (all, exactly, nodes) ile kontrol edilir. Ağ bölünmeleri (partition) sırasında split-brain/yeniden senkronizasyon sorunlarıyla bilinir; kullanımdan kaldırılan bir yoldur — RabbitMQ ekibi bunun yerine quorum kuyrukları önerir.

11.4 Client’ları Load Balance Etme

Cluster’ın önüne bir TCP load balancer (HAProxy, cloud LB) veya client tarafında bir node listesi koyun. Herhangi bir node arızalanabileceğinden client’lar backoff ile yeniden bağlanma mantığını uygulamalıdır.

11.5 Ağ Bölünmeleri (Network Partitions)

cluster_partition_handling‘i yapılandırın:

11.6 Federation vs Clustering

Clustering = sıkı bağlantı, aynı mantıksal broker, düşük gecikmeli LAN. Veri merkezleri arası/WAN replikasyonu için, bunun yerine Federation veya Shovel kullanın (§12) — asla WAN bağlantıları üzerinden cluster kurmayın.


12. Federation ve Shovel

12.1 Federation

Exchange’leri/kuyrukları ayrı broker’lar/cluster’lar arasında, onları tek bir cluster’a birleştirmeden bağlar. Şunlar için iyidir:

rabbitmqctl set_parameter federation-upstream my-upstream \
  '{"uri":"amqp://user:pass@remote-broker","expires":3600000}'
rabbitmqctl set_policy federate-orders "^orders\." '{"federation-upstream-set":"all"}'

12.2 Shovel

Mesajları bir kaynak kuyruk/exchange’den bir hedefe taşıyan daha basit, daha açık bir “pompa” — eklenti olarak çalışır, tek seferlik migrasyonlar veya farklı RabbitMQ sürümleri dahil broker’lar arası basit köprüleme için iyidir.

rabbitmqctl set_parameter shovel my-shovel \
'{"src-uri":"amqp://source","src-queue":"orders.q",
  "dest-uri":"amqp://destination","dest-queue":"orders.q"}'

Federation vs Shovel: Federation topoloji farkındadır (exchange binding’lerini dinamik olarak yansıtır); Shovel sabit bir noktadan noktaya borudur. Basit, iyi tanımlanmış köprüler için Shovel kullanın; daha dinamik çok cluster’lı topolojiler için Federation kullanın.


13. Güvenlik

13.1 Kullanıcılar, Vhost’lar ve İzinler

Her zaman en az ayrıcalık ilkesiyle erişimi sınırlayın:

rabbitmqctl add_vhost orders-service
rabbitmqctl add_user orders_app StrongPassword!
rabbitmqctl set_permissions -p orders-service orders_app "^orders\." "^orders\." "^orders\."
# izinler: configure / write / read (regex pattern'leri)

Production’da varsayılan guest kullanıcısını asla kullanmayın — tam olarak bu nedenle varsayılan olarak localhost bağlantılarıyla sınırlıdır; bu kısıtlamayı aşmaya çalışmayın.

13.2 TLS

Loopback olmayan tüm trafik için TLS etkinleştirin:

listeners.ssl.default = 5671
ssl_options.cacertfile = /path/to/ca.pem
ssl_options.certfile   = /path/to/cert.pem
ssl_options.keyfile    = /path/to/key.pem
ssl_options.verify     = verify_peer
ssl_options.fail_if_no_peer_cert = true

13.3 Kimlik Doğrulama Backend’leri

Dahili kimlik doğrulamanın ötesinde: LDAP, OAuth 2.0 (rabbitmq_auth_backend_oauth2 üzerinden), x.509 client sertifikaları. Büyük organizasyonlarda merkezi kimlik yönetimi için OAuth2/LDAP kullanın.

13.4 Çalışma Zamanı Sıkılaştırması (Hardening)


14. Yönetim, İzleme ve Gözlemlenebilirlik

14.1 Management Eklentisi

rabbitmq-plugins enable rabbitmq_management

Kuyruklar, bağlantılar, channel’lar, exchange’ler ve politikalar için bir HTTP API ve UI sağlar (varsayılan port 15672).

14.2 Alarm Kurulması Gereken Temel Metrikler

14.3 Prometheus Entegrasyonu

rabbitmq-plugins enable rabbitmq_prometheus

Prometheus scraping için 15692 portunda metrikleri açığa çıkarır — Grafana dashboard’larıyla eşleştirin (resmi RabbitMQ Grafana dashboard’ları ekip tarafından yayınlanmaktadır).

14.4 Tracing

rabbitmq_tracing eklentisi debugging için mesaj akışını loglar — gerçek bir performans overhead’i olduğundan yalnızca geçici olarak dev/staging’de etkinleştirin.


15. Mesajlaşma Pattern’leri

15.1 Work Queue (Görev Dağıtımı / Competing Consumers)

Bir kuyruğa bağlı birden fazla consumer; RabbitMQ teslimatları round-robin ile dağıtır (prefetch’e bağlı olarak). Paralelleştirilebilir, bağımsız işler için kullanın (görsel yeniden boyutlandırma, e-posta gönderme).

15.2 Publish/Subscribe

Fanout exchange → her abone servis için bir tane olmak üzere birden fazla kuyruk. Her servis her olayın kendi kopyasını alır.

15.3 Routing (Direct Exchange)

Tam routing key eşleşmesine dayalı seçici teslimat — örn. önem derecesine göre log yönlendirmesi (error, warning, info farklı kuyruklara).

15.4 Topics

Wildcard pattern’ler kullanarak çok kriterli yönlendirme — örn. <bölge>.<servis>.<olay_tipi>.

15.5 RPC (İstek/Yanıt)

# İstek yapan
result = channel.queue_declare(queue='', exclusive=True)  # anonim callback kuyruğu
callback_queue = result.method.queue

channel.basic_publish(
    exchange='', routing_key='rpc_queue',
    properties=pika.BasicProperties(reply_to=callback_queue, correlation_id=corr_id),
    body=request
)
# callback_queue'dan tüket, correlation_id'yi eşleştir, sonra yanıtı al

Dikkat: AMQP üzerinden RPC, servisleri senkron olarak bağlar ve gecikme/karmaşıklık ekler. Mümkün olduğunda asenkron, olay güdümlü akışları tercih edin; RPC’yi gerçekten senkron ihtiyaçlar için ayırın.

15.6 Saga Pattern (Dağıtık Transaction’lar)

Dağıtık bir transaction’ı, her biri bir sonraki adımı tetikleyen bir olay yayınlayan bir dizi yerel transaction’a bölün. Başarısızlık durumunda, önceki adımları geri almak için telafi edici (compensating) olaylar yayınlayın.

OrderCreated → PaymentReserved → InventoryReserved → OrderConfirmed
                     |                    |
              (başarısızlık)      (başarısızlık)
                     v                    v
           PaymentReleased ←──── InventoryReleaseFailed

Basit akışlar için choreography (olay güdümlü, merkezi koordinatör yok) yaklaşımı, görünürlük/kontrol gerektiren karmaşık çok adımlı akışlar için orchestration (özel bir saga koordinatör servisi) yaklaşımı kullanın.

15.7 Transactional Outbox

“Çift yazma” (dual write) sorununu (DB yazımı + mesaj yayınının atomik olmaması) önlemek için, olayı iş değişikliğiyle aynı DB transaction’ında bir outbox tablosuna yazın, ardından RabbitMQ’ya yayınlamak ve outbox satırını gönderildi olarak işaretlemek için ayrı bir relay süreci (polling veya Debezium üzerinden CDC) kullanın. DB durumuyla tutarlı en az bir kez teslimat garanti eder.

15.8 Scatter-Gather

Bir isteği birden fazla servise yayınlayın (fanout), her biri paylaşılan bir correlation-takipli yanıt kuyruğuna yanıt versin; yanıtları bir timeout ile toplayın — paralel zenginleştirme/arama fan-out’u için kullanışlıdır.

15.9 Consumer’larda Circuit Breaker

Consumer’lar içindeki downstream çağrılarını (DB/HTTP) bir circuit breaker ile sarın; tekrarlanan başarısızlıkta, mesajları zorlanan bir bağımlılığı döven sonsuz bir requeue döngüsüne nack’lemek yerine tüketmeyi durdurun (iptal edin/duraklatın).


16. Connection ve Channel Yönetimi Best Practice’leri


17. Idempotency ve Hata Yönetimi

RabbitMQ, normal ack tabanlı çalışma altında en az bir kez (at-least-once) teslimat garanti eder — çoğaltmalar olacaktır (örn. işlendikten sonra ama broker’a ulaşmadan önce ack kaybolması, işlemden sonra ama ack’ten önce consumer çökmesi, ağ yeniden denemeleri). Bunun için tasarlayın:


18. Performans Ayarlama


19. Sık Yapılan Hatalar

HataNeden Zarar VerirÇözüm
Mesaj başına channel açmakBüyük overhead, bağlantı değişimi (churn)Uzun ömürlü channel’ları yeniden kullanın
Her yerde auto_ack=TrueÇökme durumunda sessiz mesaj kaybıUygun hata yönetimi ile manuel ack
DLX yapılandırılmamışReddedilen/süresi dolan mesajlar sessizce yok olurProduction kuyruklarına her zaman bir DLX ekleyin
Sınırsız prefetch (0/çok yüksek)Bir consumer mesajları biriktirir, adaletsiz dağıtım, çökmede büyük yeniden teslimat fırtınalarıPrefetch’i bilinçli olarak ayarlayın
Kritik veride confirm olmadan yayınlamakBroker/ağ hatasında sessiz veri kaybıPublisher confirms’ı etkinleştirin
RabbitMQ’yu exactly-once gibi ele almakTasarım gereği en az bir kezdir (at-least-once)Idempotent consumer’lar oluşturun
Yeni HA ihtiyaçları için classic mirrored queuesKullanımdan kaldırıldı, split-brain’e eğilimliQuorum kuyruklar kullanın
WAN üzerinde clusteringYüksek gecikme Erlang distribution’ı bozar, partition’lara neden olurBunun yerine WAN üzerinde Federation/Shovel kullanın
Kuyruk uzunluğu/TTL limiti yokTakılı bir consumer’dan sınırsız bellek/disk büyümesix-max-length, TTL, x-overflow ayarlayın
Production’da varsayılan guest kullanıcısını kullanmakGüvenlik riskiÖzel, en az ayrıcalıklı kullanıcılar + TLS
x-death yeniden deneme sayacını görmezden gelmekZehirli (poison) mesajlarda sonsuz yeniden deneme döngüleriYeniden denemeleri sınırlayın, poison kuyruğuna yönlendirin

20. Hızlı Referans / Cheat Sheet

# DLX ve TTL tabanlı yeniden deneme ile durable, quorum kuyruk
channel.queue_declare(
    queue='orders.q',
    durable=True,
    arguments={
        'x-queue-type': 'quorum',
        'x-dead-letter-exchange': 'orders.dlx',
        'x-dead-letter-routing-key': 'orders.retry'
    }
)

# Publisher: confirms + kalıcılık
channel.confirm_select()
channel.basic_publish(
    exchange='orders.direct',
    routing_key='order.created',
    body=payload,
    properties=pika.BasicProperties(
        delivery_mode=2,
        content_type='application/json',
        message_id=str(uuid4()),
        correlation_id=corr_id
    ),
    mandatory=True
)

# Consumer: manuel ack + makul prefetch
channel.basic_qos(prefetch_count=50)
channel.basic_consume(queue='orders.q', on_message_callback=handle, auto_ack=False)

Temel rabbitmqctl komutları:

rabbitmqctl list_queues name messages consumers memory
rabbitmqctl list_connections
rabbitmqctl list_channels
rabbitmqctl cluster_status
rabbitmqctl set_policy <isim> <pattern> '<tanım>' --apply-to queues
rabbitmqctl node_health_check

İleri Okuma