Sıfırdan Message Queue Sistemi: RabbitMQ ve Consumer Yazma
RabbitMQ, uygulamalar arasında mesaj göndermek için kullanılan bir aracıdır (broker). İki uygulama doğrudan haberleşmez; RabbitMQ aracılığıyla mesajları kuyruğa koyar ve alır. Bu sayede sistemler birbirinden bağımsız çalışabilir.
Önce RabbitMQ'yu Docker ile başlatalım. Kurulum ve yönetim arayüzü (port 15672) de hazır gelir.
1docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-managementBrowser'da http://localhost:15672 açıp kullanıcı adı/şifre olarak guest/guest girin.
Şimdi Python kütüphanesini yükleyin:
1pip install pikaProducer (mesaj gönderen) kodunu yazalım:
1import pika23connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))4channel = connection.channel()56# Kuyruk adını belirle7channel.queue_declare(queue='task_queue', durable=True)89# Mesaj gönder10message = 'Merhaba, bu bir test mesajı'11channel.basic_publish(12exchange='',13routing_key='task_queue',14body=message,15properties=pika.BasicProperties(delivery_mode=2) # Kalıcı mesaj16)1718print(f'Mesaj gönderildi: {message}')19connection.close()Beklenen çıktı: Mesaj gönderildi: Merhaba, bu bir test mesajı
Şimdi Consumer (mesaj alan) yazalım:
1import pika2import time34connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))5channel = connection.channel()67channel.queue_declare(queue='task_queue', durable=True)89def callback(ch, method, properties, body):10print(f'Mesaj alındı: {body.decode()}')11time.sleep(1) # İşi simüle et12ch.basic_ack(delivery_tag=method.delivery_tag) # Başarılı işlendi1314channel.basic_qos(prefetch_count=1) # Bir seferde bir mesaj al15channel.basic_consume(queue='task_queue', on_message_callback=callback)1617print('Consumer başladı, mesaj bekleniyor...')18channel.start_consuming()Producer'ı çalıştırıp hemen Consumer'ı başlatın. Consumer mesajı alacak ve işleyecek.
Sık yapılan hata: Consumer'da basic_ack (onay) çağrısını unutmak. Eğer mesajı işledikten sonra onay göndermezseniz, RabbitMQ mesajın işlenmediğini düşünüp tekrar gönderir; bu sonsuz döngüye neden olur. Ayrıca durable=True ile kuyruk kalıcı hale gelir; RabbitMQ yeniden başlatılsa bile mesajlar korunur.
0 yorum