Sto cercando di progettare un job scheduler generico per espandere le mie conoscenze architettoniche e la capacità di pensare alle domande di progettazione del sistema nelle interviste. Finora, quello che ho trovato è sotto. Puoi indicare dove dovrei lavorare per essere esauriente nel mio approccio per affrontare questo tipo di problema?Progettare un job scheduler generico
Ho letto molte risorse online ma ho bisogno di una guida specifica per andare avanti.
Progettare un programmatore di lavoro generico per la società X (che è una delle grandi aziende di tecnologia di oggi).
I casi d'uso
Create/Read/Update/Delete Jobs
Indagare lavori che sono stati eseguiti in passato (tipo di lavoro, il tempo trascorso, dettagli)
Vincoli
Quanti lavori verranno eseguiti sul sistema al secondo?
= # lavori/ora a causa di utenti + # lavori/ora a causa di macchine
= 1m * 0,5/giorno/24/3600 + 1m/50 * 20/24/3600
~ = 12 lavori/sec
Quanti dati deve essere memorizzato dal sistema?
ragionamento: io sono solo la memorizzazione dei posti di lavoro particolari di esecuzione, l'attuale lavoro (esecuzione dello script) è fatto> su altre macchine e alcuni dei dati raccolti è ora di fine, il successo/stato di errore, ecc. Questi sono> tutti probabilmente solo testo, magari con grafica a scopo illustrativo. Io sarò la memorizzazione dei dati di>> tutti i lavori eseguiti sul nel sistema tramite il job scheduler (vale a dire nel corso degli ultimi 10 anni)
= (Dimensioni della pagina in cui i dettagli del lavoro sono istituiti + dimensione dei dati raccolti a proposito di lavoro) * # di posti di lavoro * 365> giorni * 10 anni = 1 MB * 900 000 * 365 * 10
~ = 3600 000 000 MB
= 3600 000 GB
= 3600 TB = 3,6 PB
Abstract Design
Sulla base delle informazioni di cui sopra, non abbiamo bisogno di avere troppi macchine per contenere i dati. Vorrei suddividere il progetto in seguente:
Livello applicazione: serve le richieste, mostra i dettagli dell'interfaccia utente.
strato di memorizzazione dati: si comporta come una grande tabella hash: Memorizza le mappature di di valori-chiave (chiave sarebbe i posti di lavoro organizzati da dateTime sono stati eseguiti, mentre i valori sarebbero mostrare i dettagli di questi posti di lavoro). Questo per abilitare la ricerca semplice di dei lavori storici e/o pianificati.
I colli di bottiglia:
Traffico: 12 posti di lavoro/sec non è troppo impegnativo. Se si verificano picchi, è possibile utilizzare per il bilanciamento del carico per distribuire i lavori su server diversi per l'esecuzione di .
Dati: A 3,6 TB, abbiamo bisogno di una tabella hash che può essere facilmente interrogato per l'accesso rapido ai lavori che sono stati eseguiti nell'applicazione .
Scaling il disegno astratto
La natura di questo lavoro di pianificazione è che ogni lavoro possiede uno di un pochi stati: In attesa, Non, Successo, terminato. Nessuna logica aziendale Restituisce pochi dati.
Per gestire il traffico, è possibile disporre di un server applicazioni che gestisce 12 richieste/sec e un backup nel caso in cui questo non riesca. In futuro, possiamo usare il bilanciamento del carico per ridurre il numero di richieste andando a ciascun server (supponendo che> 1 server sia in produzione) Vantaggio di questo sarebbe per ridurre il numero di richieste/server, aumentare la disponibilità (nel caso uno il server non funziona e gestisce bene il traffico spike-y ).
Per la memorizzazione dei dati, per memorizzare 3,6 TB di dati, è necessario disporre di alcune macchine per conservarle nel database. Possiamo usare un db noSQL o un db SQL. Dato che l'ultimo ha un uso più diffuso e un supporto di comunità che aiuterebbe nella risoluzione dei problemi e viene utilizzato dalle grandi aziende al momento, I scegliere mySQL db.
Poiché i dati cresce, vorrei adottare le seguenti strategie per gestire esso:
1) Crea indice univoco nella hash
2) Scala DB MySQL in verticale con l'aggiunta più memoria
3) Partizione dei dati per sharding
4) Utilizzare una strategia di replica master-slave con master master di replica per garantire la ridondanza dei dati
Conclusione
Quindi, questa sarebbe la mia progettazione dei componenti di un job scheduler.
Suggerirei di esaminare l'architettura di uno dei programmi di pianificazione di lavoro su larga scala esistenti. slurm (https://computing.llnl.gov/linux/slurm/) e grid-engine (http://gridscheduler.sourceforge.net/) vengono in mente come candidati primi. –