الگوی CQRS چه زمانی جواب میدهد و چه هزینهای دارد؟
تحلیل صادقانه جدا کردن مسیر نوشتن از خواندن: از کجا شروع کنیم، چه هزینهای روی پیچیدگی میگذارد و چه موقع این الگو صرفاً تجملات معماری است.
مهندس مهرداد کبیریمهندس ارشد بکاند و زیرساخت
CQRS آن الگویی است که همه دربارهاش حرف میزنند اما کمتر تیمی هزینه واقعیاش را میشمارد. در این مقاله، بر اساس تجربه دو پروژه واقعی، مرز دقیق سود و زیان این الگو را میکشیم.
وقتی نوشتن و خواندن واقعاً فرق میکنند
CQRS زمانی توجیه دارد که شکل دادهای دو مسیر متفاوت باشد؛ مثلاً:
- نوشتن: تراکنش سنگین چندجدولی با اعتبارسنجی سختگیرانه.
- خواندن: پروجکشنهای آماده برای لیستها با صفحهبندی و فیلترهای متنوع.
اگر هر دو مسیر یک جدول را با همان شکل میخوانند و مینویسند، CQRS فقط دو برابر کردن کد با یک انتقال داده در میان است.
-- مسیر نوشتن: تراکنش سفارش (همچنان OLTP معمولی)
BEGIN;
INSERT INTO orders (id, customer_id, total) VALUES ($1, $2, $3);
INSERT INTO order_items (order_id, sku, qty) VALUES ($1, $4, $5);
-- رویداد برای بهروزرسانی پروجکشن خواندن
NOTIFY order_created, $1;
COMMIT;
-- مسیر خواندن: پروجکشن آماده نمایش — بدون join سنگین
CREATE MATERIALIZED VIEW orders_list AS
SELECT o.id, o.total, c.name, count(i.sku) AS items
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN order_items i ON i.order_id = o.id
GROUP BY o.id, c.name;
سه هزینهای که باید از روز اول بپذیرید
- تاخیر هماهنگی: پروجکشن چند میلیثانیه تا چند ثانیه عقبتر است؛ رابط کاربری باید این واقعیت را نشان دهد.
- بازسازی پروجکشن: هر تغییر اسکیما یعنی migration دوطرفه و مهاجرت داده.
- دو مسیر تست: unit testها باید هم منطق فرمان و هم پروجکشن را پوشش دهند.
هر الگوی معماری، یک وام است: امروز سرعت میگیرید، فردا بهره آن را با پیچیدگی میپردازید.
کجا شروع کنیم؟
پیشنهاد ما همیشه یکسان است: اول monolith تمیز با یک جدول خواندنیِ مجزا (view یا materialized view). اگر بعد از اندازهگیری، همین یک جدایی کافی بود، همانجا متوقف شوید؛ اگر نه، تازه به سمت جدا کردن سرویسها فکر کنید.
| وضعیت | توصیه |
|---|---|
| ترافیک خواندن کمتر از ۲۰۰ درخواست بر ثانیه | CQRS لازم نیست |
| پروجکشنهای متنوع و گزارشهای سنگین | با view شروع کنید |
| چند تیم روی یک مدل داده با تعارض اسکیما | جدا کردن کامل توجیه دارد |
نتیجهگیری
CQRS یک پرچم پیروزی نیست؛ ابزاری است برای درد مشخص. اگر درد شما تضاد شکل داده بین نوشتن و خواندن است، آن را بخرید؛ در غیر این صورت، همان monolith خوب را تمیز نگه دارید.
برچسبها
مهندس مهرداد کبیری
مهندس ارشد بکاند و زیرساختدرباره نویسنده
تخصص در معماریهای توزیعشده، کشینگ سطح لبه و بهینهسازی عملکرد وباپلیکیشنهای پرمصرف در فینتک.
مقالات نویسنده

