RPC با RabbitMQ

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/06/25
  • تعداد بازدید: 3

الگوی RPC (Remote Procedure Call) به ما امکان می‌دهد که یک برنامه (Client) تابعی را در برنامه دیگر (Server) فراخوانی کند و نتیجه را دریافت نماید. RabbitMQ با استفاده از صف‌ها و پیام‌ها می‌تواند این الگو را به شکل غیرهمزمان پیاده‌سازی کند.

ساختار کلی RPC

برای پیاده‌سازی RPC در RabbitMQ به دو جزء نیاز داریم: Queue درخواست که پیام‌های Client در آن قرار می‌گیرند و Queue پاسخ که Server نتیجه را در آن می‌گذارد.


Client ---> Queue درخواست ---> Server
Server پردازش می‌کند ---> Queue پاسخ ---> Client دریافت می‌کند

نمونه کد Server (RPC)

import pika

def fib(n):
    if n == 0: return 0
    if n == 1: return 1
    return fib(n-1) + fib(n-2)

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

channel.queue_declare(queue='rpc_queue')

def on_request(ch, method, props, body):
    n = int(body)
    response = fib(n)

    # ارسال پاسخ به Queue اختصاصی Client
    ch.basic_publish(exchange='',
                     routing_key=props.reply_to,
                     properties=pika.BasicProperties(correlation_id = props.correlation_id),
                     body=str(response))
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='rpc_queue', on_message_callback=on_request)

print("RPC Server در حال اجرا...")
channel.start_consuming()

نمونه کد Client (RPC)

import pika
import uuid

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

# Queue موقت برای دریافت پاسخ
result = channel.queue_declare(queue='', exclusive=True)
callback_queue = result.method.queue

corr_id = str(uuid.uuid4())
response = None

def on_response(ch, method, props, body):
    global response
    if props.correlation_id == corr_id:
        response = body

channel.basic_consume(queue=callback_queue,
                      on_message_callback=on_response,
                      auto_ack=True)

# ارسال درخواست
channel.basic_publish(exchange='',
                      routing_key='rpc_queue',
                      properties=pika.BasicProperties(
                          reply_to=callback_queue,
                          correlation_id=corr_id
                      ),
                      body=str(5))  # مثال: محاسبه فیبوناچی 5

while response is None:
    connection.process_data_events()
print(f"نتیجه دریافت شد: {response.decode()}")

ویژگی‌های RPC با RabbitMQ

  • ارتباط غیرهمزمان بین Client و Server با تضمین دریافت پاسخ.
  • استفاده از Queue اختصاصی برای پاسخ به هر Client.
  • استفاده از correlation_id برای مطابقت پاسخ با درخواست.

جمع‌بندی

RabbitMQ امکان پیاده‌سازی RPC را با استفاده از صف‌ها، Reply Queue و correlation_id فراهم می‌کند. این الگو برای فراخوانی توابع از راه دور و دریافت نتیجه به صورت مطمئن و غیرهمزمان در سیستم‌های توزیع‌شده کاربردی است.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.