Buforowanie w warstwie biznesowej a buforowanie w warstwie danych

36

Zawsze pracowałem nad projektami, w których buforowanie odbywało się w DAL, w zasadzie tylko wtedy, gdy masz wykonać połączenie z bazą danych, sprawdza, czy dane są już w pamięci podręcznej, a jeśli tak, to po prostu nie wykonuje połączenia i zamiast tego zwraca te dane.

Niedawno czytałem o buforowaniu w warstwie biznesowej, więc zasadniczo buforuję całe obiekty biznesowe. Zaletą, którą widzę od razu, jest znacznie lepszy czas reakcji.

Kiedy wolisz jeden od drugiego? oraz Czy buforowanie w warstwie biznesowej jest powszechną praktyką?

Emma
źródło
Czy wydajność aplikacji jest tak istotna, że ​​buforowanie w warstwie biznesowej jest lepsze niż unikanie przejrzystości dodatkowego wywołania do repozytorium lub warstwy DAL?
JDT
1
Nie, nie i po przeczytaniu odpowiedzi myślę, że trzymałbym się tylko buforowania w DAL. Twoje zdrowie.
Emma
Należy rozważyć buforowanie powyżej warstwy biznesowej, a także pomyśleć o skalowaniu.
AK_

Odpowiedzi:

30

Jest to prawdopodobnie zbyt szeroki, aby uzyskać ostateczną odpowiedź. Osobiście uważam, że warstwa dostępu do danych jest lepszym miejscem do buforowania, po prostu dlatego, że ma być bardzo prosta - rekordy wchodzą i wychodzą i to wszystko.

Warstwa biznesowa implementuje wiele dodatkowych reguł o większej złożoności, dlatego lepiej jest, jeśli nie musi ona również zarządzać kwestiami dostępności poszczególnych obiektów oprócz obaw dotyczących spójności wielu obiektów w tej samej klasie (lub nawet tej samej metodzie) - to rażąco naruszać SRP.

(Oczywiście doszedłem do tego wglądu dopiero po tym, jak moje klasy usług stały się niemożliwe do opanowania, gdy próbowały jednocześnie buforować i konfigurować. Nie ma lepszego nauczyciela niż doświadczenie, ale cena jest na pewno wysoka).

Kilian Foth
źródło
dlaczego buforowanie musi być złożone? można to zrobić za pomocą AOP i kilku adnotacji. Czy to nadal narusza SRP? dlaczego nie jest to zrobione w DAL? także IMHE Nigdy nie widziałem klas usług „zbyt skomplikowanych”, aby można je było buforować; niezależnie od złożoności, usługa może być postrzegana jako czarna skrzynka, a jej wynik może być buforowany
użytkownik1075613
25

Warstwy dostępu do danych i trwałości / przechowywania są nieodpartym naturalnym miejscem buforowania. Robią operacje we / wy, dzięki czemu są poręcznym i łatwym miejscem do wstawienia buforowania. Śmiem twierdzić, że prawie każda warstwa DAL lub warstwa trwałości, w miarę dojrzewania, otrzyma funkcję buforowania - jeśli nie zostanie zaprojektowana w ten sposób od samego początku.

Problem jest zamierzony . Warstwy DAL i trwałości radzą sobie z konstrukcjami stosunkowo niskiego poziomu - na przykład rekordami, tabelami, wierszami i blokami. Nie widzą obiektów „biznesowych” ani warstw aplikacji, ani nie mają wglądu w to, jak są używane na wyższych poziomach. Kiedy widzą, że kilka wierszy lub kilkanaście bloków jest odczytywanych lub zapisywanych, nie jest jasne, że reprezentują. „Konto Jones, które obecnie analizujemy” nie różni się niczym od „niektórych podstawowych danych referencyjnych stawek podatkowych, których aplikacja potrzebuje tylko raz, i do których nie będą się już odnosić”. Na tej warstwie dane to dane to dane.

Buforowanie w warstwie DAL / warstwa trwałości stwarza ryzyko, że siedzą tam „zimne” dane podatkowe, zajmując bezcelowo 12,2 MB pamięci podręcznej i zastępując niektóre informacje o koncie, które w rzeczywistości zostaną intensywnie wykorzystane w ciągu minuty. Nawet najlepsi menedżerowie pamięci podręcznej mają niewielką wiedzę na temat struktur danych i połączeń wyższego poziomu, a także mało wglądu w to, jakie operacje będą wkrótce dostępne, więc wracają do algorytmów zgadywania .

