Soll ich die Daten zwischenspeichern oder auf die Datenbank zugreifen?

10

Ich habe mit keinem Caching-Mechanismus gearbeitet und mich gefragt, welche Optionen ich in der .net-Welt für das folgende Szenario habe.

Wir haben im Grunde einen REST-Service, bei dem der Benutzer eine ID einer Kategorie (think-Ordner) übergibt und diese Kategorie möglicherweise viele Unterkategorien enthält und jede der Unterkategorien 1000 Mediencontainer (think file-Referenzobjekte) enthalten kann, die Informationen zu enthalten Eine Datei, die sich möglicherweise auf einem NAS- oder SAN-Server befindet (Dateien sind in diesem Fall Videos). Die Beziehung zwischen diesen Kategorien wird zusammen mit einigen Berechtigungsregeln und Metadaten zu den Unterkategorien in einer Datenbank gespeichert.

Aus Sicht der Benutzeroberfläche haben wir also ein faul geladenes Baumsteuerelement, das vom Benutzer durch Klicken auf jeden Unterordner gesteuert wird (denken Sie an den Windows Explorer). Sobald sie zu einer URL der Videodatei gelangen, können sie das Video ansehen.

Die Anzahl der Benutzer könnte in den 1000ern wachsen und die Unterkategorien und Videos könnten in den 10000ern liegen, wenn das System wächst.

Die Frage ist, ob wir so weitermachen sollen, wie es derzeit funktioniert, wenn jede Anforderung in die Datenbank gelangt, oder ob wir darüber nachdenken sollten, die Daten zwischenzuspeichern.

Wir verwenden IIS 6/7 und Asp.net.

JD01
quelle
4
Haben Sie Ihr System unter realistischer Last profiliert? Können die Daten zwischengespeichert werden? Wäre es sinnvoll?

Antworten:

13

Stellen Sie zunächst sicher, dass der Code so partitioniert ist, dass Ihr Datenprovider problemlos umgeschaltet werden kann. Wir sprechen hier von Schnittstellentrennung und den anderen SOLID-Prinzipien.

Als nächstes müssen Sie die Antwort auf Folgendes wissen:

1) Werden sich die Daten häufig ändern? 2) Fragt die Anwendung Ihren REST-Service häufig ab, um diese Updates zu erhalten? 3) Wird die Datenbank für andere Zwecke verwendet? 4) Sind Ihnen aktuelle Leistungsprobleme bekannt? 5) Werden die Daten von Ihrer Anwendung aktualisiert und müssen diese Aktualisierungen in der App wiedergegeben werden?

Das Interessante ist, dass Sie mithilfe der Datenbank die Daten bereits technisch zwischenspeichern. Das macht eine Datenbank. Mit viel Forschung und Entwicklung wird die Datenbank beim Abrufen von Daten so schnell wie möglich gestaltet. Es verwendet beispielsweise einen eigenen Speichercache für häufig verwendete Daten.

Fragen Sie sich also, was Sie durch den Austausch von Cache-Anbietern erhoffen? Und was sind die aktuellen Einschränkungen, die behoben werden müssen?

Wenn Sie derzeit keine Verlangsamung feststellen, würde ich einfach "Nein, kein Wechsel" sagen.

Es ist ein wirklich großes Thema. Caches funktionieren in der Regel sehr gut, wenn die Daten geografisch verteilt werden müssen, aber die Verwaltung ist mit einem enormen Verwaltungsaufwand verbunden.

Ich mache gerade ein Projekt, in dem ich genau die gleichen Entscheidungen treffe.

Meine bisherige Lösung besteht darin, nur die Datenbank zu verwenden und sie mit Abfrageanfragen von jedem Client zu treffen. Klingt glücklich, aber es skaliert (beim Testen) weit mehr als ich brauche, der Code ist sehr einfach.

Mein Code verwendet jedoch eine Art Repository-Muster, das den Datenprovider der Hauptanwendung vom Datenbankcode abstrahiert. Wenn ich einen Cache-Anbieter wie GemFire ​​austauschen wollte, würde dies eine ziemlich kleine Menge Code erfordern.

Ian
quelle
Danke Ian. Zu diesem Zeitpunkt haben wir eine Datenbank, aber es war eher eine pädagogische Frage zu Dingen, auf die man achten sollte.
JD01
18

Laut Thorbjørns Kommentaren gibt es wirklich nicht genug Informationen.

Wenn das Caching falsch gemacht wird, kann es Ihnen und Ihren Benutzern viel Kummer bereiten. Stellen Sie sicher, dass Sie sich um das Zwischenspeichern kümmern müssen, bevor Sie Ihre Anwendung zu kompliziert machen.

Wenn also keine Informationen vorliegen, die darauf hinweisen, dass Sie wirklich zwischenspeichern müssen, zwischenspeichern Sie nicht.

[Allgemeine Optimierungsregel: Wenn Sie fragen müssen, ob ich etwas tun soll, lautet die Antwort Nein] *
* In den meisten Fällen, in denen die Antwort Ja lautet, handelt es sich um eine Aussage, nicht um eine Frage.

Dan McGrath
quelle
Ich liebe die allgemeine Regel, gut gesagt :)
Ian
@ dan-mcgrath Ist es eine gute Idee, Einträge zwischenzuspeichern, wenn ich nur innerhalb von 5 Minuten und danach nie mehr genau zweimal auf jeden Eintrag zugreifen möchte?
Nishantbhardwaj2002