RabbitMQ ile mesaj kuyruğu kurma ve işletme rehberi
RabbitMQ ile mesaj kuyruğu kurulumu: exchange türleri, onay ve dayanıklılık ayarları, yeniden deneme, akış kontrolü ve küme işletiminin adım adım anlatımı.
RabbitMQ nedir, mesaj kuyruğu neden kullanılır?
RabbitMQ, uygulamalar arasında mesaj taşıyan açık kaynaklı bir mesaj aracısıdır (message broker). Bir uygulama (üretici, producer) mesajı aracıya bırakır; aracı mesajı saklar ve ilgili tüketiciye (consumer) iletir. Böylece taraflar birbirini doğrudan çağırmak zorunda kalmaz: biri yavaşladığında ya da geçici olarak kapandığında diğeri etkilenmez, mesajlar kuyrukta bekler.
Mesaj kuyruğu en çok şu durumlarda işe yarar: • Yavaş ya da ağır işlerin arka plana alınması: e-posta gönderimi, rapor üretimi, görsel işleme. • Ani yük dalgalanmalarının yumuşatılması: yoğun anda gelen istekler kuyrukta birikir, tüketiciler kendi hızında işler. • Servislerin birbirinden ayrılması: sipariş servisi, ödeme ve bildirim servislerini tek tek çağırmak yerine bir olay yayınlar. • Hata toleransı: tüketici düşerse mesaj kaybolmaz, geri geldiğinde işlenir.
Aynı zamanda bedeli vardır: sistem dağıtık hale gelir, mesaj sırası, tekrar teslim ve hata durumları üzerine düşünmek gerekir. Kuyruk, her sorunun cevabı değildir; senkron cevabın gerçekten gerektiği yerlerde doğrudan çağrı daha uygundur.
Temel kavramlar: exchange, kuyruk ve binding
RabbitMQ'yu anlamanın en kısa yolu, üreticinin mesajı doğrudan kuyruğa göndermediğini kavramaktır. Mesaj önce bir exchange'e gider; exchange, bağlantı kuralları (binding) ve yönlendirme anahtarına (routing key) bakarak mesajı bir ya da daha fazla kuyruğa dağıtır. Tüketici ise kuyruktan okur.
Exchange türleri yönlendirme davranışını belirler: • Direct: Mesajın yönlendirme anahtarı, binding anahtarıyla tam eşleşen kuyruklara gider. Belirli bir iş türünü belirli kuyruğa yollamak için uygundur. • Fanout: Anahtara bakmadan bağlı tüm kuyruklara kopyalar. Yayın (broadcast) senaryoları için kullanılır. • Topic: Anahtar, desenle eşleştirilir; örneğin bir bölgenin tüm siparişlerini ya da tüm hata günlüklerini tek desenle yakalayabilirsiniz. • Headers: Yönlendirme anahtarı yerine mesaj başlıklarındaki değerlere bakar.
Hiçbir bağlantıyla eşleşmeyen mesaj, ayara göre ya düşürülür ya da üreticiye geri döndürülür. Bu davranışı bilmeden kurulan sistemlerde mesajlar sessizce kaybolur; kurulumun ilk testlerinde bilinçli olarak eşleşmeyen bir mesaj göndererek davranışı gözlemlemek iyi bir alışkanlıktır.
İlk kurulum: adım adım ilerleme
Öğrenmek için yerel bir ortam yeterlidir. Sıra şöyledir: • Aracıyı yerel makinede ya da konteynerde çalıştırın ve yönetim arayüzünü açın. Arayüzden exchange, kuyruk ve bağlantıları canlı görebilirsiniz. • Seçtiğiniz dilin istemci kütüphanesiyle basit bir üretici ve tüketici yazın: üretici bir kuyruğa mesaj bıraksın, tüketici okuyup ekrana yazsın. • Direct exchange tanımlayıp farklı yönlendirme anahtarlarıyla mesajların hangi kuyruğa düştüğünü gözlemleyin. • Aynı kuyruğa birden çok tüketici bağlayın ve işlerin tüketiciler arasında paylaşıldığını görün (iş kuyruğu deseni). • Fanout exchange'e birden çok kuyruk bağlayıp aynı mesajın hepsine ulaştığını doğrulayın (yayın deseni). • Son olarak topic exchange ile desen tabanlı yönlendirmeyi deneyin.
Her adımda yönetim arayüzüne bakın: kuyruktaki mesaj sayısı, tüketici sayısı ve onay bekleyen mesajlar, sistemin ne yaptığını anlamanın en görünür yoludur.
Güvenilirlik: onay, dayanıklılık ve hata yönetimi
Mesaj kuyruğu kullanmanın asıl nedeni çoğu zaman mesajın kaybolmamasıdır; bunun için birkaç ayarın birlikte doğru yapılması gerekir.
Onay (acknowledgement): Otomatik onay modunda aracı, mesajı tüketiciye gönderir göndermez siler. Tüketici işlemi yarıda bırakırsa mesaj kaybolur. Açık onay modunda tüketici işi bitirince onay gönderir; onay gelmeden tüketici düşerse mesaj yeniden teslim edilir. Kritik işlerde açık onay tercih edilir. Reddetme (reject) ve olumsuz onay (nack) ise mesajın atılmasına ya da kuyruğa geri konmasına karar verir.
Dayanıklılık (durability): Kuyruk ve exchange'in dayanıklı tanımlanması yalnız yapının aracı yeniden başladığında geri gelmesini sağlar. Mesajın kendisinin kalıcı olarak yayımlanması da gerekir; dayanıklı kuyruk tek başına mesaj güvencesi değildir. Bu ayarları birbirine karıştırmak en sık yapılan hatalardan biridir.
Hata yönetimi: Sürekli hata veren bir mesaj, kuyruğa geri konup sonsuz döngüye girebilir. Bunun için yeniden deneme sınırı, bekletmeli yeniden deneme ve işlenemeyen mesajların ayrı bir kuyruğa (dead letter) aktarılması planlanır. Tüketicileri tekrar eden mesaja dayanıklı yazmak (idempotent işleme) gerekir, çünkü yeniden teslim durumunda aynı mesaj yeniden gelebilir.
Akış kontrolü ve kuyruk politikaları
Kuyruk büyüyorsa tüketiciler yetişemiyordur; küçülüyor ve tüketiciler boş bekliyorsa üretim yavaştır. Dengeyi kurmak için birkaç araç vardır: • Prefetch sınırı: Bir tüketiciye aynı anda verilecek onaysız mesaj sayısını sınırlar. Ağır işleri olan tüketicide düşük tutmak adil dağılım sağlar. • Mesaj ömrü sınırı: Süresi dolan mesajın kuyrukta beklemesini önler; zamana duyarlı işlerde yararlıdır. • Kuyruk uzunluk sınırı: Birikme durumunda eski mesajın mı yoksa yeni mesajın mı düşürüleceğini belirler. • Öncelik: Kritik işleri öne almak için öncelikli kuyruk kullanılabilir; ancak aşırı kullanım karmaşıklık getirir.
Politikalar (policy) bu ayarları tek tek kuyruklarda değil, ad desenine göre toplu uygulamayı sağlar. Böylece yeni kuyruk açıldığında ayar tutarlı kalır. Örneğin tüm bildirim kuyruklarına aynı ömür sınırını bir politika ile verebilirsiniz.
Küme, yüksek erişilebilirlik ve izleme
Tek düğümlü kurulum, aracı çöktüğünde mesaj akışını durdurur. Üretim ortamlarında birden çok düğümden oluşan bir küme kurulur ve kritik kuyruklar düğümler arasında çoğaltılır. Hangi kuyruk türünün seçileceği, tutarlılık ile performans arasındaki dengeye göre belirlenir; çoğaltmalı kuyruk türlerinin güncel önerileri resmî dokümantasyondan kontrol edilmelidir. Ağ bölünmesi (network partition) senaryolarını önceden test edin; küme davranışını yalnız mutlu yolda denemek yetersizdir.
İzleme tarafında bakılması gereken göstergeler: kuyruk uzunluğu ve büyüme hızı, onaysız mesaj sayısı, tüketici sayısı, bağlantı ve kanal sayıları, bellek ve disk alarm eşikleri. Aracı bellek ya da disk eşiğine ulaştığında üreticileri yavaşlatır; bu durum uygulamada "kimse mesaj gönderemiyor" şikâyetine dönüşebilir. Bu metrikleri bir izleme sistemine bağlayıp alarm kurmak, işletimin önemli parçasıdır.
Güvenlik açısından ayrı kullanıcı ve sanal ana makine (virtual host) ayrımı, kullanıcı başına yetkilerin kısıtlanması ve bağlantının şifreli kurulması temel önlemlerdir.
Öğrenme yolu ve Mindset bağlamı
Başlangıç düzeyi: iş kuyruğu ve yayın desenlerini kurmak, onay mekanizmasını anlamak. Orta düzey: dayanıklılık, yeniden deneme ve dead letter akışlarını tasarlamak. İleri düzey: küme, çoğaltma, izleme ve güvenlik; olay güdümlü mimaride kuyruğun yerini belirlemek.
Mindset kataloğundaki RabbitMQ ile Mesaj Kuyruğu İşletimi eğitimi şu modülleri içerir: mesajlaşma temelleri ve RabbitMQ mimarisi, exchange tipleri ve yönlendirme, dayanıklılık, onay ve hata yönetimi, kuyruk politikaları ve akış kontrolü, kümeleme ve yüksek erişilebilirlik, izleme, güvenlik ve senaryo çalışmaları. Bu sıra, bu sayfada anlatılan öğrenme yolunun işletim odaklı bir karşılığıdır.
İlgili Mindset programı
RabbitMQ ile Mesaj Kuyruğu İşletimi
Sık sorulan sorular
RabbitMQ ile Kafka aynı şey midir?
Hayır. RabbitMQ, mesajı kuyruğa alıp tüketiciye ileten ve yönlendirme esnekliği sunan klasik bir mesaj aracısıdır. Kafka ise kayıt günlüğü mantığıyla çalışan bir olay akış platformudur. Kullanım senaryosuna göre biri ya da diğeri seçilir; bazı mimarilerde birlikte de kullanılır.
Mesajlar RabbitMQ yeniden başlatılırsa kaybolur mu?
Kaybolması mümkündür. Hem kuyruğun dayanıklı tanımlanması hem de mesajın kalıcı olarak yayımlanması gerekir. Biri eksikse yeniden başlatmada mesaj yitebilir. Kritik veride bu ayarlara ek olarak yayıncı onayı ve açık tüketici onayı da düşünülmelidir.
Aynı mesaj iki kez işlenir mi?
Yeniden teslim durumunda evet, mümkündür. Tüketici onay göndermeden düşerse mesaj tekrar teslim edilir. Bu yüzden tüketici mantığı tekrara dayanıklı yazılmalıdır: aynı mesaj yeniden işlense bile sonuç değişmemelidir. Mesaj kimliği tutmak bu amaçla yaygın bir yöntemdir.
Küçük bir proje için mesaj kuyruğu gerekli midir?
Her zaman değil. Doğrudan çağrı daha basitse ve ani yük, ayrık servis ya da arka plan işi ihtiyacı yoksa kuyruk gereksiz karmaşıklık getirir. Ama e-posta gönderimi, rapor üretimi gibi uzun işleri istek içinde yapıyorsanız küçük projede bile kuyruk faydalıdır.
Hangi dilleri destekler?
RabbitMQ'nun birçok programlama dili için istemci kütüphanesi vardır; yaygın dillerin hepsinde olgun seçenek bulunur. Bu nedenle farklı dillerde yazılmış servisler aynı aracı üzerinden haberleşebilir. Kütüphane seçerken bakımının sürdürülüp sürdürülmediğine bakmak yeterlidir.