Architettura ad alta scala che utilizza l'event sourcing e la coerenza finale

2

Voglio condividere con voi e sapere quali sono le vostre opinioni / miglioramenti riguardo a una soluzione che mi è stata assegnata con un colloquio tecnico che ho affrontato.

L'esercizio:

  • Devi creare un'API che indichi in base a un DNA se una persona è maschio o femmina. Questa API deve avere due endpoint:

POST / genere:         Riceverà un DNA (una matrice di NxN) e restituirà 200 (ok) se è una donna e 403 (proibito) se è un uomo. Il corpo dovrebbe apparire così:

{
  "dna" : ["ATGCGA","CAGTGC","TTATGT","AGAAGG","CCCCTA","TCACTG"] 
}

L'algoritmo deciderà se si tratta di una donna se c'è più di una sequenza con quattro caratteri uguali. Ad esempio:

GET/stats

Restituiràirisultatiinquestomodo:

{"count_men_dna" :40, 
  "count_women_dna": 60,
  "ratio: 0.4
}

Istruzioni:

  • Crea l'API
  • Persistere ogni DNA analizzato solo e solo una volta
  • Tieni presente che l'API potrebbe essere sopraffatta inaspettatamente con raffiche fino a UN MILIONE DI RICHIESTE AL SECONDO

Supponiamo che io abbia il miglior algoritmo al mondo per analizzare DNA, concentriamoci sull'architettura.

La mia architettura

  1. Viene ricevuta una richiesta, il DNA viene convalidato e analizzato SINCRONAMENTE
  2. Una risposta viene inviata al client e un nuovo messaggio viene inviato alla coda
  3. Il lavoratore riceve il messaggio ed esegue due passaggi in modo non discriminante:
    1. Decide che il DNA è già presente nel negozio e lo salva se è richiesto
    2. Invia un nuovo messaggio all'archivio eventi di Stats (NEW_WOMAN o NEW_MAN)

L'API

/ genere

È scritto in NodeJS + ExpressJS. Verrà eseguito in una VM che sarà dietro un Load Balancer. Questi servizi dovrebbero essere in grado di scalare automaticamente in base al traffico / richiesta (ad esempio, ad esempio). Per ciascuna richiesta, il DNA viene analizzato e un nuovo messaggio viene aggiunto alla coda. Questo disaccoppia il processo di risposta al client dal processo di archiviazione. Ma è ancora possibile un collo di bottiglia o un punto di contesa dal momento che l'analisi è avvenuta qui.

/ statistiche

Legge tutti gli eventi nell'archivio eventi di Stats e calcola ciò che è richiesto. Questo sta usando l'architettura Event Sourcing, quindi ci deve essere un processo responsabile della creazione di uno snapshot periodicamente per evitare di avere molti registri nello store.

Il negozio

È un database ElasticSearch con due indici, uno per la memorizzazione di uomini / donne e un altro per la memorizzazione delle statistiche

Il lavoratore

È un processo scritto NodeJS che viene eseguito in una VM. Legge i messaggi dalla coda e controlla se il DNA esiste già nel People:

  1. Salva il DNA nel negozio se non esiste ancora
  2. Spingi un nuovo log nell'archivio eventi di Stats se è una persona nuova.

Qui è dove trovo il punto più complicato di contesa e blocco per il ridimensionamento. Anche se è in esecuzione solo un'istanza, non vi sono problemi poiché tutti i messaggi verranno letti uno ad uno. I problemi iniziano se voglio creare più istanze del lavoratore poiché ci saranno problemi di coerenza.

Che cosa dovrei modificare / aggiungere nell'architettura e quali considerazioni dovrei prendere in considerazione per raggiungere l'obiettivo?

Come posso trarre un vantaggio reale da modelli come Event Sourcing , Eventual Consistency e CQRS ?

Apprezzerei qualsiasi documento, opinione o esperienza che voi ragazzi possano condividere.

Voglio aggiungere che ho la posizione, quindi voglio solo imparare e migliorare le mie capacità di architettura

Grazie.

    
posta Facundo La Rocca 27.05.2018 - 19:46
fonte

1 risposta

2

Il problema è irrisolvibile.

I requisiti per l'API sono che restituisce 200 o 400 alla richiesta. Essenzialmente una chiamata RPC sincrona

Ma anche che sarà "sopraffatto" di tanto in tanto. Che richiede una soluzione asincrona.

Qualsiasi soluzione che soddisfi i requisiti si bloccherà quando i server Web raggiungeranno i loro limiti di connessione aperti o il client interrompe le richieste.

    
risposta data 28.05.2018 - 12:32
fonte

Leggi altre domande sui tag