وقتی نیازی به پاسخ فوری نیست
بسیاری از ارتباطات بین سرویسها نیازی به پاسخ فوری ندارند. مثلاً وقتی یک سفارش ثبت میشود، سرویس سفارش لازم نیست منتظر بماند تا سرویس ایمیل، پیامک را ارسال کند و سرویس انبار موجودی را کم کند. در این موارد، ارتباط ناهمگام (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()
مزیت اصلی: کاهش وابستگی مستقیم
مزیت بزرگ این روش، جدا شدن سرویسها از یکدیگر است: سرویس سفارش هیچ اطلاعی از تعداد یا هویت مصرفکنندههای پیام ندارد و اگر سرویس ایمیل موقتاً از دسترس خارج شود، پیام در صف باقی میماند و بعداً پردازش میشود، بهجای اینکه کل عملیات شکست بخورد. این ویژگی مقاومت سیستم را در برابر خرابی موقت سرویسهای وابسته بهطور چشمگیری افزایش میدهد و یکی از دلایل اصلی محبوبیت الگوهای رویدادمحور در میکروسرویس است.