Caching auf Business-Ebene vs Caching auf Datenebene

36

Ich habe immer an Projekten gearbeitet, in denen das Caching auf DAL durchgeführt wurde. Im Grunde genommen wird gerade beim Aufrufen der Datenbank geprüft, ob sich bereits Daten im Cache befinden gibt stattdessen diese Daten zurück.

Ich habe kürzlich über das Cachen in der Business-Schicht gelesen, also im Grunde das Cachen der gesamten Business-Objekte. Ein Vorteil, den ich sofort sehe, sind die deutlich besseren Reaktionszeiten.

Wann würden Sie eins dem anderen vorziehen? und Ist das Zwischenspeichern in Business Layer eine gängige Praxis?

Emma
quelle
Ist die Leistung Ihrer Anwendungen so kritisch, dass das Zwischenspeichern in der Business-Schicht der Klarheit eines zusätzlichen Aufrufs an ein Repository oder eine DAL-Schicht vorgezogen wird?
JDT,
1
Nein, es ist nicht und nachdem ich die Antworten gelesen habe, denke ich, dass ich mich nur an das Cachen in DAL halten würde. Prost.
Emma
Sie sollten überlegen, ob Sie das Caching über Ihrer Business-Schicht durchführen möchten, und auch über die Skalierung nachdenken.
AK_

Antworten:

30

Dies ist wahrscheinlich zu umfassend für eine endgültige Antwort. Persönlich bin ich der Meinung, dass eine Datenzugriffsebene der bessere Ort für das Caching ist, einfach weil sie sehr einfach sein soll - Aufzeichnungen gehen rein und raus und das war's.

Eine Business - Schicht viele zusätzliche Regeln höherer Komplexität implementiert, so dass es besser ist , wenn es nicht auch hat pro-Objekt Verfügbarkeit betrifft zusätzlich zu mehreren Objekten Konsistenz betrifft in der gleichen Klasse (oder auch die gleiche Methode) zu verwalten - das wäre eine offensichtliche Verletzung der SRP sein.

(Natürlich habe ich diese Einsicht erst erreicht, nachdem meine Serviceklassen zu einer unüberschaubaren Komplexität geworden waren, als sie versuchten, sowohl Caching als auch Konfiguration gleichzeitig durchzuführen. Es gibt keinen besseren Lehrer als Erfahrung, aber der Preis ist sicher hoch.)

Kilian Foth
quelle
Warum muss Caching komplex sein? Dies kann mit AOP und einigen Anmerkungen geschehen. Ist es immer noch eine Verletzung von SRP? warum ist es nicht, wenn in DAL getan? auch IMHE Ich habe nie gesehen, dass Serviceklassen "zu komplex" sind, um zwischengespeichert zu werden. Unabhängig von seiner Komplexität kann ein Dienst als Black Box angesehen und sein Ergebnis zwischengespeichert werden
user1075613 12.11.18
25

Datenzugriffs- und Persistenz- / Speicherschichten sind unwiderstehlich natürliche Orte für das Caching. Sie erledigen die I / Os und machen sie so zum praktischen Ort für das Einfügen von Caching. Ich gehe davon aus, dass fast jede DAL- oder Persistenzschicht im Laufe der Zeit eine Caching-Funktion erhält - wenn sie nicht von Anfang an so konzipiert ist.

Das Problem ist die Absicht . DAL- und Persistenz-Layer befassen sich mit Konstrukten auf relativ niedriger Ebene, z. B. Datensätzen, Tabellen, Zeilen und Blöcken. Sie sehen die "Business" - oder Application-Layer-Objekte nicht oder wissen nicht genau, wie sie auf höheren Ebenen verwendet werden. Wenn sie eine Handvoll Zeilen oder ein Dutzend Blöcke lesen oder schreiben sehen, ist es nicht klar, dass sie repräsentieren. "Das derzeit analysierte Jones-Konto unterscheidet sich nicht wesentlich von" einigen grundlegenden Steuersatzreferenzdaten, die die App nur einmal benötigt und auf die sie sich nicht erneut bezieht ". In dieser Schicht sind Daten Daten sind Daten.

Beim Zwischenspeichern auf der DAL- / Persistenz-Ebene besteht die Gefahr, dass die "kalten" Steuerbezugsdaten dort gespeichert werden, unnötigerweise 12,2 MB Cache belegt werden und einige Kontoinformationen verschoben werden, die tatsächlich in nur einer Minute intensiv genutzt werden. Selbst die besten Cache-Manager haben nur wenig Wissen über die übergeordneten Datenstrukturen und -verbindungen und wissen nicht , welche Vorgänge in Kürze durchgeführt werden . Daher greifen sie auf Schätzalgorithmen zurück .

