Czy mam buforować dane, czy trafić do bazy danych?

10

Nie pracowałem z żadnymi mechanizmami buforowania i zastanawiałem się, jakie są moje opcje w świecie .net w następującym scenariuszu.

Zasadniczo mamy usługę REST, w której użytkownik przekazuje identyfikator kategorii (think folder), a ta kategoria może mieć wiele podkategorii, a każda z podkategorii może mieć 1000 kontenerów multimediów (obiekty referencyjne plików plików), które zawierają informacje o plik, który może znajdować się na serwerze NAS lub SAN (w tym przypadku pliki są filmami). Relacje między tymi kategoriami są przechowywane w bazie danych wraz z pewnymi regułami uprawnień i metadanymi dotyczącymi podkategorii.

Tak więc z perspektywy interfejsu użytkownika mamy leniwie załadowane sterowanie drzewem, sterowane przez użytkownika poprzez kliknięcie każdego podfolderu (pomyśl o Eksploratorze Windows). Po przejściu do adresu URL pliku wideo mogą obejrzeć wideo.

Liczba użytkowników może wzrosnąć do 1000, a podkategorie i filmy mogą być w 10000 w miarę wzrostu systemu.

Pytanie brzmi: czy powinniśmy kontynuować sposób, w jaki obecnie działa, gdzie każde żądanie trafia do bazy danych, czy też powinniśmy pomyśleć o buforowaniu danych?

Używamy IIS 6/7 i Asp.net.

JD01
źródło
4
Czy profilowałeś swój system pod realistycznym obciążeniem? Czy dane mogą być buforowane? Czy to miałoby sens?

Odpowiedzi:

13

Po pierwsze, upewnij się, że kod jest podzielony na partycje w taki sposób, aby twój dostawca danych mógł być łatwo przełączany. Mówimy tutaj o segregacji interfejsu i innych zasadach SOLID.

Następnie musisz znać odpowiedź na następujące pytania:

1) Czy dane często się zmieniają? 2) Czy aplikacja często sonduje twoją usługę REST, aby uzyskać te aktualizacje? 3) Czy baza danych jest wykorzystywana do innych celów? 4) Czy znasz jakieś bieżące problemy z wydajnością? 5) Czy dane są aktualizowane przez twoją aplikację i czy te aktualizacje wymagają odzwierciedlenia w aplikacji?

Interesujące jest to, że korzystając z bazy danych, już technicznie buforujesz dane. Tak właśnie działa baza danych. Wiele prac badawczo-rozwojowych polega na tym, aby baza danych mogła jak najszybciej odzyskiwać dane. Na przykład używa własnej pamięci podręcznej pamięci dla często używanych danych.

Więc zadaj sobie pytanie, co masz nadzieję zyskać, wymieniając dostawców pamięci podręcznej? A jakie są obecne ograniczenia, które wymagają rozwiązania?

Jeśli nie doświadczasz obecnie żadnych spowolnień, po prostu powiedziałbym „nie, nie musisz się przełączać”.

To naprawdę duży temat. Pamięci podręczne radzą sobie naprawdę dobrze, gdy dane muszą być rozproszone geograficznie, ale zarządzanie nimi jest ogromne.

Realizuję projekt w momencie, w którym podejmuję dokładnie takie same decyzje.

Do tej pory moim rozwiązaniem było korzystanie tylko z bazy danych i trafianie do niej wieloma zapytaniami z każdego klienta. Brzmi nieźle, ale skaluje się (w testach) o wiele bardziej niż będę potrzebować, kod jest bardzo prosty.

To powiedziawszy, mój kod używa pewnego rodzaju wzorca repozytorium, który wyodrębnia dostawcę danych głównej aplikacji z kodu bazy danych. Gdybym chciał zamienić się z dostawcą pamięci podręcznej, takim jak GemFire, wymagałoby to dość niewielkiej ilości kodu.

Ian
źródło
Dzięki Ian. Na tym etapie mamy bazę danych, ale było to raczej pytanie edukacyjne dotyczące rzeczy, na które należy zwrócić uwagę.
JD01,
18

Naprawdę nie ma wystarczających informacji, zgodnie z komentarzami Thorbjørna.

Buforowanie, jeśli zrobione źle, może wywołać u ciebie i twoich użytkowników wiele cierpienia. Upewnij się, że musisz się martwić o buforowanie, zanim nadmiernie skomplikujesz swoją aplikację.

Zatem w przypadku braku informacji wskazujących, że naprawdę potrzebujesz buforować, nie buforuj.

[Ogólna zasada optymalizacji: jeśli musisz zapytać, czy powinienem coś zrobić, odpowiedź brzmi nie] *
* W większości miejsc, gdzie odpowiedź brzmi tak, byłoby to stwierdzenie, a nie pytanie.

Dan McGrath
źródło
Uwielbiam ogólną zasadę, dobrze powiedziane :)
Ian
@ dan-mcgrath Czy dobrym pomysłem jest buforowanie wpisów, jeśli mam uzyskać dostęp do każdego wpisu dokładnie 2 razy, tylko w ciągu powiedzmy 5 minut, a nigdy potem?
nishantbhardwaj2002