یکی از الگوهای رایج در سیستمهای پیامرسانی Publish/Subscribe است که در آن پیامها توسط یک Producer منتشر شده و به چندین Consumer همزمان ارسال میشوند. در RabbitMQ، این الگو با استفاده از Fanout Exchange پیادهسازی میشود.
ایجاد Fanout Exchange و صفها
ابتدا باید یک Exchange از نوع Fanout تعریف کرده و چند Queue به آن متصل کنیم. همه پیامها بدون توجه به Routing Key به تمامی Queueهای متصل ارسال میشوند.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# تعریف Fanout Exchange
channel.exchange_declare(exchange='logs', exchange_type='fanout')
# تعریف و اتصال صفها
channel.queue_declare(queue='queue1')
channel.queue_declare(queue='queue2')
channel.queue_bind(exchange='logs', queue='queue1')
channel.queue_bind(exchange='logs', queue='queue2')
ارسال پیامها (Publisher)
پیامها به Exchange ارسال میشوند و Exchange آنها را به همه Queueهای متصل پخش میکند:
message = "پیام Broadcast"
channel.basic_publish(exchange='logs',
routing_key='',
body=message)
print("پیام ارسال شد")
connection.close()
دریافت پیامها (Subscriber)
هر Consumer که به یکی از Queueها متصل است، پیام را دریافت و پردازش میکند:
def callback(ch, method, properties, body):
print(f"پیام دریافت شد: {body.decode()}")
channel.basic_consume(queue='queue1',
on_message_callback=callback,
auto_ack=True)
print('در انتظار پیامها...')
channel.start_consuming()
ویژگیهای Publish/Subscribe با Fanout
- پیامها به تمامی Queueهای متصل به Exchange ارسال میشوند.
- Routing Key نادیده گرفته میشود و برای Fanout Exchange نیازی به آن نیست.
- برای ارسال اطلاعات عمومی یا Broadcast به چندین مصرفکننده مناسب است.
جمعبندی
Fanout Exchange سادهترین روش برای پیادهسازی الگوی Publish/Subscribe در RabbitMQ است. با این روش میتوان پیامها را به صورت همزمان به چندین Consumer ارسال کرد و اطلاعات عمومی یا اعلانها را در سیستمهای توزیعشده منتشر نمود.