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
- Viene ricevuta una richiesta, il DNA viene convalidato e analizzato SINCRONAMENTE
- Una risposta viene inviata al client e un nuovo messaggio viene inviato alla coda
- Il lavoratore riceve il messaggio ed esegue due passaggi in modo non discriminante:
- Decide che il DNA è già presente nel negozio e lo salva se è richiesto
- 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:
- Salva il DNA nel negozio se non esiste ancora
- 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.