CodeShot

Message Queue در مقابل Pub/Sub

Message Queue (مثل Azure Queue یا RabbitMQ Queue) یک پیام را فقط به یک مصرف‌کننده تحویل می‌دهد و پس از پردازش از صف حذف می‌شود، مناسب برای توزیع کار بین چند worker؛ Pub/Sub (مثل Azure Service Bus Topics) یک پیام را به همه مشترکین علاقه‌مند به‌طور همزمان تحویل می‌دهد.

ویژگیMessage QueuePub/Sub
تعداد مصرف‌کننده هر پیامدقیقاً یکهمه مشترکین
الگوی اصلیتوزیع بار کاری (Load Balancing)اطلاع‌رسانی رویداد (Event Notification)
مثال فناوریAzure Queue Storage / RabbitMQ QueueAzure 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.