W przeciwieństwie do tego buforowanie w warstwie aplikacji lub biznesowej nie jest aż tak fajne. Wymaga wstawienia operacji zarządzania pamięcią podręczną lub wskazówek w środku innej logiki biznesowej, co sprawia, że ​​kod biznesowy jest bardziej złożony. Ale kompromis polega na tym, że mając większą wiedzę o strukturze danych na poziomie makro i nadchodzących operacjach, ma ona znacznie lepszą okazję do przybliżenia optymalnej wydajności buforowania („jasnowidz” lub „Bélády Min”).

To, czy wstawienie odpowiedzialności za zarządzanie pamięcią podręczną do kodu biznesowego / aplikacyjnego ma sens, wymaga oceny i będzie się różnić w zależności od aplikacji. W wielu przypadkach, chociaż wiadomo, że warstwy DAL / trwałości nie osiągną tego „idealnie”, kompromis polega na tym, że mogą wykonać całkiem dobrą robotę, że robią to w architekturze „czystej” i znacznie intensywniej testowalnej , a łapanie na niskim poziomie pozwala uniknąć złożoności kodu biznesowego / aplikacji.

Niższa złożoność zachęca do większej poprawności i niezawodności oraz krótszego czasu wprowadzania na rynek. Jest to często uważane za świetny kompromis - mniej doskonałe buforowanie, ale kod biznesowy o lepszej jakości, bardziej aktualny.

Jonathan Eunice
źródło
Dziękuję za odpowiedź. Po przeczytaniu odpowiedzi twoich i innych myślę, że zdecydowanie nie muszę buforować w warstwie biznesowej. To tylko zwiększy ogólną złożoność produktu.
Emma
1
Jednym z problemów związanych z modelem „warstw” jest to, że wydajne mechanizmy buforowania często muszą wykorzystywać informacje, które nie są dostępne na jednej warstwie. Co sądzisz o tym, że warstwa biznesowa przekazuje „podpowiedzi” do warstwy danych na temat ogólnego „planu”? Warstwa danych może początkowo zignorować większość takich wskazówek, ale jeśli zostanie znalezione wąskie gardło, można dodać pewną logikę, która, jeśli otrzyma pewne wskazówki, zmieni strategie buforowania w sposób specyficzny dla firmy.
supercat
1
Doskonały punkt, @supercat. Chciałem wspomnieć o strategii podpowiedzi / pragmatów, ale odpowiedź była już długa. Ale masz rację. Warstwy biznesowe podpowiedzi do niższych warstw o ​​tym, jak priorytetyzować pamięć podręczną lub „co przypiąć” są dość powszechnym / użytecznym sposobem na uzyskanie buforowania na wyższym poziomie bez zmuszania kodu biznesowego do robienia wszystkiego, lub zbyt pochłonięcia zarządzaniem własną pamięcią masową hierarchia.
Jonathan Eunice,
@JonathanEunice: Miłą rzeczą w podpowiedziach jest to, że kod nie musi na początku nic z nimi robić. Wiele systemów ma kilka oczywistych wąskich gardeł, które dominują w ich wydajności, ale może być trudno przewidzieć, które z nich będą wystarczająco złe, aby mieć znaczenie. Dodanie niewielkiej ilości brzydkiej logiki buforowania w kilku krytycznych miejscach może być lepsze niż umieszczenie dużej ilości logiki buforowania w miejscach, które naprawdę nie mają znaczenia.
supercat
1
Dokładnie. Zwłaszcza jeśli masz „całkiem dobre” buforowanie niskiego poziomu już w warstwie trwałości / dostępu. Aby przejść od „całkiem dobrego” do „naprawdę dobrego”, możesz potrzebować tylko trochę dodatkowych informacji o ustalaniu priorytetów.
Jonathan Eunice,
16

Buforowanie w DAL jest proste i proste

Twój DAL jest centralną warstwą dostępu do danych, co oznacza, że ​​każdy dostęp do danych może być kontrolowany za pośrednictwem tamtejszych klas. Ponieważ zarówno czytanie, jak i utrwalanie zachodzi na tych warstwach, równie łatwo można wyczyścić lub zaktualizować wpisy pamięci podręcznej w miarę zmian.

Buforowanie w firmie jest elastyczne

Buforowanie w firmie daje programistom elastyczność w określaniu, czy konkretne użycie obiektu skorzysta na buforowaniu. W zależności od struktury usług zaplecza aplikacji lub zautomatyzowanych procesów mogą zmieniać dane buforowane w innych częściach. Dzięki buforowaniu w przedsiębiorstwie programista może ustalić, czy określony obiekt biznesowy będzie mógł mieć nieaktualne dane i zwiększyć wydajność, czy też mieć najbardziej aktualny stan obiektu biznesowego kosztem wydajności.

JDT
źródło