فصل سوم: ارتباط بین سرویس‌ها

پیام‌رسانی ناهمگام با RabbitMQ

وقتی نیازی به پاسخ فوری نیست

بسیاری از ارتباطات بین سرویس‌ها نیازی به پاسخ فوری ندارند. مثلاً وقتی یک سفارش ثبت می‌شود، سرویس سفارش لازم نیست منتظر بماند تا سرویس ایمیل، پیامک را ارسال کند و سرویس انبار موجودی را کم کند. در این موارد، ارتباط ناهمگام (Asynchronous) از طریق یک صف پیام (Message Queue) راه‌حل بهتری است.

RabbitMQ یکی از محبوب‌ترین بروکرهای پیام است. در این مدل، سرویس تولیدکننده (Producer) پیام را در یک صف قرار می‌دهد و بلافاصله کار خودش را ادامه می‌دهد؛ سرویس‌های مصرف‌کننده (Consumer) هروقت آماده باشند، پیام را از صف می‌خوانند و پردازش می‌کنند:

import pika
import json

connection = pika.BlockingConnection(pika.ConnectionParameters("rabbitmq"))
channel = connection.channel()
channel.queue_declare(queue="order_created")

message = json.dumps({"order_id": 1234, "total": 250000})
channel.basic_publish(exchange="", routing_key="order_created", body=message)
connection.close()

مزیت اصلی: کاهش وابستگی مستقیم

مزیت بزرگ این روش، جدا شدن سرویس‌ها از یکدیگر است: سرویس سفارش هیچ اطلاعی از تعداد یا هویت مصرف‌کننده‌های پیام ندارد و اگر سرویس ایمیل موقتاً از دسترس خارج شود، پیام در صف باقی می‌ماند و بعداً پردازش می‌شود، به‌جای اینکه کل عملیات شکست بخورد. این ویژگی مقاومت سیستم را در برابر خرابی موقت سرویس‌های وابسته به‌طور چشمگیری افزایش می‌دهد و یکی از دلایل اصلی محبوبیت الگوهای رویدادمحور در میکروسرویس است.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.