Geleneksel dağıtılmış uygulamalarda, iletişim genellikle senkron bir şekilde yapılırdı. Senkron iletişim, basit olmasına rağmen kendi zorluklarına sahiptir. İşte asenkron iletişim ve mesaj kuyrukları/aracıları burada devreye girer. Dağıtılmış bileşenler arasında yer alırlar. Öncelikle mesaj kuyruğunun ne olduğunu ve neden kullanıldığını anlamamız gerekir. Yazılım sistemlerinde, servisler arasında iletişim kurmamız gerekir. Mesaj kuyrukları, dağıtılmış mimariler arasında iletişim kurmak ve işlemleri eşzamansız olarak gerçekleştirmek için bize bir yapı sağlar. Her mesaj yalnızca bir kez, tek bir tüketici tarafından işlenir. Mesaj kuyruklarının avantajları, servisler arasındaki bağımlılığı azaltır ve ölçeklenebilirliği artırır.
RabbitMQ Nedir ?
RabbitMQ, açık kaynak olarak yaygın olarak kullanılan en popüler mesaj aracısı teknolojilerinden biridir. Birden fazla mesajlaşma protokolünü ve akışı destekler. RabbitMQ birçok işletim sisteminde çalışır ve bulut hizmetine sahiptir. RabbitMQ bir mesaj aracısı olduğundan, mesajları yayınlayan yayıncı ve mesajı kuyruktan alıp işleyen consumer tarafından kullanılır. Mesajın hangi kuyruğa gideceği değişim yoluyla öğrenilir. Yayıncının veya geliştirilen tüketici hizmetlerinin programlama dilinin bir önemi yoktur. Hepsi ayrı ve bağımsızdır.
Avantajları
- Çoklu platform desteği: RabbitMQ, farklı dillerde yazılmış uygulamalar arasında mesajlarınızı iletmek için kullanılabilir. Bu sayede uygulamalar arasında dil uyumsuzluğu sorunu ortadan kaldırır.
- Yüksek Performans: RabbitMQ, yüksek performanslı bir mesaj aracısıdır. İletişim işlemleri hızlı ve verimli bir şekilde gerçekleştirilir.
- Esneklik: RabbitMQ, farklı senaryolara uygun olarak yapılandırabilir. Örneğin, farklı yönlendirme stratejileri seçebilirsiniz.
- Güvenirlik: RabbitMQ, mesajların güvenli ve sağlam bir şekilde teslim edilmesini sağlar. Mesajların kaybolması veya tekrarlanması gibi sorunlar yaşanmaz.
- Ölçenebilirlik: RabbitMQ, yüksek trafikli uygulamalar için idealdir. Çok sayıda mesaj işlenebilir ve çoklu sunucular kullanılabilir.
Terminoloji
- Producer: Mesajı queue’ya gönderen hizmet/uygulama.
- Exchange: Publisher tarafından gönderilen mesajların nasıl yönetileceğini ve hangi rotalara yönlendirileceğini belirlemek için kullanılan yapıdır.
- Routes: Hangi mesajın hangi queue’ya gönderileceğini belirlememizi sağlar.
- Bindings: Değişim ve queue arasında bir bağlantı oluşturma.
- Consumer: Mesajı queue’dan alan ve tüketen hizmet/uygulama.
- Queue: Mesajları depolayan ve en az bir exchange bağlı olan büyük bir buffer’dır. Consumer’lar ve producer’lar bir queue ile çoktan bire ilişkiye sahiptir.
- Message: İşlem tetikleyicileri, görev durumu, basit metin mesajları vb. dahil olmak üzere tüketen uygulama için değerli olabilecek ikili bir veri BLOB’udur.
- Virtual Host: Bir RabbitMQ sunucusundaki farklı producer’ları, consumer’ları, exchange’leri, queue’ları ve diğer nesneleri izole eden sanal bir ortamdır.
RabbitMQ Nasıl Kurulur ?
Bu yazıda RabbitMQ cluster olarak Linux bir makineye nasıl kurulur ondan bahsedilecektir. Linux olarak Ubuntu 20.04.6 LTS tercih edilmiştir.
Cluster alınacak bütün sunucularda öncelikle hosts dosyasına cluster olacak sunucuların IP ve hostname ekliyoruz.
vi /etc/hosts
x.x.x.x RABBITMQ1
x.x.x.x RABBITMQ2
x.x.x.x RABBITMQ3
Öncelikle ihtiyaç olan isterleri kuruyoruz.
sudo apt-get install curl gnupg apt-transport-https -y
Artık RabbitMQ ana, ErLang ve RabbitMQ PackageCloud depoları için depo imzalama anahtarlarını sırasıyla ekleyebiliriz.
curl -1sLf “https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA” | sudo gpg –dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg –dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg –dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
Team RabbitMQ tarafından yönetilen uygun repository’leri eklenir.
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
##Provides modern Erlang/OTP releases from a Cloudsmith mirror
#
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu focal main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu focal main
##another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu focal main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu focal main
##Provides RabbitMQ from a Cloudsmith mirror
#
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu focal main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu focal main
##another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu focal main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu focal main
EOF
Paket dizinlerini güncelleriz.
sudo apt-get update -y
Erlang paketlerini yükleriz.
sudo apt-get install -y erlang-base \
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
RabbitMQ-server’ı ve bağımlılıklarını kurarız.
sudo apt-get install rabbitmq-server -y –fix-missing
Aşağıdaki komutla durumunu kontrol edebiliriz.
sudo systemctl status rabbitmq-server
‘RABBITMQ1’ sunucusunda, ‘.erlang.cookie’ dosyasını doğrulamak ve dosyanın kullanılabilir olduğundan emin olmak için aşağıdaki komutu çalıştırırız.
ls -lah /var/lib/rabbitmq
Sonra, ‘.erlang.cookie’ dosyasını hem ‘RABBITMQ2′ hem de RABBITMQ3’ sunucularına kopyalayıp/aktarırız.
scp /var/lib/rabbitmq/.erlang.cookie root@x.x.x.x:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@x.x.x.x:/var/lib/rabbitmq/
‘RABBITMQ2’ ve ‘RABBITMQ3’ de aşağıdaki komutlar ile sunucuyu cluster join ederiz.
sudo rabbitmqctl stop_app
rabbitmqctl reset
sudo rabbitmqctl join_cluster rabbit@rabbitmq1
sudo rabbitmqctl start_app
Aşağıdaki komutla cluster durumunu görebiliriz.
sudo rabbitmqctl cluster_status
Aşağıdaki komutlarla administrator kullanıcı oluşturabiliriz.
rabbitmqctl add_user user password
rabbitmqctl set_user_tags user administrator
‘user’ kullanıcısı için RabbitMQ cluster’da tüm varlıklara yönelik izinleri ayarlarız.
sudo rabbitmqctl set_permissions -p / user “.” “.” “.*”
RabbitMQ, mirror queue’larını ayarlamak için iki yol sunar; RabbitMQ politikası aracılığıyla klasik queue mirror kullanabilir veya quorumkuyruklarını kullanarak ayarlayabilirsiniz.Yeni bir ‘ha-all’ politikası oluşturmak için aşağıdaki komutu çalıştırın. Bu politika, tüm kuyrukların RabbitMQ cluster’daki node’lar arasında mirror’lamaya izin verir.
rabbitmqctl set_policy ha-all “.*” ‘{“ha-mode”:”all”,”ha-sync-mode”:”automatic”}’
Yönetim arayüzünü aşağıdaki komutla aktif edebilirsiniz.
rabbitmq-plugins enable rabbitmq_management


