RabbitMQ Nedir? Pika ile Python Üzerinde Kullanımı

RabbitMQ; kendi tarifiyle dünyanın en popüler açık kaynaklı mesaj aracısıdır. Popüler tüm programlama dilleri ile kullanılabilir ve pek çok işletim sistemi üzerinde çalışabilir olması ile övünüyor.

Mesaj aracısı nedir peki? Diyelim ki bir görsel saklama projeniz var.  Ve bu projede yüklenen  her görsele bir etiket yazılması gerekiyor. Bu uzun sürecek bir işlem hatta projenin genişleyeceğini düşündüğümüzde, işi sitenize giren kullanıcılara sayfalarınız göstermek olan sunucunuz kaynaklarının tamamını buna harcamaya başlayacak. Görsellerimizi bir sıraya sokarak ve başka bir sunucu üzerine sırayla gönderip etiket bastırıp geri alarak bu sorunu çözebiliriz. Burada işte tüm bu sırala/gönder/al/işle işlemleri için RabbitMQ bize yardımcı olacaktır. Hatta bu uzak sunucu yetersiz gelmeye başladığında rahatlıkla yeni bir sunucuyu sisteme dahil etmemize olanak verir.

Dediğim gibi pek çok dilde desteği var burada Python ile nasıl çalıştığını göstereyim. Ama öncesinde deneme yapabilmek için bir RabbitMQ Server kurmamız gerekiyor. Bu Server’ın çalışması için de işletim sistemimizde Erlang kurulu olmalı.

http://www.erlang.org/downloads

Adresine giderek uygun kurulum dosyanızı indirebilirsiniz. Burada dikkat edilmesi gereken bir nokta var, an itibari ile RabbitMQ Server versiyon 3.6.10 ve Erlang OTP setinin son sürümü olan 20.0 ile uyumlu değil. Bu yüzden 19.3.x olan bir sürüm indirmemiz gerekli. Bu sürüm kontrolünü, zaman ile değişeceği için, şu linkten yapmanızda fayda var. Ya da Erlang zaten kurulu ise sisteminizde bu tabloya göz atmanız şart.

Adrese gidip sol kısımdaki menüden OTP 19.3 linkine tıkladıktan sonra 64bit Windows için OTP 19.3 Windows 64-bit Binary File kurulum dosyasını yükleyerek devam ettim, siz işletim sisteminize göre ilerleyebilirsiniz.

Erlang kurulumunu yaptıktan sonra aşağıdaki linkten Windows için RabbitMQ Server kurulum dosyamızı indirip kurulumunu yapıyoruz. Diğer işletim sistemleri için sol menüde seçenekler var oradan seçebilirsiniz yine. Kurulumu yaptıktan sonra Görev Yöneticisi > Hizmetler üzerinden RabbitMQ adında bir servisin çalıştığını kontrol edin.

https://www.rabbitmq.com/install-windows.html

Kod yazmaya başlamadan RabbitMQ jargonundan bir kaç terime açıklık getireyim.

Producer: Mesaj gönderen program için kullanılır.

Queue: Zaten sıra anlamına gelen bu kelime iş sıramızı tutan yapı için kullanılır. Sunucunun bellek ve disk limitlerine bağlı çalışır, bu limitler kadar iş tutabilir veya işleyebilir. Burada işten kastım bu iş ile birlikte gelen verileri de içeriyor yani yukarıdaki örnekte görselleri de gönderdiğimizi varsayarsak sunucu diski dolması yeni bir işi sıraya sokamayacağını gösterir.

Consumer: İşi yapmak için bekleyen programımıza da consumer denir.

Burada RabbitMQ’nun güzel yani geliyor. Bu ilk 3 bileşenden oluşan sistemimiz tek bir sistem üzerinde durmak zorunda değil. İsteğimize ve işimize göre bunları dağıtık bir yapıya oturtup projemizi çalıştırabiliriz.

AMQPRabbitMQ’nun mesaj gönderimi için kullandığı bir protokol. Açılımı Advanced Message Queuing Protocol.

PikaPython kullanacağız demiştik. Pika da işlerimizi kolaylaştıracak RabbitMQ – AMQP için hazırlanmış bir Python paketi.

Öncelikle AMQP kullanımı için Pika paketini kurmamız gerekli. pip install pika  komutu ile hemen kurulumu yapabiliriz. Pika kurulumunu yaptıktan sonra basit bir örnek için consumer.py ve producer.py adında iki Python dosyası oluşturacağız.

import pika

# RabbitMQ üzerine bir bağlantı açıyoruz
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))

# iletişim için kanalımızı alıyoruz
channel = connection.channel()

# isim vererek bir sıra tanımlaması yapıyoruz
# burada sıranın tanımlı olması önemli değil yine de
# bu yöntem kullanılabilir, daha kesin çalışması sağlanır
channel.queue_declare(queue='selam')

# sıra üzerinde bir mesaj işlendiğinde kullanılacak 
# geri çağırma fonksiyonu
def callback(ch, method, properties, body):
    print("Bir mesaj geldi => %r" % body)

print('Sıraya bir mesaj gelmesi bekleniyor...') 

# parametreler vererek kanal üzerindeki işleri işlemeye başlıyoruz
channel.basic_consume(callback,
                      queue='selam',
                      no_ack=True)
channel.start_consuming()
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='selam')

# yukarıda aldığımız kanala bir iş gönderiyoruz
channel.basic_publish(exchange='',
                      routing_key='selam',
                      body='Merhaba!')

print("Selam mesajı sıraya gönderildi.")

connection.close()

Satır aralarına açıklamalar yazmaya çalıştım, zaten metot isimleri yaptığı işi anlatır halde. İki adet komut penceresi açıp bu dosyalarımız python consumer.py  ve python producer.py  komutları ile çalıştırıyoruz. producer.py çalıştığı anda diğer konsola bakarsanız mesajın geldiğini görebilirsiniz. Sistemimiz düzgün bir şekilde çalışıyor demektir. İlk RabbitMQ işiniz hayırlı olsun.

RabbitMQ’nun faydasını anlamak için yeni bir komut penceresinde  python consumer.py komutu ile consumer dosyamızı tekrar çalıştıralım. Şu an sistemimizde iki consumer ve bir producer var. producer dosyamızı art arda çalıştırıp bir kaç mesaj ekleyelim sıraya ve consumer.py dosyasının çalıştığı konsollara bakalım. Kendi uğraşımız ile yapmaya çalışsak saatler alacak bir işi RabbitMQ kolaylaştırarak, gelen mesajları değıtıyor ve sistem kaynaklarını düzenli kullanmamızı sağlıyor. (Evet bu örnek tek bir bilgisayar üzerinde olduğu için sistem kaynakları dediğimiz zaten sürekli sabit, örneğin amacına uygun olması için böyle yazdım)


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir