Mamy dużą witrynę z wiadomościami, która ma duży ruch w sieci. Architektura to często spotykana baza danych - warstwa repo - warstwa usług - Asp.Net MVC. Problem, który widzieliśmy, dotyczy wydajności odczytu. Okazuje się, że te wszystkie obiekty w domenie DDD są świetne teoretycznie dla reguł biznesowych, ale utrudniają życie, jeśli chodzi o optymalizację wydajności odczytu.
Jako rozwiązanie rozważam coś zupełnie nowego (dla nas): użycie noSQL. Chciałbym użyć bazy danych noSQL do prezentacji danych na naszej stronie internetowej. Nie możemy pozbyć się naszego SQL Servera (przynajmniej nie w najbliższym czasie), ale wydaje mi się, że praktycznym krokiem byłoby użycie Mongo jako bazy danych zapytań dla wszystkich nowych rozwiązań.
Moje pytanie brzmi, czy można używać programu SQL Server jako bazy danych rekordów i Mongo jako bazy danych zapytań razem ?
Kiedy więc jeden z naszych redaktorów zaktualizuje rekord, dane będą przechowywane w SQL Server. Jest to konieczne, ponieważ istnieje zbyt wiele starszego kodu, którego nie można ponownie napisać z dnia na dzień.
Ale kiedy przeglądający w witrynie przegląda artykuł lub listę artykułów, chciałbym skorzystać z wydajności Mongo kontra SQL Server. Aby dane były nieco aktualne, powiedzmy 15 minut lub mniej, dane programu SQL Server musiałyby odświeżyć Mongo. RDBMS ma narzędzia do replikacji do takich operacji i zastanawiam się, czy istnieje coś takiego do zrobienia od SQL Server do Mongo. Może serwer Lync?
źródło
Odpowiedzi:
Wystąpił problem, który wielu ma przed sobą ... baza danych zoptymalizowana pod kątem odczytu rzadko jest dobra pod względem wydajności zapisu i odwrotnie. Jednym z podejść, które ewoluowało z tego ograniczenia odczytu i zapisu, jest CQRS (Segregacja Odpowiedzialności za Polecenia). Mimo że Wikipedia łączy oba systemy, CQRS i CQS są technicznie różne. CQS wymaga po prostu, aby metoda albo dokonała zmiany (polecenia), albo zapytała informacji (zapytania), nigdy nie obu.
CQRS idzie o krok dalej i określa, że masz osobny model dla zapytań i poleceń. Ten pojedynczy krok umożliwia między innymi oddzielenie bazy danych do odczytu i zapisu. Właśnie to chcesz zrobić.
Nie mogę powiedzieć, że jestem ekspertem od Mongo lub konfiguruję go do pracy z SQL Server. Ale z mojego zrozumienia, ludzie używają Mongo jako zdormalizowanego widoku ich transakcyjnej bazy danych. Aktualizowanie Mongo z transakcyjnej bazy danych może sprowadzać się do uruchomienia agenta SQL. Lub posiadanie oddzielnej usługi do sondowania bazy danych.
Jeszcze lepszą alternatywą byłoby, aby twoja usługa Dowodzenia wyzwoliła zdarzenie za każdym razem, gdy wykonywana jest aktualizacja. Miałbyś wtedy usługę, która nasłuchiwała tego zdarzenia i aktualizowała MongoDB o te informacje. Jest to podstawowe podejście do pozyskiwania zdarzeń (poszukiwanie źródła zdarzeń na stronie).
Greg Young, jeden z liderów myśli w świecie DDD, pisze obecnie książkę z serii Fowler Signature na CQRS pod tytułem Event-Centric (kiedyś CQRS). Fowler napisał post na swoim blogu opisujący podejście
źródło
Tak. W moim obecnym projekcie pobieramy dane i przechowujemy je w SQL Server, a następnie budujemy indeksy wyszukiwania za pomocą Lucene / Solr i przechowujemy je w MongoDB. Jednak wypełnianie MongoDB odbywa się za pomocą niestandardowego modułu ładującego - bez replikacji programu SQL Server lub automatycznego odświeżania.
źródło