Ok, sto lavorando alla memorizzazione nella cache basata su DynamoDb. Abbiamo un'API in cui ogni chiamata ci costa denaro reale e le informazioni recuperate sono "fresche" per 2-3 settimane, quindi ha senso memorizzarlo nella cache.
Non c'è alcun problema con la chiamata di dynamoDbClient.get(apiUrl)
e il recupero della risposta JSON memorizzata. Hanno lotti: 25 articoli in lotti per PUT e 100 articoli in lotti per GET. Quindi significa che se abbiamo bisogno di ottenere una risposta JSON per 100 voci, facciamo una chiamata invece di 100.
La domanda che ho è come organizzarlo nel modo migliore per il threading.
Ecco un'idea generale e sono aperto ai suggerimenti.
Supponendo di avere una chiamata batch con 100 voci, possiamo usare BlockingQueue<String>
per memorizzare le chiavi che possiamo usare in seguito. Useremmo il metodo blockingQueue.put()
, per fare in modo che altri thread aspettino se 150 thread sono arrivati in un metodo con un lotto di soli 100 disponibili.
Quindi il thread che entra nel metodo, ottiene il suo posto nella coda di batch, ha bisogno di un meccanismo di "blocco" per aspettare che arrivi la risposta e "svegliarlo" affinché la sua risposta sia disponibile.
pseudoCodeMethod(String resourceUrl) {
blockingQueue.put(resourceUrl); // sleep if no place
LockableResponse lockableResponse = getLockableResponse();
lockableResponse.setKey(resourceUrl);
lockableResponse.getSemaphore().acquire();
String jsonApiResponse = lockableResponse.getJsonApiResponse();
lockableResponse.clean();
return jsonApiResponse;
}
LockableResponse{
String resourceUrl;
String jsonApiResponse;
Semaphore semaphore = new Semaphore(0);
public void clean(){
resourceUrl = null;
jsonApiResponse = null;
}
}
Il mio pensiero è che dovremmo associare un resourceUrl per ogni risposta dinamodb con una struttura dati che ha semaforo da attendere per la risposta API che arriva per ~ 100 elementi in una chiamata batch.
Un thread separato esegue la chiamata e quindi itera attraverso la risposta, assegna jsonApiResponse
a% correttoresourceUrl
[ concurrentMap
per quello ?? ] e quindi chiama lockableResponse.release()
per riattivare il thread, quindi il thread richiede resourceUrl
ed esiste il metodo.
Il metodo clean()
potrebbe essere aggiunto per consentire il riutilizzo della stessa struttura. Sto pensando a una serie di risorse bloccabili in base alla capacità del lotto. Quindi potrebbero essere cancellati e riutilizzati per altre chiamate GET batch.
Pensieri? Suggerimenti?