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-management

Browser'da http://localhost:15672 açıp kullanıcı adı/şifre olarak guest/guest girin.

Şimdi Python kütüphanesini yükleyin:

1pip install pika

Producer (mesaj gönderen) kodunu yazalım:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import pika
2
3connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
4channel = connection.channel()
5
6# Kuyruk adını belirle
7channel.queue_declare(queue='task_queue', durable=True)
8
9# Mesaj gönder
10message = 'Merhaba, bu bir test mesajı'
11channel.basic_publish(
12exchange='',
13routing_key='task_queue',
14body=message,
15properties=pika.BasicProperties(delivery_mode=2) # Kalıcı mesaj
16)
17
18print(f'Mesaj gönderildi: {message}')
19connection.close()

Beklenen çıktı: Mesaj gönderildi: Merhaba, bu bir test mesajı

Şimdi Consumer (mesaj alan) yazalım:

1import pika
2import time
3
4connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
5channel = connection.channel()
6
7channel.queue_declare(queue='task_queue', durable=True)
8
9def callback(ch, method, properties, body):
10print(f'Mesaj alındı: {body.decode()}')
11time.sleep(1) # İşi simüle et
12ch.basic_ack(delivery_tag=method.delivery_tag) # Başarılı işlendi
13
14channel.basic_qos(prefetch_count=1) # Bir seferde bir mesaj al
15channel.basic_consume(queue='task_queue', on_message_callback=callback)
16
17print('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.

bknz: Basit Inventory Sistemi Python'da Sıfırdan Kodlamak

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz