Ho un servizio, chiamalo Service A
, che è basato su Storage Layer
, chiamalo DB
, cioè profondo a 5-6 livelli. Questo livello dipende da molti altri servizi.
Service A
sta avendo problemi di memoria e la correzione è di generare un'eccezione da DB
se la risorsa che stiamo cercando di recuperare è troppo grande per Service A
. La risorsa stessa viene recuperata in più roundtrip, quindi contiamo il numero di roundtrip ed è troppo alto, gettiamo e interrompiamo e proviamo un percorso di codice diverso, più lento, più costoso.
Il problema è che questo limite è specifico per Service A
. Tutti gli altri servizi che dipendono da DB
non hanno bisogno di questo limite.
Soluzione 1: leggi le impostazioni globali impostate dal servizio
FetchResource(...) {
if (numberOfRoundTrips > ServiceDefinedLimit) {
throw new Exception("Resource is too large");
}
}
In questo momento il limite è Infinity per tutti i servizi ma Service A
, che sembra approssimativo. Altrimenti non è concettualmente diverso dall'impostare alcune impostazioni di configurazione che dicono "ThrowIfResourceTooLarge".
Soluzione 2: passaggio in un booleano
FetchResource(..., bool throwIfSizeTooLarge) {
if (numberOfRoundTrips > HardCodedThreshold && throwIfSizetooLarge) {
throw new Exception("Resource is too large");
}
}
Il problema qui è che sembra una versione più complessa di Soluzione 1 . Inoltre, devo modificare ogni livello dal chiamante fino a questa funzione.
Soluzione 3: passaggio in una funzione
FetchResource(..., Func<State> condition) {
if (condition(numberOfRoundTrips, ...)) {
throw new Exception("Resource is too large");
}
}
Il problema con il terzo approccio è, ancora una volta, la modifica di tutti i livelli sopra di esso per convogliare questo valore dal chiamante a questo livello. Sembra concettualmente giusto per me.
Cercare il feedback delle persone su quale sarebbe l'approccio migliore. Più ci penso, più il numero 1 sembra corretto e il # 3 mi sembra carino ma ha troppo lavoro da implementare ora.