Message Queue در مقابل Pub/Sub
Message Queue (مثل Azure Queue یا RabbitMQ Queue) یک پیام را فقط به یک مصرفکننده تحویل میدهد و پس از پردازش از صف حذف میشود، مناسب برای توزیع کار بین چند worker؛ Pub/Sub (مثل Azure Service Bus Topics) یک پیام را به همه مشترکین علاقهمند بهطور همزمان تحویل میدهد.
| ویژگی | Message Queue | Pub/Sub |
|---|---|---|
| تعداد مصرفکننده هر پیام | دقیقاً یک | همه مشترکین |
| الگوی اصلی | توزیع بار کاری (Load Balancing) | اطلاعرسانی رویداد (Event Notification) |
| مثال فناوری | Azure Queue Storage / RabbitMQ Queue | Azure Service Bus Topic / RabbitMQ Exchange |
| مناسب برای | صف پردازش کار (Job Processing) | معماری رویدادمحور (Event-Driven) |
کِی از Message Queue استفاده کنیم؟
وقتی میخواهید یک کار مشخص (مثل پردازش سفارش) دقیقاً یکبار توسط یکی از چند worker موازی انجام شود، از الگوی Message Queue استفاده کنید — Load Balancing طبیعی بین مصرفکنندگان.
کِی از Pub/Sub استفاده کنیم؟
وقتی یک رویداد باید بهطور مستقل توسط چند سرویس مختلف پردازش شود (مثلاً "سفارش ثبت شد" باید هم به سرویس ایمیل، هم انبار، هم گزارشگیری اطلاع داده شود)، از الگوی Pub/Sub استفاده کنید.
مثال Message Queue
// Queue: only ONE worker processes each message
await queueClient.SendMessageAsync(JsonSerializer.Serialize(order));
// Multiple workers compete; each message goes to exactly one of them
مثال Pub/Sub
// Pub/Sub: EVERY subscriber gets its own copy
await topicClient.SendAsync(new ServiceBusMessage(orderCreatedEvent));
// EmailService, InventoryService, and ReportingService each get a copy
اشتباه رایج
استفاده از یک Queue ساده برای رویدادی که چند سرویس مستقل باید از آن مطلع شوند — چون هر پیام فقط یکبار مصرف میشود، فقط اولین مصرفکنندهای که پیام را میگیرد آن را پردازش میکند و بقیه سرویسها هرگز از رویداد باخبر نمیشوند. راهحل درست Pub/Sub با یک صف مجزا برای هر مشترک است.
جمعبندی
توزیع کار بین workerها (هر کار فقط یکبار) → Message Queue؛ اطلاعرسانی رویداد به چند سرویس مستقل → Pub/Sub.
