Analyse von GraphQL -Cache -Mechanismus: Brechen von Cache -Fehlern
Möglicherweise haben Sie von Dingen wie "GraphQL nicht unterstützt" oder "GraphQL kümmert sich nicht um das Caching" gehört. Dies ist für viele Menschen ein großes Problem. Aber das ist nicht der Fall. Das offizielle Dokument von GraphQL erwähnt eine Vielzahl von Caching -Technologien, was zeigt, dass sein Entwicklungsteam für das Caching und seine Leistungsvorteile von großer Bedeutung ist.
Dieser Artikel zielt darauf ab, die Beziehung zwischen GraphQL und Cache zu klären und unterschiedliche Caching -Techniken einzuführen und GraphQL -Abfragen mithilfe von Cache zu optimieren.
Betrachten Sie die folgende Anfrage, um einen Beitrag und seinen Autor zu erhalten:
Abfrage GetPost { Post (Slug: "Working-with-Graphql-Caching") { Ausweis Titel Autor { Ausweis Name Avatar } } }
Das "Geheimnis" zur Implementierung des automatischen Caching von GraphQL ist das meta -Feld __typename
, das von allen GraphQL -APIs bereitgestellt wird. Wie der Name schon sagt, gibt __typename
den Typnamen des Objekts zurück. Dieses Feld kann sogar manuell zu einer vorhandenen Abfrage hinzugefügt werden, die die meisten GraphQL -Clients oder CDNs automatisch hinzufügen, z. B. URQL. Die vom Server empfangene Abfrage sieht möglicherweise so aus:
Abfrage GetPost { Post (Slug: "Working-with-Graphql-Caching") { __Typename Ausweis Titel Autor { __Typename Ausweis Name } } }
Die Antwort mit __typename
ist wie folgt aussehen:
{ Daten: { __typename: "post", ID: 5, Titel: "Mit GraphQl Caching arbeiten", Autor: { __Typename: "Benutzer", ID: 1, Name: "Jamie Barton" } } }
__typename
ist der Schlüssel zum GraphQL -Cache, da wir die Ergebnisse zwischenspeichern und wissen, dass es Post ID 5 und Benutzer -ID 1 enthält.
Bibliotheken wie Apollo und Relais bieten auch ein bestimmtes Ausschnitt integriert für das automatische Zwischenspeichern. Da sie bereits wissen, was im Cache ist, können sie den Cache anstelle der Remote -API nutzen, um das zu erhalten, was der Client in der Abfrage anfordert.
Angenommen, der Postautor verwendet editPost
-Variante, um den Titel des Beitrags zu ändern:
Mutation { editPost (Eingabe: {ID: 5, Titel: "Mit GraphQl Caching arbeiten"}) { Ausweis Titel } }
Da der GraphQL -Client das Feld __typename
automatisch hinzufügt, gibt das Ergebnis dieser Variante sofort den Cache mit, dass sich die Post -ID 5 geändert hat, und alle zwischen dem Beitrag enthaltenen Abfrageergebnisse müssen ungültig werden:
{ Daten: { __typename: "post", ID: 5, Titel: "Mit GraphQl Caching arbeiten" } }
Wenn der Benutzer das nächste Mal die gleiche Abfrage sendet, erhält die Abfrage neue Daten aus der Quelle, anstatt abgelaufene Ergebnisse im Cache zu verwenden.
Viele GraphQL -Clients speichern nicht die gesamten Abfrageergebnisse. Stattdessen normalisieren sie zwischengespeicherte Daten in zwei Datenstrukturen: Einer verknüpft jedes Objekt mit seinen Daten (z. B. Post Nr. 5: {…}, Benutzer #1: {…} usw.).
In der Dokumentation von URQL zur Normalisierung von Caching oder Apollos "entmystifizierender Cache -Normalisierung" finden Sie spezifische Beispiele und Anwendungsfälle.
Einer der Hauptkantenfälle, in denen GraphQL -Caches nicht automatisch behandelt werden können, ist die hinzugefügte Elemente in die Liste. Wenn createPost
-Mutation den Cache durchläuft, weiß sie nicht, welche spezifische Liste das Element hinzufügen soll.
Die einfachste "Problemumgehung" ist es, den übergeordneten Typ in der Mutation abzufragen (falls vorhanden). In der folgenden Abfrage fragen wir beispielsweise die Community -Beziehung in der Post:
Abfrage GetPost { Post (Slug: "Working-with-Graphql-Caching") { Ausweis Titel Autor { Ausweis Name Avatar } # Fragen Sie auch die Community des Beitrags an Gemeinschaft { Ausweis Name } } }
Dann können wir die Community auch aus createPost
-Variante abfragen und alle zwischengespeicherten Abfragenergebnisse, die die Community enthalten, ungültig machen:
Mutation CreatePost { CreatePost (Eingabe: {...}) { Ausweis Titel # Auch die Community des Posts abfragen und damit ungültig machen Gemeinschaft { Ausweis Name } } }
Obwohl sie nicht perfekt sind, sind typisierte Muster und __typename
-Metafields die Schlüssel, um die GraphQL -API für das Zwischenspeichern großartig zu machen.
Möglicherweise denken Sie, dass all dies eine Stopgap -Lösung ist, und GraphQL unterstützt immer noch kein traditionelles Caching. Sie können sich nicht irren. Da GraphQL über Post -Anfragen ausgeführt wird, müssen Sie sich mit dem Anwendungsclient deinstallieren und die oben genannten "Tricks" verwenden, um den modernen Browser -Cache von GraphQL zu nutzen.
Dieser Ansatz ist jedoch nicht immer möglich und nicht der beste Weg, um Kunden -Caches zu verwalten. Für schwierigere Fälle erfordert der GraphQL-Client, dass Sie den Cache manuell aktualisieren müssen. Dienste wie GraphCDN bieten jedoch ein "serverartiges" Caching-Erlebnis und bieten auch eine manuelle Clearing-API, mit der Sie Folgendes für eine bessere Caching-Steuerung durchführen können:
# Alle Vorkommen eines bestimmten Objekts reinigen Mutation { PURGUSER (ID: [5]) }
# Spülung durch Abfragenname Mutation { _purgeQuery (Abfragen: [Listusers, ListPosts]) }
# Alle Vorkommen eines Typs reinigen Mutation { PURGUSER }
Unabhängig davon, wo Sie den GraphCDN -Endpunkt verwenden, müssen Sie die Cache -Richtlinie nicht mehr in allen Client -Logik wie Mobile, Web usw. neu einstellen. Edge Caching macht Ihre API sehr schnell und verringert die Last, indem sie Caches zwischen Benutzern teilen und vom Client jedes Benutzers trennen.
Ich habe kürzlich GraphCDN in einem Projekt verwendet, das mir geholfen hat, die Cache -Konfiguration auf dem Client oder Server zu verarbeiten, sodass ich mein Projekt fortsetzen kann. Zum Beispiel könnte ich meinen Endpunkt durch GraphCDN ersetzen und die Komplexität der Abfragen (bald), die Analyse und mehr kostenlos erhalten.
Kümmert sich GraphQL also um das Caching? Natürlich kümmert es Sie! Es bietet nicht nur einige integrierte automatische Caching-Methoden, sondern viele GraphQL-Bibliotheken bieten andere Möglichkeiten zur Implementierung und Verwaltung von Caching.
Hoffentlich hilft Ihnen dieser Artikel dabei, den GraphQL -Caching -Mechanismus zu verstehen, und wie Sie ihn auf der Client -Seite implementieren und wie Sie CDN nutzen können, um die gesamte Arbeit zu erledigen. Mein Ziel ist es nicht, Sie davon zu überzeugen, GraphQL in all Ihren Projekten zu verwenden. Wenn Sie jedoch eine Abfragesprache und das Caching ein wichtiger Faktor sind, wissen Sie, dass GraphQL für diese Aufgabe vollkommen kompetent ist.
Das obige ist der detaillierte Inhalt vonArbeiten mit GraphQL Caching. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!