Dove dovrebbe andare l'interruttore automatico?
Sto sviluppando una nuova API REST e ho visto alcuni progetti posizionare l'interruttore nel Controller
. Lo mettevo nel file DAO
.
La prima differenza che posso dire è che inserendolo in DAO
è che ogni servizio che consuma questa terza parte sarà aperto nello scenario di errore. E mettendolo in Controller
, EVENTUALMENTE aprirebbe ogni percorso che consuma questa terza parte; quindi non sarà immediato. Ma la seconda scelta (nella Controller
) sembra più facile da mantenere.
Qualche consiglio su dove dovrebbe andare?
Risposte
Ci sono due parti in questa risposta. La prima parte è stata già affrontata da Robert Harvey nel suo commento:
- Secondo il catalogo dei modelli di microservizi di Chris Richardson, l' interruttore automatico dovrebbe trovarsi in un proxy per il servizio remoto. L'API Gateway è un buon posto per questo.
- Un'altra alternativa è la scoperta lato server, soprattutto se la strategia di ripristino implica la ricerca di altre istanze in esecuzione dello stesso servizio.
Ma c'è una seconda parte. L'obiettivo dell'interruttore automatico è quello di fallire velocemente se il servizio viene rilevato come non disponibile, invece di accumulare passaggi che falliranno in seguito creando molta frustrazione. Quindi l'interruttore ha il suo pieno senso solo se il servizio di consumo è pronto a reagire all'interruzione:
- Forse il servizio remoto è essenziale e il servizio di consumo potrebbe decidere di mettersi in attesa (es. interruttore interno).
- È possibile che il servizio remoto non sia essenziale e il servizio di consumo potrebbe decidere di continuare a servire, ma in modalità degradata.
- (gli interruttori basati sulla scoperta dei servizi probabilmente non falliranno, ma troveranno un altro servizio funzionante e i consumatori non se ne accorgeranno).
Dal punto di vista generale, questo tipo di scelte nel comportamento è responsabilità del titolare: il titolare si coordina tra gli elementi del servizio ed è in grado di adattare l'elaborazione in base alle informazioni di "fallimento".
Tuttavia, se nel tuo caso si tratta solo di ottenere dati da altrove e se la tua strategia di elaborazione degli errori è sempre la stessa (nessuna differenza tra essenziale e non essenziale; ad esempio prova a utilizzare un valore memorizzato nella cache se disponibile e altrimenti fallisci) potrebbe benissimo decidere di metterlo nel dao imho.