اگر به مبحث CQRS علاقمند هستید و میخواهید بطور کامل و درست اونو تو پروژه های خودتون پیاده سازی کنید و از پرفرمنس اپلیکیشن خود راضی باشید، ریپازیتوری ای که در زیر معرفی می کنم را حتما دنبال کنید.
یکی از مزایای Scalability, CQRS است.
بدون Scale کردن ، کل اپلیکیشن ما درون یک سرور قرار دارد و تنها به منابع یک سرور محدود می شود. با گذشت زمان و رشد اپلیکیشن منابع بیشتری مورد نیاز خواهد بود و باید این سرور را قوی تر کنیم که این ماجرا هزینه بر است.
چونکه عملیات خواندن بیشتر از نوشتن، آپدیت و حذف اطلاعات درخواست می شود درنتیجه بار بیشتری روی کوری های اپلیکیشن هست ، پس جداسازی دیتابیس های Query و Command می تواند تاثیر چشمگیری در سرعت و کارایی اپلیکیشن شما داشته باشد.
بدین ترتیب می توانیم برای عملیات Read، سرور را قویتر و برای باقی عملیات از سرورهای ضعیف تر استفاده کنیم و این چیزی است که توسط Scalability فراهم می شود.
در این پروژه کانتکست ها و ریپازیتوری های خواندن و نوشتن جدا شده است و به این ترتیب میتونید در Query ها از کانتکست یا ریپازیتوری خواندن و در Command ها از کانتکست یا ریپازیتوری نوشتن استفاده کنید.
یک راه برای جداسازی دیتابیس های خواندن و نوشتن استفاده از تکنیک Always On اسکول سرور است که بعد از پیاده سازی آن، شما می توانید کانکشن استرینگ های دیتابیس های خود را در فایل appsettings.json قرار داده و دیتابیس Command و Query اپلیکیشن خود را بدین ترتیب جدا سازی نمایید.
راه حل دیگر می تواند این باشد که در پیاده سازی ریپازیتوری خواندن خود از Dapper ORM برای کوری گرفتن استفاده کنید که کارایی و سرعت آن در مواردی به مراتب بیشتر از ef است.
یک راه بهتر می تواند طراحی دیتابیسی باشد که جداول Denormal و Flat داشته باشد که تمام فیلدهای مورد نیاز درون آن قرارگیرد. سپس با هر بار درج اطلاعات در دیتابیس Command این جداول نیر آپدیت شوند. با داشتن این جداول دیگر نیاز به Join های عجیب و غریب SQL نداریم.
بسته به بیزینس مورد نظر و منابع موجود می توانید از تکنیک ها، ابزارها و دیتابیس های دیگری هم در پیاده سازی های خود استفاده کنید.