Frage

Wo ist der beste Platz für Caching in einer Web-basierten Anwendung zu implementieren?

  • Auf der Präsentationsschicht (nicht hoffen)?
  • Auf der Business-Logik-Schicht?
  • Bei der Datenschicht?

Ich werde so etwas wie Memcached oder MS Geschwindigkeit unter der Haube verwenden.

Ich finde mich nur so viel Code zu schreiben, den Cache hier und da in der Business-Logik-Schicht zu aktualisieren, so wäre es besser, ein Gewebe zwischen der Datenzugriffsschicht auf dem Datenbank-Server zu Cache-Daten zu erstellen?

Ich denke, diese Komplikationen sind bis auf die Tatsache, die meisten der Daten, die wir das Caching sind benutzerspezifisch und wir Daten im Cache duplizieren. Wir kämpfen, um die beste Lösung zu finden.

War es hilfreich?

Lösung

Cache ist ein wichtiger Teil oder ein Web-App, aber es gibt keine magische Lösung, die jedes Projekt paßt. Arbeiten an Optimierungen, bevor Ihre Anwendung arbeitet, ist in der Regel eine schlechte Idee. Bevor Sie sich fragen, wo Sie eine Cache-Ebene implementieren sollte, ist der erste Schritt um sicher zu sein, dass Ihre Anwendung funktioniert gut (auch wenn langsam) ohne Cache-Optimierung.

Wenn dieser erste Schritt erreicht wird, können Sie beginnen, die App Profilierungs, die Funktionen auflistet, die scheinen eine Menge von Ressourcen zu verwenden oder nehmen viel Zeit (es kann CPU, Speicher, I / O, Datenbankzugriff sein) (wegen der gleichen Symptome in der Regel) in Anspruch nehmen.

Wenn Sie eine Liste der Funktionen, die Sie denken, kann mit einem Cache-System optimiert werden, gibt es zwei Fragen, die Sie müssen sich fragen:

  • „Wie kann ich alle diese Funktionen zur gleichen Zeit zu verbessern“ (Makro-Fokus): Eine offensichtliche Antwort auf diese häufig Daten-Zugriff-Cache. Sie in der Regel nicht wollen, wieder die gleiche Abfrage auf dem Datenbankserver über und über senden, wenn die Daten, die Sie im Gegenzug bekommen, sind immer gleich. Also diese Art von Daten im Cache speichern, mit einer cleveren Lebensdauer, wird immer eine gute Idee sein.

  • (Mikro-Fokus) „Wie kann ich jede Funktion verbessern“: Das ist schwierig, und Sie müssen Ihre Anwendung sehr gut verstehen, diese herauszufinden. Einige Daten können zwischengespeichert werden, einige sollten nicht, einige müssen nicht. Ein Debugger und ein Profiler sind in der Regel große Werkzeuge für diesen Schritt, weil sie Ihnen helfen, sicher zu sein, warum ein Feature langsam ist, und geben Sie Hinweise darüber, wie sollten sie optimiert werden.

Die Optimierungen Sie gehen könnte, um herauszufinden, auf jede Schicht Ihrer Anwendung zusammenhängen (Präsentation, Business-Logik, Daten), aber das bedeutet nicht, dass Sie sie alle implementieren sollten. Es gibt einige wichtige Dinge, die Sie berücksichtigen sollte:

  • Ist diese Funktion muss wirklich optimiert werden? (Es ist ein spürbarer Gewinn für die Kunden? Für die Hardware? Für die ganze App? Für andere Anwendungen?)
  • Welche Leistungssteigerung kann ich erreichen? (1%, 200%, ...)
  • Wie viel Zeit wird es dauern, mich zu optimieren? (1 Stunde, 12 Tage, ...)
  • Wie riskant ist es, es zu optimieren? (Es könnte Dinge für die App brechen? Für die Kunden?)

Wenn Sie die Antworten auf diese Fragen haben, dann ist es Zeit, darüber mit Ihrem Projektmanager zu sprechen, mit Ihren Kollegen, oder auch bei Menschen, die mit Ihnen nicht über die Anwendung arbeiten. neutral Meinung zu haben, ist gut, aber auch mit nicht-technischen (oder weniger technisch) Meinungen. Im Gespräch mit diesen Leuten soll man helfen, herauszufinden, was getan werden soll und was nicht.

An diesem Punkt sollten Sie eine Liste von Optimierungen, die ziemlich klar ist, dass Sie durch mehrere Male gedacht, und Sie sollten kein Problem haben, Codierung und Testen sie.

Andere Tipps

Caching ist eine Performance-Optimierung, es so zu tun, wo der Engpass ist. Sie wissen, wo der Engpass durch die Messung dreimal und dann noch einmal.

