RabbitMQ, AMQP (Advanced Message Queuing) protokolü üzerine kurulmuş, mesaj kuyrukları aracılığı ile farklı uygulamalar arasında asenkron iletişimi sağlamak amacıyla kullanılan açık kaynak bir araçtır.
Mikroservis mimariler ve dağıtık sistemler için kullanışlı bir çözüm olarak kabul görmektedir.
Şimdi önünde Load Balancer konumlandıracağımız 2 adet RabbitMQ konteynırını harekete geçirip, mesaj kuyruğumuza ‘Python’ kullanarak bir mesaj gönderelim 🙂
Yapıda yük dengeleyici (loadbalancer) olarak HAProxy kullanacağım, HAProxy nedir sorusunu yanıtlayalım.
HAProxy açık kaynak kodlu, yük dengeleyici olarak kullanabileceğiniz, TCP ve HTTP protokolünü kullanan uygulamalarınız için proxy olarak da kullanabileceğiniz bir yazılımdır. Ayrıca yedeklilik de sağlamaktadır.
Yük dengeleme işlemini Round Robin yapılandırması ile sağlamaktadır.
Round Robin, bir grup sunucu arasında gelen istekleri eşit olarak paylaştıran bir yük dengeleme yöntemidir.
Şimdi docker-compose dosyamız ve haproxy için de cfg dosyamızı paylaşalım;
docker-compose.yml
version: ‘3’
services:
rabbitmq1:
image: “rabbitmq:3.8-management”
hostname: rabbitmq1
environment:
– RABBITMQ_ERLANG_COOKIE=secretcookie
ports:
– “5672”
networks:
– rabbitmq_network
rabbitmq2:
image: “rabbitmq:3.8-management”
hostname: rabbitmq2
environment:
– RABBITMQ_ERLANG_COOKIE=secretcookie
ports:
– “5672”
networks:
– rabbitmq_network
haproxy:
image: “haproxy:2.2”
volumes:
– ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
– “5672:5672”
– “15672:15672”
networks:
– rabbitmq_network
networks:
rabbitmq_network:
haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
user haproxy
group haproxy
maxconn 4096
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend rabbitmq_frontend
bind *:5672
mode tcp
default_backend rabbitmq_backend
frontend rabbitmq_management_frontend
bind *:15672
mode http
default_backend rabbitmq_management_backend
backend rabbitmq_backend
mode tcp
balance roundrobin
server rabbitmq1 rabbitmq1:5672 check
server rabbitmq2 rabbitmq2:5672 check
backend rabbitmq_management_backend
mode http
balance roundrobin
server rabbitmq1 rabbitmq1:15672 check
server rabbitmq2 rabbitmq2:15672 check
Şimdi konteynırlarımızı ayağa kaldırabiliriz.
docker-compose up -d

Herşey yolunda gözüküyor, şimdi RabbitMQ management’ a haproxy üzerinden bağlanabiliriz, 15672 portumuz açık, haproxy yükü en az olan rabbitmq yu round robin ile saptayıp bizi ilgili rabbitmq’ ya yönlendirecek.

Bir kaç kez log out login olduğunuzda bazen rabbitmq1’e bazen de rabbitmq2’ye erişeceğinizi gözlemleyebilirsiniz.
Ayrıca yük dengeleyici olarak kullandığımız haproxy nin stats sayfasını da cfg dosyanızdan açıp aşağıdaki gibi yük durumunuzu, up down durumumuzu izleyebiliriz.
cfg dosyasına aşağıdaki satırları ekleyelim.
listen stats
bind *:1936
mode http
stats enable
stats hide-version
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
stats auth mada:mada

Herşey yolunda gözüküyor, şimdi RabbitMQ mesaj kuyruğumuza bir mesaj gönderelim. RabbitMQ’ nun birçok mesaj gönderme yöntemi var birbirinden farklı,
biz direct_exchange yöntemini kullanacağız, eğer belirli bir kuyruğa mesaj gönderiyorsak haproxy’ nin mesajı kuyruğun olmadığı rabbitmq ya göndermemesi için ACL acces control list tanımlaması yapmamız gerekecektir.
Mesaj gönderirken Python kullandım, pika kütüphanesini import ederek başlayalım.
pip install pika
send.py scriptimizi oluşturalım ve aşağıdaki kodları kopyalayalım.
import pika
def send_message(message):
connection_params = pika.ConnectionParameters(
host='localhost',
port=5672,
virtual_host='/',
credentials=pika.PlainCredentials('guest', 'guest')
)
connection = pika.BlockingConnection(connection_params)
channel = connection.channel()
channel.exchange_declare(exchange='direct_exchange', exchange_type='direct')
channel.basic_publish(
exchange='direct_exchange',
routing_key='',
body=message
)
print(f"Mesaj Gönderildi")
connection.close()
message_to_send = “Merhaba Madaaa!”
send_message(message_to_send)
Şimdi scriptimizi çalıştıralım.
python3 send.py
root@mada-virtual-machine:/home/mada/rabbitmq# python3 send.py
Mesaj Gönderildi.
Buralardan bir mesaj geçmiş 🙂

Bir sonraki blog yazımızda Exchanges ve Queues yapısını farklı örneklerle paylaşacağız.
Faydalı Olması Dileklerimle,