Alcune opzioni.
Utilizzare un canale di comunicazione persistente
Invece di HTTP, rilascia i messaggi in una coda altamente disponibile e persistente. Ad esempio Kafka. Finché il server di destinazione diventa disponibile a un certo punto, riceverà il messaggio.
Ora hai il compromesso del provisioning e della gestione di un sottosistema complesso (la coda). Quindi assicurati di analizzare se questo vale la pena.
Backoff e riprovare
Chiedi al chiamante di conservare la richiesta non riuscita (possibilmente persistente su disco) e riprovare periodicamente. In questo caso è importante distinguere tra la tua richiesta causando un arresto anomalo e il servizio inattivo. Il primo è probabilmente dovuto a un bug e dovrebbe essere registrato ... probabilmente i tentativi non faranno la differenza fino a quando non verrà effettuata una correzione.
Rileva e compensa
Un'attività periodica verifica le condizioni di coerenza tra i microservizi. Ad esempio, gli errori vengono registrati fino alle richieste API dirette, se necessario. Se rileva un problema (ad es. C'è un ordine ma la spedizione non ha mai ricevuto l'elenco di imballaggio), fai i passaggi di compensazione. Tali passaggi potrebbero essere la creazione di un ticket di supporto per una correzione manuale o l'invio tramite e-mail di qualcuno o altro.
Prendi in considerazione le alternative di progettazione
Un caso come questo probabilmente richiede un gateway API per gestire le chiamate ai microservizi interessati. In questo modo controlli quali tattiche vengono utilizzate per mitigare questo problema. Probabilmente non vorrai caricare i clienti con quei dettagli di implementazione. Vedi il modello dell'interruttore .
Poiché i microservizi sono indipendenti, esiste sempre qualche caso di errore che può causare incoerenze. Devi essere pronto a fare correzioni manuali quando si presentano.
Se si richiede una forte coerenza, i microservizi non saranno adatti. Se hai ancora bisogno di scalabilità, potresti voler esaminare il sharding in cui i dati correlati possono essere collocati nello stesso frammento per garanzie di coerenza. Puoi comunque ridimensionare IO aggiungendo frammenti.
Se hai bisogno di una forte coerenza e non hai problemi di scalabilità, usa semplicemente i servizi monolitici. Utilizzare le librerie come limiti all'interno dell'applicazione per separare le preoccupazioni.