Abilita caching AEM Dispatcher
Consiglio
AEM Dispatcher è la cache di primo livello all'interno del servizio AEM, prima della cache CDN.
Ulteriori riferimenti
Consulta:
Utilizzare una rete per la distribuzione dei contenuti (CDN)
Consiglio
Le query GraphQL e le relative risposte JSON possono essere memorizzate nella cache se impostate come GET
richieste quando si utilizza una rete CDN. Al contrario, le richieste non memorizzate nella cache possono essere molto (risorse) costose e lente da elaborare, con il potenziale di ulteriori effetti negativi sulle risorse dell’origine.
Ulteriori riferimenti
Consulta:
Impostare le intestazioni di controllo cache HTTP
Consiglio
Quando si utilizzano query GraphQL persistenti con una rete CDN, si consiglia di impostare intestazioni di controllo della cache HTTP appropriate.
Ogni query persistente può avere un proprio set specifico di intestazioni di controllo cache. Le intestazioni possono essere impostate su API GraphQL o IDE GraphiQL AEM.
Ulteriori riferimenti
Consulta:
Ottimizzazione query GraphQL
In un’istanza AEM con un numero elevato di frammenti di contenuto che condividono lo stesso modello, le query di elenco GraphQL possono diventare costose (in termini di risorse).
Questo perché devono essere caricati in memoria tutti i frammenti che condividono un modello utilizzato all’interno della query GraphQL. Ciò richiede tempo e memoria. Il filtro, che può ridurre il numero di elementi nel set di risultati (finale), può essere applicato solo dopo il caricamento dell’intero set di risultati in memoria.
Questo può dare l’impressione che anche piccoli set di risultati portino a cattive prestazioni. Tuttavia, in realtà la lentezza è causata dalle dimensioni del set di risultati iniziale, in quanto deve essere gestito internamente prima di poter applicare il filtro.
Per ridurre i problemi di prestazioni e memoria, il set di risultati iniziale deve essere ridotto il più possibile.
AEM consente due approcci per ottimizzare le query GraphQL:
-
Paging (o impaginazione)
- Ordinamento non è direttamente correlato all’ottimizzazione, ma è correlato al paging
Ogni approccio ha i propri casi d’uso e limitazioni. Questa sezione fornisce informazioni su Filtro e paginazione ibridi, insieme ad alcune delle best practice per l'ottimizzazione delle query GraphQL.
Utilizzare il filtro ibrido AEM GraphQL
Consiglio
Il filtro ibrido combina il filtro JCR con il filtro AEM.
Un filtro JCR viene applicato (sotto forma di vincolo di query) prima di caricare il set di risultati in memoria per il filtro AEM. In questo modo si riduce il set di risultati caricato in memoria, dato che il filtro JCR rimuove i risultati superflui precedenti.
Questa tecnica mantiene la flessibilità fornita dai filtri GraphQL, delegando la maggior parte del filtro possibile a JCR.
Ulteriori riferimenti
Consulta:
Usa paginazione GraphQL
Consiglio
Il tempo di risposta di query complesse, con set di risultati di grandi dimensioni, può essere migliorato segmentando le risposte in blocchi utilizzando l’impaginazione, uno standard di GraphQL.
GraphQL in AEM supporta due tipi di impaginazione:
-
paginazione basata su limite/offset
Utilizzato per le query elenco; terminano conList
; ad esempio,articleList
.
Per utilizzarlo, devi fornire la posizione del primo elemento da restituire (iloffset
) e il numero di elementi da restituire (illimit
, o dimensioni della pagina). -
paginazione basata su cursore (rappresentato da
first
eafter
)
Fornisce un ID univoco per ciascun elemento, noto anche come cursore.
Nella query, si specifica il cursore dell’ultimo elemento della pagina precedente, più le dimensioni della pagina (il numero massimo di elementi da restituire).Poiché l’impaginazione basata su cursore non si adatta alle strutture di dati delle query basate su elenco, AEM ha introdotto il tipo di query
Paginated
; ad esempio,articlePaginated
. Le strutture di dati e i parametri utilizzati seguono i Specifica di connessione cursore GraphQL.NOTE
AEM attualmente supporta il paging in avanti (utilizzando i parametriafter
/first
).Il paging all’indietro (utilizzandobefore
/last
) non è supportato.
Ulteriori riferimenti
Consulta:
Usa ordinamento GraphQL
Consiglio
Inoltre, uno standard GraphQL, l’ordinamento consente ai client di ricevere contenuti JSON in ordine ordinato. Questo può ridurre la necessità di ulteriori elaborazioni sul client.
L’ordinamento può essere efficiente solo se tutti i criteri di ordinamento sono correlati ai frammenti di primo livello.
Se l’ordinamento include uno o più campi che si trovano su un frammento nidificato, tutti i frammenti che condividono il modello di livello principale devono essere caricati in memoria. Questo causa un impatto negativo sulle prestazioni.
Ulteriori riferimenti
Consulta:
Best practice
L’obiettivo principale di tutte le raccomandazioni di ottimizzazione è ridurre il set di risultati iniziale. Le best practice elencate di seguito indicano come farlo. Possono (e devono) essere combinate.
Filtrare solo le proprietà di livello superiore
Attualmente, il filtro a livello JCR funziona solo per i frammenti di livello superiore.
Se un filtro comprende i campi di un frammento nidificato, AEM deve ricorrere al caricamento (nella memoria) di tutti i frammenti che condividono il modello sottostante.
Puoi comunque ottimizzare tali query GraphQL combinando espressioni filtro su campi di frammenti di primo livello e su campi di frammenti nidificati con l’operatore AND.