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 :

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.

NOTE
Pour des raisons techniques (par exemple : flexibilité, imbrication de fragments), AEM ne peut pas déléguer l’intégralité du filtrage à JCR.

Cette technique permet de conserver la flexibilité offerte par les filtres GraphQL, tout en déléguant autant de filtrage que possible à JCR.

NOTE
Le filtrage hybride AEM nécessite la mise à jour des fragments de contenu existants.

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 par List, par exemple articleList.
    Pour l’utiliser, vous devez indiquer la position du premier élément à renvoyer (le offset) et le nombre d’éléments à renvoyer (la variable limit, ou la taille de la page).

  • La pagination basée sur le curseur (représentée par firstet after).
    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ètres after/first).
    La pagination ascendante (à l’aide des paramètres before/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.

NOTE
Le tri sur les champs de niveau supérieur a également un impact (quoique faible) 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.