Sommario[Nascondere][Spettacolo]
- 1. Cosa intendi per progettazione del sistema?
- 2. Quali sono le caratteristiche più importanti di un progettista di sistemi?
- 3. Che cos'è esattamente il teorema della PAC?
- 4. Cosa intendi per bilanciamento del carico?
- 5. Qual è la differenza tra programmazione asincrona e programmazione parallela?
- 6. Qual è la differenza tra il ridimensionamento orizzontale e verticale?
- 7. Cosa intendi esattamente per latenza, velocità effettiva e disponibilità del sistema?
- 8. Cosa sono le proprietà degli ACIDI?
- 9. Che cos'è esattamente lo sharding?
- 10. Cos'è la CDN?
- 11. Perché usare CDN?
- 12. Qual è la differenza tra partizionamento orizzontale e partizionamento?
- 13. Che cos'è esattamente la memorizzazione nella cache?
- 14. Cosa sono i server perimetrali CDN?
- 15. Quali sono i diversi modelli di coerenza per la progettazione del sistema?
- 16. Cosa intendi per blocco ottimistico?
- 17. Cosa intendi esattamente per "elezione dei leader"?
- 18. Qual è il tuo approccio per la progettazione di un servizio di accorciamento URL simile a TinyURL?
- 19. Qual è il tuo approccio alla progettazione di Twitter?
- 20. Crea il sistema di newsfeed per Facebook
- 21. Che cos'è la proprietà BASE di un sistema?
- 22. Che cos'è il bilanciamento del carico con la tecnica di affinità dell'indirizzo IP?
- 23. Cosa sono esattamente gli algoritmi di sostituzione della cache (o politica di eliminazione)?
- 24. Cosa intendi esattamente per transazione distribuita?
- 25. Che cos'è esattamente la fame?
- Conclusione
Prima di iniziare, ti consigliamo di leggere il nostro guida introduttiva alla progettazione del sistema per rinfrescare le tue conoscenze fondamentali.
Quando fai un colloquio per una posizione che richiede conoscenze di progettazione di sistema, hai la possibilità di parlare del tuo background e dimostrare la tua capacità di sviluppare sistemi complicati.
Quando parli con un potenziale datore di lavoro, il modo in cui esprimi la tua esperienza potrebbe aiutarti a dimostrare di essere un candidato competente per la posizione.
Puoi prepararti per il tuo colloquio di lavoro imparando i concetti di base del design e pensando a come rispondere alle domande su di essi. Esamineremo alcune domande e risposte tipiche del colloquio di progettazione del sistema in questo post per aiutarti a prepararti per il tuo prossimo colloquio.
1. Cosa intendi per progettazione del sistema?
Il processo di definizione delle caratteristiche del sistema, inclusi moduli, architettura, componenti e relative interfacce e dati in base a criteri predeterminati, è noto come progettazione del sistema.
È il processo di definizione, creazione e progettazione di sistemi per soddisfare gli obiettivi e gli obiettivi specifici di un'azienda o di un'organizzazione. La progettazione del sistema riguarda più l'analisi del sistema, i modelli architetturali, le API, i modelli di progettazione e l'incollaggio di tutti insieme che la codifica.
2. Quali sono le caratteristiche più importanti di un progettista di sistemi?
- Interazione dell'utente
- Chiamata API esterna
- Processi offline
3. Che cos'è esattamente il teorema della PAC?
Secondo il teorema CAP (Consistency-Availability-Partition Tolerance), un sistema distribuito non può garantire C, A e P contemporaneamente. Può fornire solo due delle tre assicurazioni al massimo. Usiamo un sistema di database distribuito per aiutarci a comprendere questo.
- Coerenza: specifica che i dati devono rimanere coerenti una volta completata una transazione del database. Ad esempio, tutte le query dovrebbero restituire la stessa risposta dopo un aggiornamento del database.
- Disponibilità: i database devono essere sempre disponibili e reattivi.
- Tolleranza partizione: anche se la comunicazione diventa problematica, il sistema di database dovrebbe continuare a funzionare.
4. Cosa intendi per bilanciamento del carico?
Bilancio del carico è il processo di dispersione efficiente del traffico in entrata tra un insieme di server back-end. Questi sono indicati come pool di server. I siti Web moderni sono progettati per gestire milioni di domande dei clienti e rispondere in modo rapido e affidabile. Saranno necessari più server per gestire queste richieste.
In questo caso, è fondamentale dividere il traffico delle richieste in modo efficiente tra ciascun server per evitare di sovraccaricarli. Il sistema di bilanciamento del carico funziona come un controllore del traffico, intercettando le richieste e instradandole tra i server disponibili in modo che nessun server sia sovraccaricato, con un potenziale peggioramento delle prestazioni delle applicazioni.
5. Qual è la differenza tra programmazione asincrona e programmazione parallela?
Quando esegui qualcosa in modo asincrono, implica che non devi aspettare che finisca prima di poter passare a qualcos'altro. Il parallelismo si riferisce all'esecuzione simultanea di molti compiti.
Quando puoi suddividere i lavori in diversi blocchi di lavoro, il parallelismo funziona in modo efficace. Async e Callbacks sono un mezzo (strumento o meccanismo) per rappresentare la concorrenza, ovvero un gruppo di entità che potrebbero comunicare e condividere risorse.
6. Qual è la differenza tra il ridimensionamento orizzontale e verticale?
L'aggiunta di nuove apparecchiature informatiche a una rete che distribuisce la richiesta di elaborazione e memoria su una rete di dispositivi dispersi è denominata ridimensionamento orizzontale. Detto semplicemente, nuove istanze del server vengono aggiunte al pool corrente e il carico di traffico viene distribuito in modo efficiente tra questi dispositivi.
Il ridimensionamento verticale si riferisce all'idea di espandere la capacità delle risorse di un singolo computer aggiungendo RAM, CPU efficienti o migrando a una nuova macchina con capacità maggiore. La funzionalità del server può essere aumentata senza richiedere modifiche alla programmazione.
7. Cosa intendi esattamente per latenza, velocità effettiva e disponibilità del sistema?
Le prestazioni sono un aspetto essenziale della progettazione del sistema poiché contribuiscono alla velocità e all'affidabilità dei nostri servizi. Le tre misure di performance più importanti sono le seguenti:
- Il tempo necessario per recapitare un singolo messaggio in millisecondi è chiamato latenza.
- La quantità di dati trasferiti con successo attraverso un sistema in un determinato periodo di tempo viene definita velocità effettiva. I bit al secondo vengono utilizzati per misurarlo.
- La quantità di tempo a disposizione di un sistema per rispondere alle query è definita dalla sua disponibilità. Tempo di attività del sistema / (Tempo di attività del sistema+Tempo di inattività) è la formula per calcolarlo.
8. Cosa sono le proprietà degli ACIDI?
- Atomicità: assicura che le alterazioni del database siano tutte o nessuna.
- Coerenza: i valori dei dati nel database sono coerenti.
- Isolamento: si riferisce alla separazione di due transazioni.
- Durabilità: i dati vengono conservati anche se il server si guasta.
9. Che cos'è esattamente lo sharding?
Lo sharding è la tecnica per dividere un enorme set di dati logici in molti database. Si riferisce anche alla suddivisione orizzontale dei dati perché i dati verranno archiviati su più computer. Di conseguenza, un database condiviso può gestire più query di un singolo enorme computer.
10. Cos'è la CDN?
Una rete di distribuzione di contenuti è una rete mondiale di computer che collaborano per fornire rapidamente informazioni su Internet. Consente la consegna rapida di elementi come pagine HTML, file JavaScript, fogli di stile, immagini e video necessari per caricare contenuti Internet.
11. Perché usare CDN?
- Considerando che le risorse statiche costituiscono circa l'80% di un sito Web, l'adozione di una CDN riduce significativamente il carico sul server di origine.
- Poiché la distanza da percorrere è minore, le informazioni verranno fornite più rapidamente ai proprietari di siti Web che hanno visitatori da molte aree geografiche.
- Gli utenti di CDN beneficiano anche della capacità di aumentare e diminuire rapidamente in risposta agli aumenti di traffico.
12. Qual è la differenza tra partizionamento orizzontale e partizionamento?
Sharding del database: il partizionamento orizzontale del database è un metodo per partizionare un singolo set di dati in numerosi database in modo che possa essere archiviato su workstation diverse. I set di dati più grandi possono essere suddivisi in blocchi più piccoli e archiviati in diversi nodi di dati, aumentando la capacità di archiviazione totale del sistema.
Distribuendo i dati su molte macchine, un database condiviso può gestire più query di un singolo sistema.
Il partizionamento del database è il processo di divisione degli oggetti del database archiviati (tabelle, indici e viste) in parti separate. Per aumentare la controllabilità, le prestazioni e la disponibilità, gli oggetti di database di grandi dimensioni vengono partizionati.
In alcuni casi, il partizionamento può migliorare la velocità durante l'accesso ai dati partizionati. Il partizionamento può ridurre la dimensione dell'indice e aumentare la possibilità di individuare gli indici più necessari in memoria agendo come una colonna principale negli indici.
13. Che cos'è esattamente la memorizzazione nella cache?
La memorizzazione nella cache è la tecnica per conservare le copie dei file in un'area di archiviazione temporanea nota come cache, che velocizza l'accesso ai dati e riduce la latenza del sito. Solo una certa quantità di dati può essere memorizzata nella cache.
Di conseguenza, è fondamentale determinare le tecniche di aggiornamento della cache più adatte agli obiettivi aziendali.
14 Cosa sono i server perimetrali CDN?
I server CDN che memorizzano nella cache il materiale acquisito dal server di origine o dal cluster di archiviazione sono noti come server perimetrali. Punto di presenza è un termine usato frequentemente per descrivere i server perimetrali (POP).
Gli edge server sono fisicamente posizionati su un POP. In quel POP, le informazioni potrebbero essere memorizzate nella cache da molti server perimetrali.
La possibilità di fornire sezioni di un sito Web da più punti riduce la distanza tra il visitatore e il server Web, con conseguente minore latenza. I server perimetrali CDN raggiungono questo preciso obiettivo.
15. Quali sono i diversi modelli di coerenza per la progettazione del sistema?
Ogni richiesta di lettura dovrebbe recuperare i dati scritti più di recente, secondo il teorema CAP. Quando sono disponibili molte copie di dati, sincronizzarle in modo che i clienti ricevano dati aggiornati su base continua diventa una difficoltà. Di seguito sono riportati i possibili modelli di consistenza:
- Coerenza debole: a seguito di una scrittura di dati, la richiesta di lettura potrebbe o meno essere in grado di ottenere i dati aggiornati. Questo livello di stabilità è ideale per applicazioni in tempo reale come VoIP, chat video e giochi multiplayer.
- Coerenza finale: le letture alla fine visualizzeranno i dati più recenti entro millisecondi dopo che i dati sono stati scritti. In questo caso i dati vengono duplicati in modo asincrono. I sistemi DNS e di posta elettronica ne sono un esempio. Questo funziona in modo efficace nei sistemi con disponibilità elevata.
- Forte coerenza: dopo la scrittura dei dati, i futuri lettori visualizzeranno i dati più recenti. In questo caso i dati vengono copiati in modo sincrono. Questo può essere osservato negli RDBMS e nei file system, che sono appropriati per i trasferimenti di dati.
16. Cosa intendi per blocco ottimistico?
Il blocco ottimistico è un meccanismo in cui leggi un record, prendi nota di un numero di versione (i modi alternativi includono date, timestamp o checksum/hash) e quindi ricontrolla che la versione non sia cambiata prima di riscriverla.
Quando riscrivi il record, usi la versione per filtrare l'aggiornamento per assicurarti che sia atomico. (cioè, non è stato modificato tra quando controlli la versione e quando scrivi il record sul disco) e aggiornalo tutto in una volta.
17. Cosa intendi esattamente per "elezione dei leader"?
In un sistema distribuito con numerosi server che contribuiscono alla disponibilità dell'applicazione, possono esserci momenti in cui un solo server è responsabile dell'aggiornamento delle API di terze parti, poiché più server potrebbero causare problemi durante l'utilizzo delle API.
Questo server è noto come server primario e la procedura per selezionarlo è nota come elezione del leader. Quando il server leader si guasta in un sistema distribuito, i server devono notare l'errore e scegliere un nuovo leader. Utilizzando una tecnica di consenso, questo approccio è più adatto per applicazioni a disponibilità elevata e coerenza elevata.
18. Qual è il tuo approccio per la progettazione di un servizio di accorciamento URL simile a TinyURL?
TinyURL trasforma un URL lungo in un URL breve univoco. Queste tecnologie possono anche accettare un URL breve e restituire l'URL completo.
Quali sono alcune delle qualità cruciali?
- Crea un URL più corto dell'originale.
- Conserva l'URL più lungo e sostituiscilo con quello più breve.
- Consenti reindirizzamento in URL brevi.
- Sono supportati URL brevi con nomi personalizzati.
- Gestisci più richieste contemporaneamente.
Quali sono i problemi più diffusi?
- Come si tiene traccia dell'archiviazione del database?
- Cosa succede se il carico dell'utente supera le aspettative?
- Cosa succede se due persone utilizzano lo stesso URL personalizzato?
Considera i seguenti suggerimenti:
- L'hashing è una nozione che può essere utilizzata per collegare vecchi e nuovi URL.
- API REST può essere utilizzato per gestire la comunicazione front-end e bilanciare il carico pesante.
- Il multithreading è una nozione che consente di gestire più richieste contemporaneamente.
- Gli URL originali sono archiviati nei database NoSQL.
19. Qual è il tuo approccio alla progettazione di Twitter?
Requisiti dati:
- Invio di tweet
- Seguendo altri utenti
- Tweet feed/newsfeed
- Il sistema è scalabile
- Si carica velocemente
- Il sistema è affidabile
Puoi iniziare a pensare al design dell'API di Twitter dopo aver stabilito i criteri. Ecco come sembrerebbe:
Per iniziare, analizzeremo gli endpoint chiave dell'API. Ecco alcuni esempi:
- sendTweet(messaggio)
- followUser (ID utente)
- unfollowUser(ID utente)
- getFeed(pagina)
L'architettura che consentirà queste caratteristiche può quindi essere abbozzata. Possiamo iniziare con l'utente che invia una richiesta al server. Possiamo installare server API aggiuntivi dietro un sistema di bilanciamento del carico per aiutare a instradare livelli di traffico maggiori per soddisfare le esigenze di scalabilità. Avremo bisogno di aggiungere un database per archiviare i nostri tweet ora.
È importante ricordare che l'API che forniamo dovrebbe essere scalabile. Per rendere questo servizio scalabile, possiamo far leggere uno dei nostri server API da una cache separata per il nostro newsfeed. Nel farlo, dovremmo anche utilizzare un fornitore di feed per mantenere aggiornata la nostra cache di feed.
20. Crea il sistema di newsfeed per Facebook
Il newsfeed su Facebook consente agli utenti di vedere cosa sta succedendo nelle cerchie dei loro amici, nelle pagine preferite e nelle organizzazioni che hanno seguito.
Quali sono alcune delle caratteristiche essenziali?
- Crea un feed di notizie basato sui post di altre entità di sistema seguite dall'utente.
- Testo, immagini, audio e video possono essere utilizzati nei post di Newsfeed.
- In tempo reale, aggiungi nuovi contenuti al newsfeed dell'utente.
Quali sono alcuni dei problemi più comuni?
- Cosa succede se il nuovo post impiega molto tempo a comparire nel feed delle notizie?
- L'algoritmo può gestire un picco nell'attività degli utenti?
- Quali post devono essere visualizzati per primi nel feed delle notizie?
Considera i seguenti suggerimenti:
- Esamina il meccanismo di fanout per la distribuzione dei post ai follower.
- Esaminare come utilizzare il partizionamento orizzontale per gestire in modo efficiente carichi utente elevati.
- I dati del feed di un utente non devono essere duplicati su numerosi server. Il partizionamento orizzontale può invece essere eseguito in base agli ID utente.
21. Che cos'è la proprietà BASE di un sistema?
Le funzionalità BASE sono onnipresenti nei database NoSQL emersi di recente. Un sistema BASE non fornisce coerenza, secondo il teorema CAP. Questo è un acronimo inventato che corrisponde alla seguente proprietà del teorema CAP di un sistema:
- Il termine "sostanzialmente disponibile" significa che il sistema sarà sempre disponibile.
- Uno stato soft significa che lo stato del sistema può variare nel tempo, anche se non viene fornito alcun input. Ciò è dovuto principalmente all'eventuale coerenza del modello.
- Dato che il sistema non riceve input durante quel periodo, l'eventuale coerenza significa che il sistema diventerà coerente nel tempo.
22. Che cos'è il bilanciamento del carico con la tecnica di affinità dell'indirizzo IP?
Un altro metodo importante per il bilanciamento del carico è l'affinità dell'indirizzo IP. L'indirizzo IP del client è connesso a un nodo server in questo metodo. Un nodo server gestisce tutte le richieste da un indirizzo IP client.
Questo metodo è semplice da implementare poiché l'indirizzo IP è sempre accessibile nell'intestazione della richiesta HTTP e non sono necessarie ulteriori impostazioni. Se è probabile che i tuoi clienti abbiano i cookie disattivati, questa forma di bilanciamento del carico può essere vantaggiosa.
23. Cosa sono esattamente gli algoritmi di sostituzione della cache (o politica di eliminazione)?
Gli algoritmi di cache (noti anche come algoritmi di sostituzione della cache, criteri di sostituzione della cache o criteri di eliminazione della cache) sono istruzioni di ottimizzazione o algoritmi che un programma per computer o una struttura gestita dall'hardware può utilizzare per gestire una cache di dati archiviati nel computer.
La memorizzazione nella cache aumenta la velocità archiviando i dati utilizzati di recente o a cui si accede spesso in regioni di memoria a cui è più rapido o meno costoso accedere rispetto allo storage di memoria tradizionale. Quando la cache è piena, l'algoritmo deve decidere quali elementi rimuovere per far posto a quelli nuovi.
24. Cosa intendi esattamente per transazione distribuita?
Una transazione distribuita è qualsiasi circostanza in cui un singolo evento provoca l'alterazione di due o più fonti di dati distinte che non possono essere commesse atomicamente.
Diventa molto più complicato nel mondo dei microservizi poiché ogni servizio è un'unità di lavoro e la maggior parte delle volte numerosi servizi devono collaborare per il successo di un'azienda.
25. Che cos'è esattamente la fame?
Quando un thread non è in grado di acquisire un accesso regolare alle risorse condivise, si dice che stia morendo di fame. Ciò si verifica quando thread "avidi" o thread con "priorità" più elevata rendono le risorse condivise inaccessibili per lunghi periodi di tempo.
Si consideri un oggetto che fornisce un metodo sincronizzato che ritorna spesso in ritardo. Se un thread chiama ripetutamente questo metodo, gli altri thread che richiedono un frequente accesso sincronizzato allo stesso oggetto verranno spesso bloccati.
Conclusione
Una sessione di brainstorming è tutto ciò che comporta il colloquio di progettazione del sistema. Abbiamo affrontato le domande più comuni dell'intervista di System Design in questo post.
Una comprensione completa del metodo che stai adottando durante la creazione di un sistema specifico è fondamentale per superare un colloquio di progettazione del sistema.
Lascia un Commento