Napisałem tę odpowiedź około cztery lata temu i moje zdanie się nie zmieniło. Ale od tego czasu nastąpił znaczny rozwój w dziedzinie mikrousług. Na końcu dodałem uwagi dotyczące mikrousług ...
Zastanowię się nad tym pomysłem, mając doświadczenie w świecie rzeczywistym, aby poprzeć mój głos.
Zostałem przeniesiony do dużej aplikacji, która miała pięć kontekstów dla jednej bazy danych. Ostatecznie usunęliśmy wszystkie konteksty oprócz jednego - wracając do jednego kontekstu.
Na początku pomysł wielu kontekstów wydaje się dobrym pomysłem. Możemy podzielić dostęp do danych na domeny i zapewnić kilka czystych, lekkich kontekstów. Brzmi jak DDD, prawda? Uprościłoby to nasz dostęp do danych. Kolejny argument przemawia za wydajnością, ponieważ uzyskujemy dostęp tylko do potrzebnego kontekstu.
Ale w praktyce, wraz z rozwojem naszej aplikacji, wiele naszych tabel łączyło relacje w różnych kontekstach. Na przykład zapytania do tabeli A w kontekście 1 wymagały również dołączenia do tabeli B w kontekście 2.
Pozostało nam kilka kiepskich wyborów. Możemy powielić tabele w różnych kontekstach. Próbowaliśmy tego. Stworzyło to kilka problemów z mapowaniem, w tym ograniczenie EF, które wymaga, aby każda jednostka miała unikalną nazwę. Skończyło się na tym, że w różnych kontekstach istniały byty Person1 i Person2. Można argumentować, że był to zły projekt z naszej strony, ale pomimo naszych najlepszych starań, tak właśnie nasza aplikacja wzrosła w prawdziwym świecie.
Próbowaliśmy także zapytać w obu kontekstach, aby uzyskać potrzebne dane. Na przykład nasza logika biznesowa zapytałaby o połowę tego, czego potrzebowała z kontekstu 1, a druga połowa z kontekstu 2. Miało to kilka poważnych problemów. Zamiast wykonać jedno zapytanie w jednym kontekście, musieliśmy wykonać wiele zapytań w różnych kontekstach. Ma to prawdziwy wpływ na wydajność.
W końcu dobrą wiadomością jest to, że łatwo było usunąć wiele kontekstów. Kontekst ma być lekkim przedmiotem. Nie sądzę więc, aby wydajność była dobrym argumentem dla wielu kontekstów. W prawie wszystkich przypadkach uważam, że pojedynczy kontekst jest prostszy, mniej skomplikowany i prawdopodobnie będzie działał lepiej, i nie będziesz musiał wdrożyć wielu obejść, aby go uruchomić.
Pomyślałem o jednej sytuacji, w której przydatne może być wiele kontekstów. Osobny kontekst może być wykorzystany do rozwiązania fizycznego problemu z bazą danych, w której faktycznie zawiera więcej niż jedną domenę. Idealnie byłoby, gdyby kontekst był jeden do jednego dla domeny, który byłby jeden do jednego dla bazy danych. Innymi słowy, jeśli zestaw tabel nie jest w żaden sposób powiązany z innymi tabelami w danej bazie danych, prawdopodobnie powinny zostać wyciągnięte do osobnej bazy danych. Zdaję sobie sprawę, że to nie zawsze jest praktyczne. Ale jeśli zestaw tabel jest tak różny, że możesz czuć się swobodnie, dzieląc je na osobną bazę danych (ale nie chcesz), to mogę zobaczyć argument za użyciem osobnego kontekstu, ale tylko dlatego, że w rzeczywistości istnieją dwie oddzielne domeny.
Jeśli chodzi o mikrousługi, jeden kontekst nadal ma sens. Jednak w przypadku mikrousług każda usługa miałaby swój własny kontekst, który zawiera tylko tabele bazy danych odpowiednie dla tej usługi. Innymi słowy, jeśli usługa x uzyskuje dostęp do tabel 1 i 2, a usługa y uzyskuje dostęp do tabel 3 i 4, każda usługa miałaby swój unikalny kontekst, który obejmuje tabele specyficzne dla tej usługi.
Interesują mnie twoje myśli.