Le migliori pratiche per la gestione della comunicazione inter-asincrona?

10

Recentemente completato un progetto per la gestione dell'elaborazione della carta di credito. Una delle difficoltà che ho dovuto affrontare è stata la gestione del ritardo / possibile errore dei messaggi di notifica. L'esempio più complesso è stato:

  • un sistema esterno che invia la richiesta di pagamento
  • il mio sistema ha trasformato quella richiesta in una richiesta al gateway di pagamento
  • invio dell'utente al gateway
  • in attesa che l'utente esegua il pagamento
  • l'utente che ritorna al mio sistema ma viene trattenuto finché il sistema non riceve notifica di successo / errore
  • Invio dell'utente al sistema esterno a seconda dell'errore

Ancora più difficile è il fatto che, in caso di mancata trasmissione della notifica, il gateway tenta di inviare la notifica ogni 15 minuti per un certo numero di ore.

L'ho risolto utilizzando un record del database delle transazioni in sospeso e quindi rilevando il successo e l'insuccesso dal rendimento più un listener di ritardo temporizzato per la notifica e la gestione delle transazioni ...

Ragionevolmente difficile!

Ma questo deve essere stato risolto un miliardo di volte prima quindi qual è la migliore pratica?

Riesco a vedere che il mio futuro scriverà la gestione di tutti questi sistemi e gestirà i ritardi e gli eventuali guasti della rete, quindi voglio seguire le best practice.

Le raccomandazioni di libri / articoli sarebbero grandiose.

Grazie in anticipo!

    
posta user86928 30.03.2013 - 18:57
fonte

1 risposta

13

Quando si costruiscono sistemi distribuiti, la differenza tra un sistema 'sincrono' e un sistema 'asincrono' è questa: un sistema sincrono ha limiti superiori conosciuti sui tempi di calcolo e di consegna dei messaggi. Quindi: hai un sistema asincrono in cui determinati eventi non hanno questi limiti superiori noti. Come lo gestisci?

  1. Se questi processi asincroni hanno limiti superiori probabilistici allora puoi utilizzare i timeout per far sì che il tuo sistema si comporti come un sistema parzialmente sincrono . Se il tempo di risposta del trentesimo percentile del gateway di pagamento è 5 secondi, un timeout di 5 secondi renderà il 98% delle richieste riuscite e l'altro 2% avrà esito negativo. Ciò significa che ora si ha un limite superiore noto per quanto tempo questo processo avrà esito positivo o negativo. Questo rilevamento di errori probabilistici è uno strumento fondamentale per trasformare sistemi asincroni in sistemi sincroni.

  2. Conserva un record durevole di questi eventi in modo da poter ripristinare lo stato del sistema in caso di errore del sistema. Se il gestore del gateway di pagamento mantiene questi eventi nella memoria volatile e si blocca, allora sei fregato.

  3. Ogni transazione complessa è essenzialmente una serie di trasformazioni di stato basate sull'invio e la ricezione di messaggi (eventi) all'interno del sistema. Sembra che tu stia modellando in modo informale questo utilizzando il tuo "record di transazioni in sospeso" ma ti suggerirei di andare oltre: per ogni transazione devi gestire, creare una macchina a stati formali che la descriva e tieni una registrazione duratura del suo stato attuale. Scoprirai che queste macchine a stati sono facili da capire, facili da testare e offrono una visibilità tanto necessaria in questi processi sia per te che per i tuoi utenti.

Quanto più asincrono è il tuo sistema, tanto più formale ed esplicito devi essere quando gestisci queste complesse trasformazioni di stato con evento. Timeout, registrazione degli eventi duratura e macchine a stati sono le migliori pratiche qui. Questo è il motivo per cui Erlang OTP basa la maggior parte del suo comportamento applicativo sul modello di macchina di stato, per esempio.

Per riferimento, non ho trovato nulla di meglio di Introduzione alla Programmazione distribuita affidabile e sicura . Vi fornirà una solida base algoritmica per comprendere sia i sistemi sincroni che asincroni dai primi principi.

    
risposta data 30.03.2013 - 19:15
fonte

Leggi altre domande sui tag