الگوی 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 فراهم میکند. این الگو برای فراخوانی توابع از راه دور و دریافت نتیجه به صورت مطمئن و غیرهمزمان در سیستمهای توزیعشده کاربردی است.