RabbitMQ چیست؟
Message Broker متنباز و پرکاربرد که پیام را بین سرویسها بهصورت غیرهمزمان و قابلاعتماد صفبندی و تحویل میدهد.
چرا مهم است؟
برای عملیاتی که نباید کاربر منتظر اتمامشان بماند (ارسال ایمیل، پردازش تصویر، بهروزرسانی موجودی)، RabbitMQ اجازه میدهد سرویس درخواستدهنده فوراً پاسخ بدهد و کار واقعی در پسزمینه پردازش شود.
تعریف
RabbitMQ پیامها را از یک Producer دریافت، در یک Queue نگه میدارد و به یک یا چند Consumer تحویل میدهد؛ اگر Consumer در دسترس نباشد، پیام تا برگشتش در صف میماند (قابلیت اطمینان تحویل).
مثال مفهومی
// Producer: انتشار پیام سفارش جدید
channel.BasicPublish(exchange: "orders", routingKey: "order.created",
body: JsonSerializer.SerializeToUtf8Bytes(orderEvent));
// Consumer: پردازش پیام در سرویس دیگر
consumer.Received += async (sender, args) =>
{
var order = JsonSerializer.Deserialize<OrderCreatedEvent>(args.Body.Span);
await _emailService.SendConfirmationAsync(order);
channel.BasicAck(args.DeliveryTag, multiple: false);
};
مفاهیم کلیدی
- Exchange: پیام ورودی را بر اساس قانون (مستقیم، Topic، Fanout) به Queueهای مناسب مسیریابی میکند.
- Ack/Nack: Consumer باید صریحاً تأیید کند پیام را پردازش کرده (
Ack)، وگرنه RabbitMQ دوباره تحویلش میدهد.
اشتباه رایج
❌ پردازش پیام بدون Idempotency (طراحی برای تحمل اجرای تکراری) — چون تحویل پیام میتواند در شرایط خاص (قطعی شبکه بعد از پردازش، قبل از Ack) دوباره اتفاق بیفتد، Consumer باید طوری نوشته شود که پردازش دوباره یک پیام (مثلاً یک ایمیل تکراری) خطرناک نباشد.
منبع و مطالعه بیشتر
خلاصه
RabbitMQ پیامها را بین سرویسها بهصورت غیرهمزمان و قابلاعتماد صفبندی میکند، با Exchange برای مسیریابی و Ack برای تأیید پردازش. Consumer باید برای تحمل تحویل تکراری پیام (Idempotent) طراحی شود. مرجع کامل: RabbitMQ Tutorials رسمی.
