بازگشت به کتابخانهکتابخانه4.2Message Queue و Pub/Sub
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 4.2فصل ۴Cache، Queue و جریان

Message Queue و Pub/Sub

  • ~۱۲ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

در رستوران، گارسون سفارش را روی برگه می‌نویسد، به ریل آشپزخانه می‌زند، و برمی‌گردد سر میز. مشتری همان لحظه می‌شنود «سفارشت ثبت شد». غذا وقتی آماده شد می‌آید. گارسون معطل سرخ‌کردن سیب‌زمینی نمی‌ماند. در سیستم به آن ریل می‌گویند Message Queue.

شغل Queue این است که Producer و Consumer را از هم جدا کند. اپ فقط رویداد را ثبت می‌کند و می‌رود؛ کار سنگین بعداً، با سرعتِ Worker، انجام می‌شود. اسم این کار Decoupling است. ستون سیستم‌های مقاوم همین است.

ریل سفارش رستوران و آشپزخانه
گارسون برگه را به ریل می‌زند و برمی‌گردد سر میز. آشپز با سرعت خودش برمی‌دارد. مشتری معطل سرخ‌کردن نمی‌ماند — همان شغل Message Queue.
DIAGRAMپردازش Async بعد از ثبت سفارش
Producer — ثبت سفارش
Queue — Kafka / RabbitMQ
Worker 1
Worker 2
DB / Email / انبار

چرا اصلاً صف؟

سه درد را یک ریل حل می‌کند. اگر هر سه را با تماس مستقیم — synchronous — بخواهی حل کنی، ثبت سفارش به ایمیل و انبار گره می‌خورد و هر کدام که خوابید، صندوق هم می‌خوابد.

  • جذب Peak: جمعه سیاه ۱۰۰K سفارش در دقیقه می‌آید؛ Worker ها با سرعت خودشان خالی می‌کنند. هیچ‌چیز نمی‌سوزد.
  • Fault Tolerance: سرویس ایمیل خواب است؟ پیام‌ها روی ریل می‌مانند تا بیدار شود. سفارش گم نمی‌شود.
  • Decoupling تیم‌ها: Producer لازم نیست بداند چه کسانی مصرف می‌کنند. انبار فردا اضافه می‌شود، کد ثبت سفارش عوض نمی‌شود.

یک کارگر، یا همه بشنوند

ریل آشپزخانه یک شغل دارد: هر برگه را یک آشپز برمی‌دارد. بلندگوی سالن شغل دیگری دارد: «سفارش ۴۲ آماده است» را هم صندوق می‌شنود، هم پیک، هم مشتری. این دو را قاطی نکن.

Queue
هر پیام را دقیقاً یک Worker برمی‌دارد. توزیع کار: ارسال ایمیل، رمزگذاری ویدیو، ساخت تصویر بندانگشتی.
Pub/Sub
هر پیام به همه مشترک‌ها می‌رسد. «سفارش ثبت شد» را هم انبار می‌شنود، هم مالی، هم نوتیفیکیشن.
Kafka
یک لاگ پارتیشن‌بندی‌شده و ماندگار. ترتیب داخل هر Kafka Partition حفظ است. Consumer Offset خودش را جلو می‌برد — Replay ممکن است.
Consumer Group
چند instance از یک سرویس، تکه‌های لاگ را بین خود قسمت می‌کنند. Horizontal Scaling مصرف، بدون اینکه یک پیام دو بار به همان سرویس برسد.

تضمین تحویل — جای باگ‌های واقعی

«حتماً می‌رسد» سه معنی دارد. اگر فرقشان را ندانی، یا پیام گم می‌کنی، یا یک ویدیو را دو بار رمز می‌کنی و فایل خراب می‌شود.

At-most-once
شاید گم شود، هرگز تکرار نه. برای متریک بی‌اهمیت. اگر ایمیل بازاریابی نرسید، دنیا نمی‌ایستد.
At-least-once
هرگز گم نمی‌شود، شاید تکرار شود. پیش‌فرض عملی. پس Consumer باید Idempotent باشد.
Exactly-once
گران و مشروط. در عمل همان At-least-once است به‌اضافه Consumer Idempotent — مثلاً با event_id یکتا و upsert.
  • DLQ: پیامی که n بار شکست، کنار گذاشته و هشدار می‌شود. پیام سمی نباید تا ابد Queue را مسموم کند.
  • Backpressure: اگر تولید همیشه از مصرف بیشتر است، Queue بی‌نهایت رشد می‌کند. یا Worker را Scale Out کن، یا تولید را محدود کن.
  • ترتیب: فقط داخل یک Kafka Partition تضمین است. پیام‌های یک سفارش را با کلید همان order_id بفرست تا همه به یک تکه بروند.

به زبان ساده

گارسون برگه را به ریل می‌زند و برمی‌گردد سر میز؛ آشپز با سرعت خودش می‌پزد. آن ریل Message Queue است.

مثال واقعی

سفارش همان لحظه ثبت می‌شود؛ ایمیل در Queue می‌ماند. اگر سرویس ایمیل خوابید، سفارش گم نمی‌شود.

دانش‌سنجی

آزمون درس

۴ Q
01
مهم‌ترین دلیل گذاشتن Queue بین ثبت سفارش و ارسال ایمیل؟
02
با تحویل At-least-once، Consumer باید…
03
ترتیب پیام‌های یک سفارش در Kafka چطور حفظ می‌شود؟
04
پیامی مدام crash می‌دهد و برمی‌گردد به صف. راه درست؟