Richiesta di memorizzazione nella cache per l'applicazione Symfony 3 con 1 milione di combinazioni di parametri di query

3

Abbiamo una build Webservice REST con Symfony3 e PHP7. L'applicazione è servita tramite Nginx e PHP-FPM.

Il servizio Web restituisce un elenco di prodotti. I prodotti all'interno dell'elenco sono filtrati per attributi. Il risultato sarebbe l'elenco con un sottoinsieme dei suoi prodotti, filtrato per attributi. Questi attributi vengono inviati tramite i parametri GET nell'URL. Per ora ci sono 4 parametri che generano circa 1 milione di combinazioni di Url per prodotto. I dati del prodotto cambiano costantemente.

Elenco di esempi prima del filtro:

{
  name: "list1",
  products: [
    {
     name: "product1"
    },
    {
     name: "product2"
  ]
}

Elenco di esempio dopo il filtraggio:

{
  name: "list1",
  products: [
    {
     name: "product2"
  ]
}

Esempio di risorsa API: /list?slug=list1&filter1=foo&filter2=bar&filter3=baz

Per migliorare le prestazioni, desideriamo memorizzare nella cache le richieste con Nginx fastcgi_cache. La risposta verrebbe memorizzata nella cache con una chiave cache uguale all'URL della richiesta.

Quando archiviamo le risposte per 1 ora, è necessario invalidare le voci della cache quando i dati di un prodotto cambiano. Quindi dobbiamo invalidare tutte le voci della cache che includono quel prodotto.

Quindi quello che potrei fare è che potrei scoprire tutte le liste che includono il prodotto. E poi crea ogni combinazione di filtri e crea tutti gli URL possibili per la lista. Quindi annulla le voci.

Penso che sarebbero necessarie molte risorse per invalidare / aggiornare la cache.

Come eseguire correttamente la cache e invalidare correttamente la cache in tali situazioni?

Domanda simile senza risposta L'elaborazione / filtraggio deve essere eseguita lato client o lato server per le applicazioni basate su catalogo

    
posta Andi 30.06.2016 - 11:24
fonte

1 risposta

1

Il caching non è un miglioramento delle prestazioni, è un modo per rendere le prestazioni scadenti più tollerabili e funziona solo se i dati rimangono identici e vengono utilizzati molto. Generalmente è meglio memorizzare nella cache il set di risultati completo e quindi filtrare su richiesta, questo consente un utilizzo minimo della memoria e il massimo utilizzo dei risultati memorizzati nella cache. Puoi raccogliere dati e analizzare quali combinazioni sono più popolari e mettere in cache anche quelle se il filtro stesso è la parte lenta, ma fai attenzione a quanto ti allontani da questo percorso più frammenta la tua cache meno diventa utile.

Per quanto riguarda l'invalidazione di una cache quando i dati dietro di essa cambiano, questo è antitetico all'utilizzo della memorizzazione nella cache. I risultati obsoleti / potenzialmente obsoleti rappresentano un inconveniente per il caching, che viene mitigato scegliendo i tempi giusti per far scadere la cache in una serie o in una pianificazione continua. È possibile eseguire il polling delle modifiche da quando è stata creata la cache, ma questo probabilmente eliminerà la maggior parte del tuo guadagno in termini di prestazioni a meno che l'elenco dei prodotti non sia estremamente lento. Se controlli il modo in cui i prodotti vengono aggiunti / modificati puoi modificare quel processo per far scadere la cache, questa è una soluzione migliore del polling ma può limitare l'utilità della memorizzazione nella cache se gli aggiornamenti del prodotto sono troppo frequenti.

    
risposta data 30.06.2016 - 17:23
fonte

Leggi altre domande sui tag