Quando un'applicazione A comunica con un sistema B esterno / di terze parti, c'è sempre la possibilità che B sia inattivo.
Diciamo che A genera un evento che dovrebbe essere inviato come messaggio a B via HTTP, qual è il modo migliore per garantire che il messaggio sia consegnato?
Una possibilità è ovviamente quella di avere qualche logica di riprovare per inviare nuovamente il messaggio alcune volte. Ma cosa dovremmo fare con il messaggio se la consegna fallisce troppe volte? O se A si blocca (forse a causa di troppi messaggi in attesa di essere inviati)? Quindi abbiamo bisogno di un modo per mantenere quei messaggi per poter riprendere il recapito dei messaggi dopo che A ha recuperato.
La mia prima idea era quella di archiviare tutti gli eventi in una tabella dedicata nel database e contrassegnarli quando vengono inviati. Quindi un collega ha sostenuto che non possiamo sempre fare affidamento sul database e dovremmo invece archiviare i messaggi localmente sul filesystem. Ma il secondo approccio sembra che implementeremo un messaggio in coda e saremmo migliori con una vera e propria coda di messaggi (che al momento non abbiamo per questa applicazione).
Lo stesso collega ha poi sostenuto che anche se abbiamo una coda di messaggi, non possiamo essere sicuri che il messaggio sia consegnato alla coda e avremmo ancora bisogno di implementare una coda sul filesystem. Mi sembra davvero eccessivo. Ciò significherebbe che per essere veramente sicuri dobbiamo implementare una coda di messaggi memorizzata localmente per tutte le comunicazioni anche tra i nostri microservizi diversi.
Per contesto questo è un volume basso con un sistema con pochi messaggi (al massimo negli anni '100) al giorno, ma hanno un valore molto alto (usato per la fatturazione) in modo che non vogliamo perdere nessuno.
Qualche idea?