Stratégie de mise en mémoire cache
Plusieurs méthodes de mise en cache peuvent également être utilisées à des fins d’optimisation.
Activer la mise en cache d’AEM Dispatcher
Recommandation
AEM Dispatcher est le cache de premier niveau dans le service AEM, avant le cache du réseau CDN.
Références supplémentaires
Voir :
Utiliser un réseau de diffusion de contenu (CDN)
Recommandation
Les requêtes GraphQL et leurs réponses JSON peuvent être mises en cache si elles sont ciblées comme requêtes GET
lors de l’utilisation d’un réseau CDN. En revanche, les requêtes non mises en cache peuvent être très coûteuses (en ressources) et lentes à traiter, avec des effets potentiellement néfastes supplémentaires sur les ressources de l’origine.
Références supplémentaires
Voir :
Définir des en-têtes de contrôle de cache HTTP
Recommandation
Lors de l’utilisation de requêtes GraphQL persistantes avec un réseau CDN, il est recommandé de définir les en-têtes de contrôle de cache HTTP appropriés.
Chaque requête persistante peut avoir son propre ensemble spécifique d’en-têtes de contrôle de cache. Les en-têtes peuvent être définis sur l’ API GraphQL ou l’ IDE GraphiQL AEM.
Références supplémentaires
Voir :
Optimisation des requêtes GraphQL
Sur une instance AEM avec un grand nombre de fragments de contenu partageant le même modèle, les requêtes de liste GraphQL peuvent devenir coûteuses (en termes de ressources).
Ceci est dû au fait que tous les fragments qui partagent un modèle utilisé dans la requête GraphQL doivent être chargés en mémoire. Cela consomme à la fois du temps et de la mémoire. Le filtrage, qui peut réduire le nombre d’éléments dans le jeu de résultats (final), ne peut être appliqué qu’après le chargement du jeu de résultats en mémoire.
Cela peut donner l’impression que même de petits ensembles de résultats peuvent entraîner de mauvaises performances. Toutefois, en réalité, la lenteur est due à la taille du jeu de résultats initial, car il doit être géré en interne avant que le filtrage puisse être appliqué.
Pour réduire les problèmes de performances et de mémoire, ce jeu de résultats initial doit rester aussi petit que possible.
AEM propose deux méthodes d’optimisation des requêtes GraphQL :
-
La pagination.
- Le tri n’est pas directement lié à l’optimisation, mais est lié à la pagination.
Chaque approche comporte ses propres cas d’utilisation et ses propres limites. Cette section fournit des informations sur le filtrage hybride et la pagination, ainsi que sur certaines des bonnes pratiques à appliquer pour l’optimisation des requêtes GraphQL.
Utiliser le filtrage hybride GraphQL AEM
Recommandation
Le filtrage hybride combine le filtrage JCR avec le filtrage AEM.
Il applique un filtre JCR (sous la forme d’une contrainte de requête) avant de charger le jeu de résultats en mémoire pour le filtrage AEM. Cela permet de réduire le jeu de résultats chargé en mémoire, car le filtre JCR supprime les résultats superflus avant.
Cette technique permet de conserver la flexibilité offerte par les filtres GraphQL, tout en déléguant autant de filtrage que possible à JCR.
Référence supplémentaire
Voir :
Utilisation de la pagination GraphQL
Recommandation
Le temps de réponse des requêtes complexes, avec des jeux de résultats volumineux, peut être amélioré en segmentant les réponses en blocs à l’aide de la pagination, une norme GraphQL.
GraphQL dans AEM prend en charge deux types de pagination :
-
Pagination basée sur les limites/décalages
Elle est utilisée pour les requêtes de liste qui se terminent parList
, par exemplearticleList
.
Pour l’utiliser, vous devez indiquer la position du premier élément à renvoyer (leoffset
) et le nombre d’éléments à renvoyer (la variablelimit
, ou la taille de la page). -
La pagination basée sur le curseur (représentée par
first
etafter
).
Elle fournit un ID unique pour chaque élément ; également appelé curseur.
Dans la requête, vous spécifiez le curseur du dernier élément de la page précédente, ainsi que la taille de la page (le nombre maximal d’éléments à renvoyer).Comme la pagination basée sur le curseur ne s’intègre pas dans les structures de données des requêtes basées sur des listes, AEM a introduit un type de requête
Paginated
; par exemple :articlePaginated
. Les structures et paramètres de données utilisés suivent la Spécification de connexion du curseur GraphQL.NOTE
AEM prend actuellement en charge la pagination (à l’aide des paramètresafter
/first
).La pagination ascendante (à l’aide des paramètresbefore
/last
) n’est pas prise en charge.
Référence supplémentaire
Voir :
Utilisation du tri GraphQL
Recommandation
Le tri, qui est également une norme GraphQL, permet aux clients de recevoir du contenu JSON dans l’ordre de tri. Cela peut réduire la nécessité d’un traitement supplémentaire sur le client.
Le tri ne peut être efficace que si tous les critères de tri sont liés à des fragments de niveau supérieur.
Si l’ordre de tri inclut un ou plusieurs champs situés sur un fragment imbriqué, tous les fragments partageant le modèle de niveau supérieur doivent être chargés en mémoire. Cela a un impact négatif sur les performances.
Référence supplémentaire
Voir :
Bonnes pratiques
L’objectif principal de toute recommandation d’optimisation est de réduire le jeu de résultats initial. Les bonnes pratiques répertoriées ici fournissent des moyens de le faire. Elles peuvent (et doivent) être combinées.
Filtrer sur les propriétés de niveau supérieur uniquement.
Actuellement, le filtrage au niveau JCR ne fonctionne que pour les fragments de niveau supérieur.
Si un filtre s’adresse aux champs d’un fragment imbriqué, AEM doit recharger (en mémoire) tous les fragments qui partagent le modèle sous-jacent.
Vous pouvez toujours optimiser ces requêtes GraphQL en combinant des expressions de filtre sur les champs de fragments de niveau supérieur et ceux des champs de fragments imbriqués avec l’Opérateur ET.