RabbitMQ Federation Konfigürasyonu ve Kullanımı
Bilindiği gibi RabbitMQ açık kaynak bir mesaj kuyruğu sistemidir. Beraberinde birçok eklenti ve özellik barındırmaktadır. Federation yapısıda bir eklentidir. Federation yapısını kullanmak için bu eklentiyi aktif etmemiz (etkinleştirmemiz) gerekiyor. RabbitMQ hakkında bilgi edinmek için diğer yazıları okuyabilirsiniz. RabbitMQ nedir ve RabbitMQ Email gönderme yazılarıma göz atabilirsiniz.
Federasyona Neden İhtiyaç Duyarız?
Federasyonun birkaç kullanım durumu vardır; birden fazla kümeden merkezi bir kümeye mesaj toplamaya, bir kuyruğun yükünü birden çok diğer kümeye dağıtmaya ve bunu yaparken tüm üreticileri/tüketicileri durdurmadan başka bir kümeye geçiş yapma imkanı sağlar.
Federasyon eklentisi ile farklı kümelerdeki RabbitMQ’lar üzerinden mesaj iletebiliriz. Bu şekilde, farklı kümeler arasında gevşek bağlantı kurarak gerçekleştirebiliriz. Direkt bağlantı kurarak da yapabiliriz. Ancak bu durumda her bağlantı için her domainde geliştirme yapmayı gerektirecektir, gereğinden fazla efor ve maliyet (development) olacak.
Hepsiburada bünyesinde farklı domainlere sahip farklı takımlar bulunmaktadır. Bazı durumlarda farklı ekipler ile etkileşime geçmek gerekiyor. Bunun için domain bazında entegrasyon yapmak yerine RabbitMQ federation yapısı ile aynı mesajı alıp farklı domainlerde kullanabiliyoruz. Burada işler böyle yürüyor :) Bunun bize en büyük avantajı doğrudan bağımlılığı ortadan kaldırması entegrasyon için daha kısa sürede çıktı vermesi.
Hız iyi birşey değildir ama konu development ise çok iyi birşeydir.
Federasyon Değişimi (Borsası) ve Federasyon Kuyruğu gibi iki federasyon yapısı vardır. Bakalım neymiş bu borsa olayı :)
Federasyon Borsası
Bir federasyon değiş tokuş, yukarı akış alışverişlerine AMQP (yukarı akış bağlantısı) ile bağlanır ve akış yukarı alışverişlerine yayınlanan mesajlar federe alışverişe kopyalanır. Orijinal mesaj her zaman yukarı akış değişimlerinde yayınlanır. Ek olarak, yukarı akış değişimleri herhangi bir yapılandırma gerektirmez. Federasyon değişime sahip sistem, yukarı akış değişimlerine bağlanacak şekilde yapılandırılmıştır.
Bende beğenmedim bu tanımlamayı gelin örneklemeye çalışalım.
Team-1: Order
Team-2: Loyalty
Order takımı bir iş kuralı gerçekleştiriyor ve kullanıcının sepetinde satın alınan ürünü (veya ürünleri) bir event (order-created) olarak paylaşıyor.
Loyalty takımı bu order-created eventini dinleyerek eğer kullanıcı Hepsiburada Premium kullanıcısı ise yaptığı alışverişten papel kazanımlarını hesaplayıp 1 hafta sonra kullanması için hesabına papel olarak yansıtıyor.
Şimdi burada orjinal mesajı yayınlayan takım Team-1 (Order) ile Team-2 (Loyalty) farklı RabbitMQ kümeleri kullanıyor. İlk yapılması gereken 2 farklı RabbitMQ kümesi arasında RabbitMQ Federation yapısı kurmak. Burada orjinal mesajı yayınlayan Team-1 (Order) takımı Upstream, mesajları federe olarak dinleyen Team-2 (Loyalty) takımı downstream oluyor.
Upstream Server: Orijinal mesajların yayınlandığı sistem.
Downstream Server: Mesajların iletildiği sistem. Federasyon değişimi / kuyruğu burada gerçekleşir. Yukarı akış sunucusuna bağlantı burada yapılandırılır.
Federasyon Sırası
Birleşik bir kuyruk, yukarı akış sıralarına bağlanır ve mesajları alır ve bu mesajları yerel sistemlerinde tüketicilere sağlar. Yukarı akış kuyruklarının yapılandırılması gerekli değildir. Tüm bağlantı yapılandırmaları, birleşik kuyruğun bulunduğu aşağı akış sisteminde yürütülür.
Upstream-Downstream Nedir?
Yukarı akış sunucuları (Upstream), mesajların orijinal olarak yayınlandığı sunuculardır. Aşağı akış sunucuları (Downstream), mesajların iletildiği yerdir.
O zaman başlayalım
1- Docker Desktop ile local de 2 (farklı küme ) RabbitMQ management oluşturacağız. (yaml dosyası - docker-compose)
2- RabbitMQ Federation Pluginleri aktif hale getireceğiz.
3- Federation Exchange ve Queue tanımlamaları yapacağız.
4- Upstream tanımlaması yapacağız.
5- Upstream Policy tanımlaması yapacağız.
6- Federation Status kontrolleri yapacağız
7- Upstream queue mesaj yayınlayıp, downstream da queue’da mesajı tüketeceğiz.
Demo Federasyon Senaryosu ve Yapılandırmaları
Herhangi bir development IDE si kullanarak kullanarak bir proje oluşturalım. Ben Visual Studio Code kullanacağım.
docker-compose-dev.yml adında dosya oluşturalım.
İsimlendirme tamamen örnek amaçlıdır istediğiniz isimlendirmeyi yapabilirsiniz.
Terminal de docker-compose -f docker-compose-dev.yml up -d komutunu kullanarak docker ile localimizde 2 ayrı RabbitMQ ortamı — kümesi oluşturuyoruz.
Docker image kurulumları tamamlandıktan sonra rabbitmq-federation isimlendirmesi altında 2 ayrı rabbitmq kümemiz oluşmuş görünüyor.
http://localhost:15672/#/
http://localhost:15673/#/
Default olarak kurulan RabbitMQ management ekranlarını Admin menüsü altından kontrol edildiğinde federasyon (federation) eklentisinin etkin-aktif olmadığını göreceğiz.
rabbitmq-plugins enable rabbitmq_management rabbitmq_federation_management
Her küme için ayrı ayrı etkinleştirme işlemi yapabiliriz. Ben docker desktop yardımı ile yapacağım.
CLI terminal ekranı açıldığında yukarıda belirttiğim etkinleştirme kodunu yazıp enter tuşuna basalım.
Etkinleştirme işlemi başarılı olduktan sonra tekrar RabbitMQ Management ekranlarında Admin menüsü altında, Federation alanlarının aktif hale geldiğini göreceğiz.
1- Öncelikle hem Upstream hem de Downstream Server üzerinde bir topic exchange (federation.exchange.demo) oluşturalım.
Burada exchange tipi tamamen proje isterinize ihtiyacınıza göre değişebilir. Fanout da kullanılabilir, direct de kullanılabilir, diğer exchange tipleri de kullanılabilir.
2- Her iki sunucuda da bu exchange’e bağlanacak bir kuyruk (federation.queue.demo) oluşturalım.
x-message-ttl = 864000000 burada mesajların saklanma süresi 1 saat olarak milisaniye cinsinden belirleyelim. Zorunluluğumuz yok sadece bazı argümanları yeri geldiğinde kullanıp açıklanmaya çalışacağım.
3- Federasyon Upstream Tanımlaması
URI biçimi: amqp://kullanıcıAdı:şifre@ip:bağlantı noktası
amqp://guest:guest@localhost:5672/%2F
Default olarak RabbitMQ da guest kullanıcı adı ve şifresi ile giriş yapabiliriz. Bu iş için özel olarak bir kullanıcı tanımlayıp federation kurulumu yapacak ekibe bu user bilgilerini vererek tanımlama — bağlantı yapılması sağlanabilir.
4- Policy Tanımlaması
Downstream sunucu üzerinde oluşturduğumuz federasyon için
Admin -> Policies menüsünden policy (demo.federation.upstream.policy) tanımlayalım.
“federation-upstream-set = all” ile bu politikanın (policy) tüm upstream’lara uygulanacağını söyleyebilir veya kendi oluşturduğumuz upstream için tanımlama yapabiliriz.
“federation-upstream = demo.federation.upstream” olarak ayarlayalım.
5- Federasyon Durum Kontrolü
Admin -> Federation Status menüsünden federasyon durumunu kontrol edebiliriz.
6- Upstream sunucusunda federation.exchange.demo olarak tanımladığımız exchange bakalım. Burada, alt sunucudaki federasyon değişim bilgilerini görebiliriz. Artık Upstream sunucusunda “federation.exchange.demo” adlı exchange’e bir mesaj yayınlayabiliriz. Aynı zamanda, aşağı akış sunucusundaki değişim de tetiklenebilir ve bu mesaj, aşağı akış sunucusundaki federation.queue.demo’dan tüketilebilir.
RabbitMQ federation yapısı hakkında genel giriş olarak anlatacaklarım şimdilik bu kadar. Umarım faydalı olmuştur. Soru ve yorumlarınıza cevap vermeye çalışacağım. Farklı bir konu ve yazı ile görüşmek üzere. Az buglu çok kodlu günler diliyorum.
Kaynaklar.