Cache-Strategie
Zur Optimierung können auch verschiedene Caching-Methoden verwendet werden.
Aktivieren von AEM Dispatcher-Caching
Empfehlung
AEM Dispatcher ist der Cache der ersten Ebene im AEM-Dienst, vor dem CDN-Cache.
Weitere Informationen
Siehe:
Verwenden eines Content Delivery Network (CDN)
Empfehlung
GraphQL-Abfragen und ihre JSON-Antworten können im Cache gespeichert werden, wenn sie bei Verwendung eines CDN als GET
-Anfragen anvisiert werden. Im Gegensatz dazu können nicht zwischengespeicherte Anfragen sehr aufwendig (ressourcenintensiv) sein und möglicherweise nur langsam verarbeitet werden, was weitere nachteilige Auswirkungen auf die Ursprungsressourcen bedeuten kann.
Weitere Informationen
Siehe:
Festlegen der HTTP-Cache-Control-Kopfzeilen
Empfehlung
Bei der Verwendung persistierter GraphQL-Abfragen mit einem CDN wird empfohlen, geeignete HTTP-Cache-Control-Header festzulegen.
Jede persistierte Abfrage kann über einen eigenen spezifischen Satz von Cache-Control-Kopfzeilen verfügen. Die Kopfzeilen können über die GraphQL-API oder AEM GraphiQL-IDE festgelegt werden.
Weitere Informationen
Siehe:
GraphQL-Abfrageoptimierung
Auf einer AEM-Instanz mit einer großen Anzahl von Inhaltsfragmenten, die dasselbe Modell verwenden, können GraphQL-Listenabfragen kostenintensiv sein (im Hinblick auf Ressourcen).
Das liegt daran, dass alle Fragmente, die dasselbe in der GraphQL-Abfrage verwendete Modell nutzen, in den Speicher geladen werden müssen. Dies erfordert Zeit und Speicherplatz. Eine Filterung, die die Anzahl der Elemente in der (endgültigen) Ergebnismenge verringern kann, kann nur nach dem Laden des gesamten Ergebnissatzes in den Speicher angewendet werden.
Dies kann den Eindruck erwecken, dass die Leistung auch bei kleinen Ergebnismengen schlecht ist. In Wirklichkeit wird das langsame Tempo jedoch durch die Größe des ursprünglichen Ergebnissatzes verursacht, da dieser intern verarbeitet werden muss, bevor die Filterung angewendet werden kann.
Um Leistungs- und Speicherprobleme zu vermeiden, muss diese anfängliche Ergebnismenge so klein wie möglich gehalten werden.
AEM bietet zwei Methoden zur Optimierung von GraphQL-Abfragen:
-
Paging (oder Paginierung)
- Sortierung ist nicht direkt mit der Optimierung verbunden, sondern mit dem Paging
Jede Methode beinhaltet eigene Anwendungsfälle und Einschränkungen. In diesem Abschnitt finden Sie Informationen zur hybriden Filterung und zum Paging sowie einige Best Practices zur Optimierung von GraphQL-Abfragen.
Verwenden der AEM GraphQL-Hybrid-Filterung
Empfehlung
Hybride Filterung kombiniert JCR-Filterung mit AEM-Filterung.
Dabei wird ein JCR-Filter (in Form einer Abfragebegrenzung) angewendet, bevor der Ergebnissatz zur AEM-Filterung in den Speicher geladen wird. Dadurch soll der in den Speicher geladene Ergebnissatz verringert werden, da der JCR-Filter überflüssige Ergebnisse davor entfernt.
Bei dieser Methode wird die Flexibilität bewahrt, die GraphQL-Filter bieten, während gleichzeitig ein möglichst großer Teil der Filterung an JCR delegiert wird.
Weitere Informationen
Siehe:
Verwenden der GraphQL-Seitennummerierung
Empfehlung
Die Reaktionszeit komplexer Abfragen mit großen Ergebnismengen kann durch die Segmentierung von Antworten in Blöcke mithilfe der Seitennummerierung (ein GraphQL-Standard) verbessert werden.
GraphQL in AEM unterstützt zwei Arten der Paginierung:
-
Limit-/Offset-basierte Seitennummerierung
Diese Methode wird für Listenabfragen verwendet; diese enden mitList
. Zum Beispiel:articleList
.
Um sie zu verwenden, müssen Sie die Position des ersten Elements angeben, das zurückgegeben werden soll (offset
) und die Anzahl der zurückzugebenden Elemente (limit
oder Seitengröße). -
Cursor-basierte Paginierung (dargestellt durch
first
undafter
)
Bei dieser Methode wird für jedes Element eine eindeutige ID bereitgestellt; auch als Cursor bezeichnet.
In der Abfrage geben Sie den Cursor des letzten Elements der vorherigen Seite sowie die Seitengröße (die maximale Anzahl der zurückzugebenden Elemente) an.Da die Cursor-basierte Paginierung nicht zu den Datenstrukturen von listenbasierten Abfragen passt, hat AEM den Abfragetyp
Paginated
eingeführt, zum BeispielarticlePaginated
. Die verwendeten Datenstrukturen und Parameter entsprechen der GraphQL Cursor ConnectionSpecification.HINWEIS
AEM unterstützt derzeit Forward Paging (unter Verwendung der Parameterafter
/first
).Backward Paging (mithilfe der Parameterbefore
/last
) wird nicht unterstützt.
Weitere Informationen
Siehe:
Verwenden der GraphQL-Sortierung
Empfehlung
Die Sortierung ist ebenfalls ein GraphQL-Standard und ermöglicht es, dass Clients JSON-Inhalte in sortierter Reihenfolge empfangen. Dies kann die Notwendigkeit einer weiteren Verarbeitung auf dem Client verringern.
Die Sortierung ist nur dann effizient, wenn sich alle Sortierungskriterien auf Fragmente der obersten Ebene beziehen.
Wenn die Sortierreihenfolge ein oder mehrere Felder enthält, die sich auf einem verschachtelten Fragment befinden, müssen alle Fragmente, die das Modell der obersten Ebene gemeinsam verwenden, in den Speicher geladen werden. Dies führt zu Leistungseinbußen.
Weitere Informationen
Siehe:
Best Practices
Das Hauptziel aller Optimierungsempfehlungen besteht darin, die anfängliche Ergebnismenge zu reduzieren. Die hier aufgeführten Best Practices bieten Möglichkeiten dazu. Sie können (und sollten) kombiniert werden.
Nur nach Eigenschaften der obersten Ebene filtern
Derzeit funktioniert das Filtern auf JCR-Ebene nur für Fragmente der obersten Ebene.
Wenn sich ein Filter auf die Felder eines verschachtelten Fragments bezieht, muss AEM alle Fragmente, die das zugrunde liegende Modell gemeinsam nutzen, wieder in den Speicher laden.
Sie können diese GraphQL-Abfragen dennoch optimieren, indem Sie Filterausdrücke für Felder von Fragmenten der obersten Ebene und für Felder verschachtelter Fragmente mit dem AND-Operator kombinieren.