CQRS مخفف Command Query Responsibility Segregation به معنای تفکیک مسئولیت فرمان و پرسوجو است. این الگو بیان میکند که:
Command (فرمان): عملیاتی است که وضعیت سیستم را تغییر میدهد.
Query (پرسوجو): عملیاتی است که فقط داده را واکشی میکند و هیچ تغییری ایجاد نمیکند.
برخلاف معماری CRUD سنتی که همهٔ عملیات در یک مدل انجام میشوند، در CQRS مدل خواندن و مدل نوشتن بهطور کامل جدا هستند.
این جداسازی مزیتهای فوقالعادهای دارد که در ادامه بهطور کامل بررسی میکنیم.
۱۰ دلیل که شما راقانع می کند که چرا CQRS در معماری مدرن حیاتی است
۱. جداسازی روشن مسئولیتها (Separation of Concerns)
CQRS جداسازی واضحی میان عملیات خواندن و نوشتن ایجاد میکند که این موضوع باعث میشود کد قابلدرکتر و نگهداری آن سادهتر شود.
مثال:
در یک سیستم مدیریت محتوا، بخش نوشتن مسئول ایجاد و ویرایش محتواست، در حالی که بخش خواندن محتوا را به کاربران نمایش میدهد. جداسازی این دو بخش باعث افزایش ماژولار بودن کد و امکان ایجاد تغییرات در یک بخش بدون تأثیرگذاری روی بخش دیگر میشود.
مثال در سی شارپ:
public record CreateOrderCommand(int UserId, decimal TotalPrice);
public class CreateOrderCommandHandler
{
public Task Handle(CreateOrderCommand cmd)
{
// تغییر وضعیت سیستم
}
}
public record GetOrderQuery(int OrderId);
public class GetOrderQueryHandler
{
public Task<OrderDto> Handle(GetOrderQuery query)
{
// فقط خواندن داده
}
}
۲. مقیاسپذیری مستقل خواندن و نوشتن
در بسیاری از سیستمها، ۸۰ تا ۹۰ درصد عملیات، خواندن داده است.
با CQRS میتوان:
عملیات خواندن را روی چند سرور جداگانه مقیاس کرد
سیستم را بدون افزایش هزینههای سنگین توسعه یا سختافزار گسترش داد
مثال واقعی:
Write Database: SQL Server
Read Database: Elasticsearch / Redis
۳. عملکرد بهینهتر (Performance Optimization)
با جدا شدن مدلها:
مدل خواندن میتواند denormalized باشد
مدل نوشتن میتواند کاملاً نرمال و مطابق قوانین تجاری باشد
این یعنی سریعترین پرسوجوهای ممکن و مطمئنترین عملیات نوشتن.
۴. سادهسازی منطق پیچیده دامنه
منطق سنگین و قوانین تجاری میتوانند در Command Handler بهصورت کامل مدیریت شوند.
Queryها دیگر شلوغ نمیشوند و فقط داده را برمیگردانند.
۵. سازگاری کامل با Event Sourcing
CQRS و Event Sourcing بهترین ترکیب ممکن هستند.
در Event Sourcing بهجای ذخیرهٔ وضعیت نهایی، رویدادها ذخیره میشوند:
OrderPlaced
OrderCancelled
OrderShippedاین یعنی:
تاریخچهٔ کامل
بازیابی سادهٔ وضعیت
قابلیت audit بسیار قوی
۶. استفاده از دیتابیسهای متفاوت
در CQRS این انعطاف را دارید که برای عملیات مختلف از دیتابیسهای مناسب استفاده کنید:
مثال:
Write Model → SQL Server (برای ACID و امنیت داده)
Read Model → MongoDB، Elasticsearch یا Redis
۷. امنیت بهتر
مسیرهای Command و Query جدا هستند، بنابراین:
محدودیتهای امنیتی متفاوت
کنترل دسترسی آسانتر
جلوگیری از تغییر ناخواستهٔ دادهها
مثال:
تعیین نقشها فقط برای فرمانها:
[Authorize(Roles = "Admin")]
public class DeleteUserCommandHandler {}
۸. تستپذیری فوقالعاده بالا
چون Command Handler و Query Handler مستقل هستند:
بهراحتی تست واحد مینویسید
بدون وابستگیهای اضافی
۹. تکاملپذیری و توسعهٔ آیندهمحور (Evolvability)
وقتی خواندن و نوشتن از هم جدا باشد:
اضافه کردن قابلیت جدید آسان است
refactoring بدون نگرانی انجام میشود
توسعهٔ سیستم در آینده مطمئنتر است
۱۰. وضوح نیت (Clearer Intent)
نام Command و Queryها دقیقاً مشخص میکند چه اتفاقی میافتد:
CreateOrderCommand
GetOrdersByUserQuery
CancelOrderCommandاین شفافیت باعث افزایش کیفیت معماری میشود.
💻 مثال ترکیبی C# – ساختار کامل CQRS
// Command public record RegisterUserCommand(string Name, string Email);
// Command Handler public class RegisterUserHandler
{
public Task Handle(RegisterUserCommand cmd)
{
// Validate + Create User + Save
}
}
// Query public record GetUserByIdQuery(int Id);
// Query Handler public class GetUserByIdHandler
{
public Task<UserDto> Handle(GetUserByIdQuery query)
{
// Return read model
}
}
📌 چه زمانی از CQRS استفاده کنیم؟
مناسب برای:
سیستمهای بزرگ (مالی، حملونقل، فروشگاهی، دولتی)
نرمافزارهای دارای بار سنگین خواندن
پروژههای حوزهٔ DDD
میکروسرویسها
سیستمهای Event-driven
مناسب نیست برای:
پروژههای کوچک
اپلیکیشنهای CRUD ساده
تیمهایی که تجربهٔ معماری ندارند
نتیجهگیری
CQRS یک الگوی قدرتمند و آیندهمحور است که:
پیچیدگی را کاهش میدهد
عملکرد را افزایش میدهد
مقیاسپذیری را بهبود میدهد
امنیت و تستپذیری را تقویت میکند
اگر در حال توسعهٔ سیستمهای مدرن، مخصوصاً با ASP.NET Core و C# هستید، CQRS میتواند معماری شما را متحول کند.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید