بازگشت به کتابخانهکتابخانه5.3معماری رویدادمحور، CQRS و Event Sourcing
طراحی سیستم نرم‌افزاری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 5.3فصل ۵معماری نرم‌افزار

معماری رویدادمحور، CQRS و Event Sourcing

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

در بانک، وقتی پولی جابه‌جا می‌شود، صندوق‌دار بقیه شعب را زنگ نمی‌زند. یک برگه «این اتفاق افتاد» در سینی اخبار می‌گذارد. شعبه وام، شعبه تقلب، شعبه پیامک — هرکدام اگر خواستند برمی‌دارند و کار خودشان را می‌کنند، بدون اینکه صندوق‌دار منتظرشان بماند. به این خبر Event می‌گویند.

معماری‌ای که روی همین خبرها می‌چرخد Event-driven است — کوتاه‌شده‌اش EDA. سرویس‌ها به‌جای صدازدن مستقیم هم، واقعیت رخ‌داده را منتشر می‌کنند: OrderPlaced، PaymentFailed. مصرف‌کننده‌ها مستقل واکنش نشان می‌دهند. اتصال سست می‌شود؛ توسعه آزادتر.

صندوق بانک و سینی خبر برای شعبه‌های دیگر
صندوق‌دار برگه را در سینی می‌گذارد؛ حسابدار و پیک و بایگان هرکدام جدا برمی‌دارند. Event یعنی «شد»؛ ناشر منتظر شنونده نمی‌ماند.

خبر در برابر دستور

اگر این دو را قاطی کنی، یا سرویسی می‌سازی که باید بداند چه کسی گوش می‌دهد، یا فرمانی می‌فرستی که هیچ‌کس مسئول انجامش نیست.

Event
خبرِ رخ‌داده. «شد». چندمخاطبه است. ناشر نمی‌داند و نمی‌پرسد چه کسی گوش می‌دهد — و همین اتصال را سست می‌کند.
Command
دستور. «بکن». تک‌مخاطبه است. یک گیرنده مشخص باید انجامش دهد. فرهنگ EDA روی Event است، نه روی Command.
Outbox
مشکل: نوشتن در DB و انتشار Event باید با هم اتمی باشند. شغل Outbox این است که خبر را در همان تراکنش، داخل همان دفتر، در سینی خروجی بگذارد؛ Relay بعداً از روی سینی به صف می‌فرستد. نه گم می‌شود، نه دروغ.

CQRS: دو مدل برای دو کار

آشپزخانه بلیت پخت می‌نویسد — قواعد و تراکنش. تابلوی سالن چیز دیگری نشان می‌دهد: غذاهای آماده، زمان انتظار. این دو شکل یکی نیستند. CQRS شغلش جدا کردن مدل نوشتن از مدل خواندن است. Event ها نمای خواندنی را به‌روز می‌کنند.

جایی می‌ارزد که شکل خواندن و نوشتن خیلی فرق دارد — فید، گزارش، جستجو. بها: پیچیدگی، و سازگاری نهایی بین دو مدل. برای یک CRUD ساده نخرش.

Event Sourcing: خودِ برگه‌ها حقیقت‌اند

به‌جای ذخیره «موجودی فعلی»، همه Event ها را Append-only نگه می‌داری. وضعیت = بازپخش برگه‌ها — با Snapshot برای اینکه هر بار از روز اول نخوانی. حسابرسی کامل، بازسازی هر لحظه از گذشته، دیباگ رؤیایی. بها: پیچیدگی جدی و مهاجرت schema سخت.

جای درستش جایی است که «چطور به اینجا رسیدیم» خودِ داده است: دفتر کل مالی، انبارداری، ویرایشگر مشترک. وبلاگ شخصی این قیمت را نمی‌ارزد.

به زبان ساده

Event می‌گوید چه شد؛ بقیه مستقل واکنش می‌دهند. Outbox اتمی‌اش می‌کند. CQRS خواندن را از نوشتن جدا می‌کند. Event Sourcing خودِ تاریخچه را حقیقت می‌داند.

مثال واقعی

صندوق‌دار بانک بقیه را زنگ نمی‌زند؛ برگه «این اتفاق افتاد» را در سینی می‌گذارد. هرکس کار خودش را می‌کند.

دانش‌سنجی

آزمون درس

۴ Q
01
فرق Event با Command چیست؟
02
Outbox چه مشکلی را حل می‌کند؟
03
CQRS کجا می‌ارزد؟
04
کدام سیستم نامزد طبیعی Event Sourcing است؟