Im Gegensatz dazu ist das Caching auf Anwendungs- oder Business-Ebene bei weitem nicht so einfach. Hierfür müssen Cache-Verwaltungsvorgänge oder Hinweise in die Mitte einer anderen Geschäftslogik eingefügt werden, wodurch der Geschäftscode komplexer wird. Der Kompromiss lautet jedoch: Wenn Sie mehr über die Struktur von Daten auf Makroebene und die bevorstehenden Vorgänge wissen, haben Sie eine viel bessere Möglichkeit, die optimale Caching-Effizienz ("Hellseher" oder "Bélády Min") zu approximieren.

Ob das Einfügen der Cache-Verwaltungsverantwortung in den Geschäfts- / Anwendungscode sinnvoll ist, ist ein entscheidender Punkt und wird von Anwendung zu Anwendung unterschiedlich sein. In vielen Fällen ist es zwar bekannt, dass DAL / Persistenz-Schichten nicht "vollkommen richtig" sind, der Kompromiss besteht jedoch darin, dass sie einen ziemlich guten Job machen können, dass sie dies auf architektonisch "saubere" und viel intensiver überprüfbare Weise tun , und dass Low-Level-Catching die Komplexität von Business- / App-Code vermeidet.

Eine geringere Komplexität fördert eine höhere Korrektheit und Zuverlässigkeit sowie eine schnellere Markteinführung. Dies wird oft als großer Kompromiss angesehen - weniger perfektes Caching, aber qualitativ besserer, zeitgerechterer Geschäftscode.

Jonathan Eunice
quelle
Danke für die Antwort. Nachdem ich Ihre und die Antworten anderer gelesen habe, glaube ich, dass ich definitiv nicht in der Business-Schicht zwischenspeichern muss. Dies erhöht lediglich die Gesamtkomplexität des Produkts.
Emma
1
Ein Problem mit dem "Layer" -Modell besteht darin, dass effiziente Caching-Mechanismen häufig Informationen verwenden müssen, die auf einem einzelnen Layer nicht verfügbar sind. Was halten Sie jedoch davon, wenn eine Business-Schicht der Datenschicht "Hinweise" zu ihrem allgemeinen "Plan" übermittelt? Die Datenschicht könnte anfangs die meisten derartigen Hinweise ignorieren. Wenn jedoch ein Engpass gefunden würde, könnte eine Logik hinzugefügt werden, die bei bestimmten Hinweisen die Caching-Strategien auf geschäftsspezifische Weise ändert.
Supercat
1
Ausgezeichneter Punkt, @supercat. Ich wollte eine Andeutungs- / Pragma-Strategie erwähnen, aber die Antwort war schon lange. Aber du hast genau recht. Business-Layer-Hinweise auf niedrigere Ebenen zum Priorisieren von Caches oder zum Anheften von Caches sind eine häufig vorkommende / nützliche Methode, um Caches auf höherer Ebene zu erstellen, ohne dass der Business-Code das alles erledigt, oder zu sehr mit der Verwaltung des eigenen Speichers beschäftigt zu sein Hierarchie.
Jonathan Eunice
@ JonathanEunice: Eine nette Sache bei Hinweisen ist, dass Code anfangs nicht viel mit ihnen anfangen muss. Viele Systeme weisen einige offensichtliche Engpässe auf, die ihre Leistung dominieren. Es kann jedoch schwierig sein, vorherzusagen, ob die jeweiligen Engpässe tatsächlich von Bedeutung sind. Das Hinzufügen einer kleinen Menge hässlicher Caching-Logik an einigen kritischen Stellen ist möglicherweise besser als das Verstreuen vieler Caching-Logik an Stellen, die wirklich keine Rolle spielen.
Supercat
1
Genau. Vor allem, wenn Sie bereits auf der Persistenz- / Zugriffsebene ein "ziemlich gutes" Low-Level-Caching haben. Möglicherweise benötigen Sie nur einige zusätzliche Priorisierungsinformationen, um von "ziemlich gut" zu "wirklich gut" zu wechseln.
Jonathan Eunice
16

Das Cachen auf dem DAL ist einfach und unkompliziert

Ihre DAL ist die zentrale Datenzugriffsschicht, dh, jeder Datenzugriff kann über die dortigen Klassen gesteuert werden. Da sowohl das Lesen als auch das Fortbestehen auf diesen Ebenen stattfinden, ist es ebenso einfach, Cache-Einträge zu löschen oder zu aktualisieren, wenn Änderungen eintreten.

Caching im Geschäft ist flexibel

Durch das Zwischenspeichern im Unternehmen können Entwickler flexibel bestimmen, ob die konkrete Verwendung eines Objekts vom Zwischenspeichern profitiert. Abhängig von der Struktur der Back-End-Dienste der Anwendung oder von automatisierten Prozessen können sich Daten ändern, die in anderen Teilen zwischengespeichert werden. Mit der Zwischenspeicherung im Geschäft kann ein Entwickler auf Kosten der Leistung feststellen, ob ein bestimmtes Geschäftsobjekt möglicherweise veraltete Daten enthält und an Leistung gewinnt oder den aktuellsten Status eines Geschäftsobjekts aufweist.

JDT
quelle