Hüten Sie sich vor der entspannten Konsistenz Ihrer Daten, wenn Sie zwischenspeichern, z.B. Sie wollen nicht alle Ihre Handel mit Aktien App zwischenzuspeichern.

Sie sollten Caching auf jeder Ebene in Betracht ziehen.

Der beste Platz zum Cache ist so nahe an die Client-Anforderung wie möglich (so tun Sie so wenig Arbeit wie möglich, die Reaktion zu dienen). In Web-Anwendungen, ja auf der Präsentationsschicht, in der Business-Schicht und die Datenschicht.

(Randbemerkung: Wenn Sie im Grunde sind Ihre Business-Logik-Code mit Caching-Logik hier und da Würzen, sollten Sie wirklich sehen in Trennung von Bedenken Code zu vermeiden, eine große Kugel aus Schlamm :-) immer)

Data Layer - alle Schichten oberhalb dieser Schicht brauchen nicht zu wissen, woher die Daten stammen wird. Ich würde auch nur das ist, Cache-Daten nicht sehr volatil, oder eine Ablaufrichtlinie enthalten.

Wir setzen es in der Business-Logik-Schicht zwischen Interaktionen mit der Präsentationsschicht. Wenn eine Anfrage von der Präsentationsschicht kommt und es zwischengespeichert wird, können wir dann eine ganze Menge Logik und Datenzugriff überspringen.

Ich würde empfehlen Memcached über MS Geschwindigkeit, Geschwindigkeit war ein Schmerz zu Setup!

Cache. implementiert in der Datenzugriffsschicht, zugegriffen von der Business-Logik-Schicht

Dies bedeutet Sie sorgfältig aufpassen müssen, damit der Cache versauernd.

Datenschicht. Aber es ist verwirrend, weil wir ASP.NET-Caching verwenden. Mit ihrem Ablauf und die Abhängigkeit Fähigkeit, es ist ziemlich praktisch. So ist unsere Business-Schicht hat keine Ahnung, die Datenschicht Cachen werden könnte, aber die Datenschicht verwendet eine Präsentationsschicht-Technologie für das Caching! : (

Wenn Sie Business-Objekte sind das Caching, und angesichts der drei Ebenen Sie beschreiben, die Sie verwenden, die Business-Schicht ist die offensichtliche Ort.

Ein einfaches Setup (für ein einzelnes Business-Objekt) sein würde:

  1. myCache ist eine statische Klasse
  2. Eine statische Methode: MyCache.Retrieve (id), gibt ein Objekt
  3. Die Klasse verwendet ein statisches Wörterbuch für die Lagerung und ein statische ReaderWriterLock

Das Abrufen Methode führt dann wie folgt vor:

  1. Ist die ID im Cache (a Wörterbuch von id / Objekt)?
  2. Nein
    • Schnappen Sie sich das Objekt aus der Datenbank
    • AquireWriterLock von der ReaderWriterLock (warum Readerwriter? weil Sie schreiben nicht häufig aber Sie lesen oft)
    • Fügen Sie das Objekt in den Cache
  3. Ja
    • Rufen Sie das Objekt aus dem Wörterbuch

Das ist meine bevorzugte Lösung, Sie können Timeouts hinzufügen, Clearing- und so weiter, wenn Sie benötigen. Oder nutzen Sie Memcached oder die Microsoft Enterprise Library Caching-Block aber sie sind in der Regel viel des Guten.

Ich kann nicht für ASP.NET spezielle Sachen sprechen, aber ich habe im Allgemeinen festgestellt, dass Sie bei jedem Level-Cache können. Ihre Datenebene werden Daten Antworten cachen, Ihre Präsentationsschicht die Notwendigkeit finden erzeugte Präsentationselemente zwischenzuspeichern (zB benutzerspezifischen Style Sheets) usw. In den meisten Fällen ist die Datenebene ist der schwerste Cache Benutzer und die anderen Ebenen gehören eine Objekt-Cache, wenn man sich als erforderlich erwiesen sein.

Der schwierigste Teil ist immer Cache-Annullierungs ordnungsgemäß funktioniert. Stale Caches sind ein großen Kopfschmerzen während des Einsatzes. Achten Sie darauf, herauszufinden, wie man die Lebensdauer eines jeden Cache-Objekt verwalten werden. LRU-Caches funktioniert gut für das Caching von statischen Elementen basierend auf Nachfrage. Die meist Daten-Caches, jedoch wird einen expliziten Lebenszyklus benötigen, ob es auf einem Ablaufzeitgeber oder auf irgendeine Art einer Benutzersitzung gebunden basieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top