Aşağıdaki komutla versiyonu kontrol edebilirsiniz.
sudo rabbitmqctl version
Aşağıdaki komutla ldap plugin yükleyip aktif edebilirsiniz.
sudo apt-get install -y erlang-eldap
rabbitmq-plugins enable rabbitmq_auth_backend_ldap
Cluster ve management ssl çevirmek için aşağıdaki şekilde server ve client için sertifika oluşturabilirsiniz. Öncelikle sertifikanın olacağı path oluşturulur.
mkdir testca
cd testca
mkdir certs private
chmod 700 private
echo 01 > serial
touch index.txt
Sonra aşağıdaki ‘openssl.cnf’ ssl config eklenir.
[ ca ]
default_ca = testca
[ testca ]
dir = .
certificate = $dir/ca_certificate.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/ca_private_key.pem
serial = $dir/serial
default_crl_days = 7
default_days = 365
default_md = sha256
policy = testca_policy
x509_extensions = certificate_extensions
[ testca_policy ]
commonName = supplied
stateOrProvinceName = optional
countryName = optional
emailAddress = optional
organizationName = optional
organizationalUnitName = optional
domainComponent = optional
[ certificate_extensions ]
basicConstraints = CA:false
[ req ]
default_bits = 2048
default_keyfile = ./private/ca_private_key.pem
default_md = sha256
prompt = yes
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = hostname
[ root_ca_extensions ]
basicConstraints = CA:true
keyUsage = keyCertSign, cRLSign
[ client_ca_extensions ]
basicConstraints = CA:false
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = 1.3.6.1.5.5.7.3.2
[ server_ca_extensions ]
basicConstraints = CA:false
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
Daha sonra test Sertifika Yetkilimizin kullanacağı anahtarı ve sertifikaları üretmemiz gerekiyor.
openssl req -x509 -config openssl.cnf -newkey rsa:2048 -days 365 \
-out ca_certificate.pem -outform PEM -subj /CN=MyTestCA/ -nodes
openssl x509 -in ca_certificate.pem -out ca_certificate.cer -outform DER
Server ve Client sertifikaları oluşturma süreci oldukça benzerdir. İlk olarak Server:
cd ..
ls #=> testca mkdir server
cd server
openssl genrsa -out private_key.pem 2048
openssl req -new -key private_key.pem -out req.pem -outform PEM \
-subj /CN=$(hostname)/O=server/ -nodes
cd ../testca
openssl ca -config openssl.cnf -in ../server/req.pem -out \
../server/server_certificate.pem -notext -batch -extensions server_ca_extensions
cd ../server
openssl pkcs12 -export -out server_certificate.p12 -in server_certificate.pem -inkey private_key.pem \
-passout pass:MySecretPassword
Şimdi Client:
cd ..
ls
# => server testca
mkdir client
cd client
openssl genrsa -out private_key.pem 2048
openssl req -new -key private_key.pem -out req.pem -outform PEM \
-subj /CN=$(hostname)/O=client/ -nodes
cd ../testca
openssl ca -config openssl.cnf -in ../client/req.pem -out \
../client/client_certificate.pem -notext -batch -extensions client_ca_extensions
cd ../client
openssl pkcs12 -export -out client_certificate.p12 -in client_certificate.pem -inkey private_key.pem \
-passout pass:MySecretPassword
Ekte örnek rabbitmq.conf bulunmaktadır. İstediğiniz parametleri seçip aşağıdaki path’de config dosyasını oluşturup default config değiştirebilirsiniz.
vi /etc/rabbitmq/rabbitmq.conf
RabbitMQ örnek konfigürasyon dosyasını buradan indirebilirsiniz.
LDAP entegrasonu ve yetki kısıtlama için aynı path’te ‘advanced.config’ dosyasını oluşturabilirsiniz.
vi /etc/rabbitmq/advanced.config
[
{
rabbit,
[
{
auth_backends, [rabbit_auth_backend_ldap, rabbit_auth_backend_internal]
}
]
},
{
rabbitmq_auth_backend_ldap,
[
{resource_access_query,
{for, [ {permission, read,
{for, [{resource, exchange, {in_group, “cn=admin,dc=example,dc=com”}},
{resource, queue, {constant, true}}]}}
]
}},
{topic_access_query,
{for, [{permission, write, {match, {string, “${routing_key}”}, {string, “^a”}}},
{permission, read, {constant, true}}
]
}},
{
tag_queries, [
{administrator,{in_group,”cn=admin,dc=example,dc=com”}},
{monitoring, {in_group,”cn=admin,dc=example,dc=com”}},
{management,{constant, true}}
]
}
]
}
].
0 yorum