Quando un'operazione batch REST è migliore di molte singole transazioni?

0

Stiamo costruendo un'API REST che crea elementi in una rete CDN. Ogni elemento richiede da 5 a 7 secondi per essere creato e dobbiamo crearli il più rapidamente possibile finché ne abbiamo circa un milione.

Una scuola di pensiero nel nostro ufficio è che dovremmo fare molte piccole transazioni. Un altro è che dovremmo avere meno transazioni più grandi per ridurre al minimo la "chat" di rete, magari correndo come descritto qui .

Piccole transazioni sarebbero più semplici da implementare. Avrebbero implicato un po 'più traffico di rete (forse insignificante dato il tempo per articolo). Potrebbero anche essere vantaggiosi in caso di mancata creazione di un articolo.

Le prestazioni sono la nostra priorità, lo sviluppo costa un secondo. Questo post suggerisce che sia OK in linea di principio. Quale / come faccio?

Il nostro CDN offrirà immagini di proprietà in Nuova Zelanda. Pre-popoleremo il CDN con sei immagini di ciascuna proprietà che riteniamo possa essere richiesta. Le diverse immagini sono utilizzate da varie pagine nel nostro sito web.

Il processo di generazione dell'immagine ha questo aspetto:

for each property {
    call remote 3rd-party API to find property details;
    for each type of image required {
        call remote 3rd-party API to get image;
    }
}

L'API remota chiama ogni take tra 1 e 2 secondi. L'API remota è sul lato opposto del pianeta per i nostri utenti e i nostri server. Le cose che accadono localmente sono nell'ordine del millisecondo. Sto usando C # async dove possibile.

Se qualcuno richiede un'immagine che non è già memorizzata nella cache della CDN, in genere ritorna in due o tre secondi, il che è accettabile. Lo carichiamo anche con AJAX, quindi l'utente non è in attesa.

    
posta OutstandingBill 26.08.2016 - 01:04
fonte

2 risposte

0

In base all'aggiornamento, ciò che potresti fare è il seguente:

Funziona con le code

Popolazione iniziale:

for each property {
    insert job in queue 1 to handle property
}

coda 1

call remote 3rd-party API to find property details;

    for each type of image required {
        insert job in queue 2 to get image
    }

coda 2

call remote 3rd-party API to get image;

Opzioni di implementazione

Dovresti essere in grado di farlo con un semplice software di coda standard. Sarà parallelo e gestirà gli errori eccetera. Ciò ridurrà considerevolmente il tuo tempo di elaborazione e manterrà il tuo codice abbastanza semplice.

E l'esempio potrebbe essere: link ma ce ne sono molti altri. Qualche esempio potrebbe essere questo: link quindi useresti Lambda, che è abbastanza carino per questo tipo di lavoro perché si adatta bene.

La cosa bella di un pacchetto di code esistente è anche che ti aiuterà con i tentativi in caso di errore, ecc. In questo modo si riduce la quantità di logica da scrivere.

Performance

È possibile gestire la quantità di lavori all'interno della coda e ridimensionare gli operatori per trovare un adattamento ottimale. Potresti anche non voler invadere il fornitore dei dati da troppe richieste. Parla con loro prima di iniziare a colpirli con un sacco di richieste.

Le prestazioni qui sono praticamente illimitate, AWS scalerà incredibilmente probabilmente più strong del tuo fornitore se le loro richieste richiedono così tanto tempo.

Alternative

Chiaramente puoi farlo con qualsiasi tipo di software di coda. Dovresti solo assicurarti di alimentare l'elenco delle proprietà una volta. Se vuoi che un oggetto si aggiorni, puoi nutrirlo di nuovo e lo elaborerà di nuovo e otterrà le nuove immagini per esempio con lo stesso codice.

Ritardo

Se hai configurato come sopra il tuo unico miglioramento ulteriore sarebbe quello di scoprire perché ci vuole così tanto tempo per gestire le richieste. Ma suppongo che quanto sopra renderà meno rilevante.

    
risposta data 26.08.2016 - 13:41
fonte
0

Un buon test vale più di mille opinioni di esperti.

Ogni elemento impiega 7 secondi per essere creato quando lo si fa in quel modo?

Diversi modi di farlo rallentano in modo diverso. Fare batch può velocizzare le cose ma fino a quando non provi non lo sai.

Prova a fare 10. Poi 100. Poi a 1000. Esegui il tempo e scopri se è lineare.

Ora dovresti avere abbastanza dati per effettuare la chiamata.

Se è ancora doloroso scoprire perché ci vogliono 7 secondi. E quello che sta impiegando più tempo. C'è quasi sempre un modo per renderlo più veloce. Concentrati su ciò che sta prendendo la maggior parte del tempo. Non indovinare a questo.

    
risposta data 26.08.2016 - 03:46
fonte

Leggi altre domande sui tag