Sto cercando di progettare una web api in grado di ottenere dati da un server esterno ma con limitazioni. Sto cercando di capire come meglio progettarlo per essere efficiente.
La mia api ha un endpoint che prende un input. È un nome di dominio come [email protected]
. Il mio endpoint quindi effettua una chiamata http al dominio per ottenere un token di autenticazione, quindi effettua un'altra chiamata a quel dominio con lo username per ottenere alcuni dati che vengono restituiti al client. Tuttavia la mia API può accettare più nomi utente (virgola delimitata come [email protected], [email protected]
). Il mio server web sa per ogni dominio quali sono le connessioni parallele massime che posso fare per ottenere i dati.
Quindi il problema è come organizzare i dati in modo da massimizzare il calcolo parallelo ma rimanere entro i limiti.
Ecco i miei pensieri:
Prima analizzare l'elenco utenti e raggrupparli. Quindi avere un dizionario statico. La chiave è dominio, il valore è un oggetto personalizzato che ha 2 code. Entrambe le code contengono un elenco di Tasks
(da async / await). Tuttavia, la prima lunghezza massima della coda sarà il valore del limite per quel dominio.
[email protected], [email protected], [email protected], [email protected]
dictionary = {
"D.com" : [ // limit 2
[],
["[email protected]", "[email protected]", "[email protected]"]
],
"A.com" : [ // limit 3
[],
["[email protected]"]
]
}
Quindi posso eseguire un codice ogni secondo, che scorre attraverso tutti i valori del dizionario e riempie la prima coda con tanti oggetti Task dalla seconda coda (.e rimuovendo dalla seconda coda e inserendo prima) quindi è all'interno del limite.
Non appena è nella prima coda, l'attività viene eseguita utilizzando Parallel.Invoke()
, quindi quando l'attività è completata viene rimossa dalla prima coda (a meno che qualche richiesta non sia in attesa, spiegata nel prossimo paragrafo).
Lo faccio perché se viene fatta un'altra richiesta API al mio endpoint con alcuni nomi già dalla prima richiesta, voglio riutilizzarla. Quindi, se è nella prima coda, chiamo await
su tale attività.
In qualche modo al termine di un'attività, devo sapere che nessun'altra persona è in attesa di quell'utente nell'attività e, in tal caso, rimuoverla dalla prima coda. Inoltre, se un client si disconnette, dovrebbe rimuovere la visualizzazione della parte utenti per quel client.
Qualcuno sa se questo è un buon approccio?