الگوی CQRS که مخفف Command and Query Responsibility Segregation است، یک الگوی محبوب است که عملیات به روزرسانی و نوشتن را برای یک مخزن داده جدا می کند. یک مشکل رایج برای بسیار از برنامه های کاربردی نیاز به جداسازی رفتار نوشتن از رفتار خواندن است که با استفاده از الگوی معماری CQRS این مشکل رفع می شود و برای برنامه های کاربردی ثبات، امنیت و مقیاس پذیری را فراهم کرده و علاوه بر آن عملکرد کلی را نیز بهبود می بخشد. علاوه بر این با مهاجرت به CQRS سیستم انعطاف پذیرتر شده بنابراین در طول زمان بهتر تکامل یافته و از ایجاد تداخل ادغام در سطح دامنه در دستورات به روز رسانی جلوگیری می¬کند.
در معماری های سنتی، از مدل داده یکسان برای پرس وجو و به روزرسانی پایگاه داده استفاده می شود. این روش ساده است و برای عملیات اولیه CRUD به خوبی کار می کند ولی در برنامه های پیچیده تر، استفاده از این رویکرد دشوار است. به عنوان مثال، در سمت خواندن، برنامه ممکن است پرس و جوهای مختلفی را انجام دهد و اشیاء انتقال داده (DTO) را با اشکال مختلف برگرداند. نقشه برداری شی می تواند پیچیده شود. در سمت نوشتن، مدل ممکن است اعتبار سنجی پیچیده و منطق تجاری را پیاده سازی کند. در نتیجه، شما می توانید با یک مدل بیش از حد پیچیده روبرو شوید که کارهای زیادی می¬کند.
حجم کار خواندن و نوشتن اغلب نامتقارن و با عملکرد و مقیاس بسیار متفاوت است.
مشکلات موجود پیرامون معماری های سنتی:
• اغلب یک عدم تطابق بین نمایش خواندن و نوشتن داده ها وجود دارد، مانند ستون ها یا ویژگی های اضافی که باید به درستی به روز شوند، حتی اگر به عنوان بخشی از یک عملیات مورد نیاز نباشند.
• زمانی که عملیات به صورت موازی روی یک مجموعه از داده ها انجام شود، اختلاف داده ها ممکن است رخ دهد.
• رویکرد سنتی می تواند به دلیل بارگذاری روی ذخیره داده¬ها و لایه دسترسی به داده ها و پیچیدگی کوئری ها مورد نیاز برای بازیابی اطلاعات، تأثیر منفی بر عملکرد داشته باشد.
• مدیریت امنیت و مجوزها میتواند پیچیده شود، زیرا هر موجودیت تابع عملیات خواندن و نوشتن است، که ممکن است دادهها را در زمینه اشتباه نشان دهد.
راه حل
الگو CQRS خواندن و نوشتن را در مدلهای مختلف جدا میکند و از commandها برای بهروزرسانی دادهها و از queryها برای خواندن دادهها استفاده میکند.
• دستورات (Commandها) باید به جای داده مبتنی بر وظیفه باشند.
• دستورات ممکن است به جای پردازش همزمان در یک صف برای پردازش ناهمزمان قرار گیرند.
• کوئری ها هرگز پایگاه داده را تغییر نمی دهند. یک کوئری یک DTO را برمی گرداند که هیچ دانش دامنه را کپسوله نمی کند.
سپس می توان مدل ها را جدا کرد، همانطور که در نمودار زیر نشان داده شده است، اگرچه این یک الزام مطلق نیست.
مراجع