الگوی معماری CQRS چیست؟

الگوی CQRS (Command Query Responsibility Segregation) یک الگوی طراحی هستش که عملیات‌های خواندن (Read) و نوشتن (Write) را برای یک پایگاه داده را از هم جدا می‌کند. این الگو به بهبود عملکرد، مقیاس‌پذیری و امنیت برنامه‌ها کمک میکنه و از مدل‌های مختلف برای به‌روزرسانی داده‌ها (دستورات - Command) و خواندن داده‌ها (پرس‌وجوها - Query) استفاده می‌کند.

دستورات - Command : عملیات‌هایی که حالت برنامه را تغییر می‌دهند، مانند عملیات‌های ایجاد، به‌روزرسانی یا حذف

پرس‌وجوها - Query : عملیات‌هایی که داده‌ها را بدون تغییر آن‌ها بازیابی می‌کنند (دریافت اطلاعات)

هدف ما این هستش که سیستم فروشگاه ساز پیشرفته رو با گولنگ پیاده سازی کنیم و در نهایت روی کوبرنتیز دیپلوی اجرا کنیم یعنی ۰ تا ۱۰۰ یه پروژه گولنگی . به زودی ویدیوی این آموزش ها در وبسایت uncodev منتشر خواهند شد.


مزایای CQRS

  • مقیاس‌پذیری: جدا کردن عملیات‌های خواندن و نوشتن اجازه می‌دهد هر کدام به طور مستقل مقیاس‌پذیر شوند مثلا اگر واسه عملیات خواندن از الستیک استفاده میکنیم و لود سنگینی روی خواندن دیتا داریم الستیک رو ارتقا میدیم.
  • عملکرد: عملیات‌های خواندن می‌توانند بهینه شوند بدون تأثیر بر عملیات‌های نوشتن و برعکس.
  • انعطاف‌پذیری: مدل‌های داده‌های مختلف می‌توانند برای خواندن و نوشتن استفاده شوند و این امکان را می‌دهد که داده‌ها به طور مؤثرتری مدیریت شوند.
  • امنیت: الگوهای دسترسی و مجوزهای مختلف می‌توانند برای عملیات‌های خواندن و نوشتن اعمال شوند.


چالش‌ها

  • پیچیدگی: معماری سیستم پیچیده‌تر می‌شود و نیاز به مدیریت دقیق سازگاری و همگام‌سازی داده‌ها دارد.
  • تأخیر: سازگاری نهایی (eventual consistency) می‌توانند تأخیر در دسترس بودن داده‌های به‌روزرسانی شده در طرف پرس‌وجو را ایجاد کند.
  • بار توسعه: پیاده‌سازی و نگهداری مدل‌ها و مکانیزم‌های همگام‌سازی جداگانه می‌تواند باعث افزایش هزینه شود.


اگه بخوام یه مثال ساده برای الگوی CQRS بزنم این هستش که بیام یه فروشگاه رو مثال بزنم با کلی محصول. شما فرض کنید یه فروشگاه مثل دیجیکالا کلی محصول داره و این محصولات باید مدام اپدیت بشه اطلاعاتشون ، حالا ما میخوایم بیایم و از این الگو استفاده کنیم و برای اطلاعات محصولات یه دیتابیس مثل mysql در نظر بگیریم و به عنوان دیتابیس Write ازش استفاده کنیم، بعد یه سرویس ایندکسر با یه مسیج بروکر پیاده سازی میکنیم که میاد و این اطلاعات رو با هر فرمتی که میخوایم میریزیم توی الستیک سرچ و از الستیک به عنوان دیتابیس Read استفاده میکنیم. این وسط ممکنه یه تاخیر توی بروزرسانی اطلاعات به وجود بیاد (سازگاری نهایی - eventual consistency) و وقتی یه دیتا میخواد خونده بشه دیرتر با نسخه اصلی دیتا که توی mysql هستش یکی بشه و به ثبات برسه. اما مزیتش چیه؟ ما میتونیم به صورت مستقل الستیک رو ارتقا بدیم تا لود بیشتری رو تحمل کنه برای قسمت Read . کلیت این CQRS همینه.