Transkripte
1. Willkommen zu diesem Kurs!: Hallo Leute und willkommen
zu diesem Kurs zur Vorbereitung
auf das
Systemdesign-Interview. Mein Name ist Alex und ich bin
Softwareingenieur, der Test wird durchgeführt
und während
meiner Zeit in Softwareunternehmen auch
Systemdesign-Interviews gegeben während
meiner Zeit in Softwareunternehmen auch
Systemdesign-Interviews . Als ich von
der Möglichkeit hörte einen Kurs zu
erstellen, um
mehr über dieses komplexe
Interview zu erklären ,
war Typ II sehr begierig darauf, einen zu entwickeln. Dieser Kurs wird in
vier Lektionen strukturiert sein , die
praktische Schritte enthalten, die Sie unternehmen müssen, um
genau zu verstehen , worauf sich die
Interviewer bei der
Planung dieser Typen
freuen werden bei der
Planung dieser Typen
freuen des Interviews, das Sie zuerst weiterentwickeln
werden, präsentieren Sie Ihnen, was
Systemdesign ist. Und dann schauen wir uns die
Vorlage an, die funktioniert, wenn es darum geht, eine Frage zum
Systemdesign zu lösen. Danach werden wir
auch zwei
der häufigsten
Interviewfragen aus diesem Bereich lösen , indem wir eine neue URL, einen
Verkürzung des Dienstes und
das Foto-Sharing-System
entwerfen . Wenn Sie daran
interessiert sind Ihre
Interviewfähigkeiten für Softwareentwickler zu verbessern, sollten Sie diesen Kurs für Sie in Betracht ziehen. Es gibt keine anderen
Anforderungen als eine Internetverbindung S für
das Projekt dieser Klasse, es wird äußerst
praktisch sein und Sie müssen die Schritte
in der
Kursvorlage befolgen . So können Sie auf Ihrer Reise
beginnen Fragen zum Systemdesign
zu lösen. Wir dachten, das Gesagte, ich glaube, wir sind bereit. Wir sehen uns in der ersten Lektion.
2. Was ist Systemdesign?: Hallo Leute und willkommen
zurück im System. Hast du ihm das
interviewte Tutorial erzählt. In dieser Vorlesung werden wir diskutieren, was genau
Systemdesign ist, was ein
Systemdesign-Interview sein soll. Wir werden uns auch
einige allgemeine
bewährte Praktiken ansehen , wenn es um Ihr eigenes
Systemdesign-Interview
geht. Möglicherweise bringen Sie sie in die
Position, in der Sie
versuchen, einen Job für ein
Software-Engineering-Unternehmen zu finden. Und Sie haben die beiden gehört, ich werde ein
Systemdesign-Interview zusammen mit den technisch
orientierten Interviews führen , in denen Sie tatsächlich beschichten
sollten. Im Allgemeinen
dürfen
Sie in Interviews mit
Systemdesign nicht wirklich beschichten. Vielleicht nur ein bisschen, um
Ihre Punkte in einigen Teilen zu beweisen . Jetzt beginnen Sie
mit der Definition, was genau System einfach
gestaltet hat. Es ist nur der
Prozess der Definition verschiedener Module,
Schnittstellen, Komponenten und auch die Daten für
ein System, um bestimmte Anforderungen zu erfüllen , die
in Ihrer Frage angegeben werden können , dass
Sie eine neuer im Interview. Jetzt ist der
Systementwicklungsprozess tatsächlich der Prozess
, den Sie bei Ihrer Arbeit durchführen werden. Wenn Sie die
Entwicklerposition landen, wo Sie das System tatsächlich erstellen oder ändern werden. Zusammen mit den Prozessen,
Modellen, Methoden
und auch Praktiken, die zu ihrer Entwicklung verwendet
werden. Im Moment ist das Systemdesign jedoch nur der Prozess der
Definition der Komponenten. Es geht also im Grunde
darum, was nötig wäre wenn man versucht, ein
Projekt von Grund auf neu zu entwickeln. Abgesehen von
diesem
Systemdesign-Interview zum Interview, das
Sie möglicherweise mit
dem einzigen Ziel geführt haben,
den Kandidaten zu diesem
Systemdesign-Interview zum Interview, das Sie möglicherweise mit
dem einzigen Ziel geführt haben erlauben ,
die es nehmen. Wie vielleicht Programmierer,
aber es können auch Ingenieure oder Designer
sein. Die Möglichkeit,
ihr Fachwissen auf dem Gebiet zu beweisen , auf dem sie sich bewerben. Die greifbare Anwendung
von Wissen bei Lösung eines echten Problems, mit
dem das Unternehmen möglicherweise konfrontiert ist. Das sind also wieder sehr große und
allgemeine Probleme. Sie werden also gebeten,
so
etwas wie einen
WhatsApp-Chat oder ähnliches zu implementieren . Wir werden in diesem Kurs
auch konkrete Beispiele
haben . Aber auch hier sind es
große Probleme, und Sie müssen
darüber sprechen und
darüber nachdenken , wie Sie
sie
sowohl aus Sicht der Zeit- als auch der
Raumkomplexität optimal umsetzen würden . Nun wird dieses
Systemdesign-Interview auch später
im Interviewprozess durchgeführt. Zuallererst
erhalten Sie möglicherweise ein technisches
Interview, in dem Sie tatsächlich aufgefordert
werden, ein tatsächliches Problem zu
codieren. Und später im
Interviewprozess, nur so DC, haben
Sie
Vorkenntnisse über einige Themen und können die Dinge
auch
aus einer größeren Perspektive betrachten. Sie werden Ihnen auch das Systemdesign-Interview geben . In dieser Studie sollen Sie sehen, wie gut
Sie in einem Team arbeiten. Und Sie
nähern sich auch einer
Problemlösung mit
Fragen, die,
wie ich bereits
erwähnt habe, offen sind . Und Sie müssen nur die
bestmögliche Lösung
erreichen. Dieses Interview
soll
Ihre Verarbeitung analysieren , die Probleme
lösen,
Ihren Denkprozess bei der Erstellung und Gestaltung der Systeme, um
eventuellen Kunden zu helfen , die Firma, in die Sie einsteigen
möchten braucht. Es ist auch eine Gelegenheit für Sie dem Einstellungspersonal,
entweder dem Manager
oder anderen Entwicklern, mit
denen Sie
dieses Interview führen, zu zeigen entweder dem Manager
oder anderen Entwicklern . Die beiden sind wertvoll für das Mitglied, indem sie Ihre
Fähigkeiten auf diese Weise zeigen. Wenn es um
Interviewfragen
und Antworten im Systemdesign geht , sind
sie in der Regel
sehr zweideutig. Und dies soll nur
die Möglichkeit geben,
Ihre Qualifikationen zu demonstrieren. Aber Sie müssen
sich nicht beeilen,
eine Antwort zu geben , die möglicherweise
falsch oder nicht einmal falsch ist, aber nicht ausreichend dokumentiert ist. Sie treffen sich auch, um
Fragen zu stellen, bevor Sie auf ihre Frage antworten nur um den Umfang
einzuschränken. Gib dir eine Anweisung, um auch die Erklärungen zu
klären. Es ging um eine allgemeine Präsentation
eines Systemdesign-Interviews. In der nächsten Vorlesung werden
wir ein wenig diskutieren, wie wir
jede Frage des
Systemdesign-Interviews angehen können . Es gibt einen vierstufigen
Prozess, der dokumentiert
wurde, dass er funktioniert, um auch einen
Blick darauf zu werfen. Aber im Moment vielen Dank, dass
Sie bis zum Ende dieser
Vorlesung bei mir geblieben sind. Und ich freue mich darauf,
euch im nächsten zu sehen.
3. Eine Vorlage für jede Frage: Hallo Leute und willkommen zurück
zum Systemdesign-Interview Tutorial. In dieser Vorlesung
werden wir uns einige Schritte ansehen, die wir in
einer Vorlage verwenden könnten , wenn wir
bei
einem Interview eine Frage zum
Systemdesign erhalten . Diese vorübergehende Zeit, über die Sie sprechen
möchten, ist eine
Einheitsgröße für alle Arten von
Vorlagen, wenn es
um Fragen zum
Systemdesign geht , es gibt nur ein paar Schritte, die Sie benötigen, um sicherzustellen, dass Sie kommen durch, wenn Systemdesign-Interview
beantworten. also
mit dieser Vorlage beginnen, müssen
Sie als Erstes geteilt werden wenn Sie die Frage gestellt werden ,
dass Sie sie vollständig verstehen. Also müssen wir
dieses Problem verstehen. Sie müssen
den Umfang des Designs
lösen und festlegen , über das Sie sprechen
werden. Dies ist der Teil, in dem
Sie Fragen
stellen müssen nachdem Sie
die vollständigen Details zu den
Fragen gegeben haben. Und Sie
müssen auch
eventuell
auftretende Einschränkungen festlegen . Sie müssen sich nicht
beeilen , das
Problem zu lösen, bevor alle Fakten haben und
andere Dinge haben, die Ihnen möglicherweise unklar sind, vom Interviewer
ausgeräumt werden. Der nächste Schritt wäre, ein hochrangiges Design
vorzuschlagen. Ich sage gesagt, du musst
nicht in die Implementierung
einsteigen ,
ohne es zu bestätigen. Der Ansatz, über den
Sie nachdenken erfüllt tatsächlich alle Einschränkungen,
die sie wollen. Sie könnten also einen
Ansatz vorschlagen, von dem Sie glauben , dass er der beste ist, um
das Systemdesignproblem zu lösen. Sehen Sie, wie sie auf
Ihre Herangehensweise reagieren , bevor Sie tatsächlich implementieren, wo Sie in jedem Teil
Ihres Vorschlags auch
weiter auf
Details eingehen . Jetzt
ist der dritte Teil tatsächlich
am zeitaufwendigsten des Modus erledigt , nämlich das Design Deep Dive. Dies geschieht, sobald
Sie mit
Ihrem Interviewer bestätigt haben, dass Sie auf dem
richtigen Weg
sind Zu diesem Zeitpunkt müssen Sie
nur auf
alle Details
der Anwendung eingehen alle Details
der Anwendung um zu lösen, dass du dir ausgedacht hast. Und dies ist der Teil
, in dem Sie ein
tiefes Verständnis und ein tiefes
Vokabular des Systemdesigns haben müssen. Und bei diesem Design Deep Dive gibt es wieder viele Schritte und beginnen tief zu tauchen. Die erste Frage, die Sie stellen
müssen, sind die Anforderungen. Und die Anforderungen könnten funktional oder nicht funktionsfähig
sein. Die funktionalen Anforderungen
sind nur Funktionalitäten , die das Problem, das Sie lösen
, den Benutzern zur Verfügung stellen. So
gibt es zum Beispiel in
Ihren sozialen Medien eine Funktionalität
, mit der Sie einen Beitrag von
anderen Benutzern
mögen können . Dies ist eine Anforderung
, die funktional ist. Sie müssen
alle funktionalen
Anforderungen mit
Ihren Interviewern nach Kurs festlegen
und durchlaufen alle funktionalen
Anforderungen mit , sie
auflisten und
ihre Bedeutung bestätigen. Jetzt können die Anforderungen
auch nicht funktionsfähig sein, und hier können einige
Dinge wie die Latenz sein, nämlich die
Reaktionszeit der Benutzerinteraktion. Zuverlässigkeit, was bedeutet, dass
es keinen Datenverlust geben wird. Die Konsistenz, was bedeutet
, dass hohe Verfügbarkeit. Jetzt zwei Dinge, die Sie
auch beachten müssen, wenn Sie versuchen,
Ihre Komponenten zu entwerfen . Du
musst sie machen. Zuallererst fehlertolerant,
was bedeutet, dass Ihr System jederzeit betriebsbereit ist
, obwohl es
einige Fehler
oder einen Datenbank-Scratch geben kann . Und sie müssen auch skalierbare Krankheit
sein. Eine weitere wichtige Tatsache, skalierbar, bedeutet nur
, dass Sie mit
dem wachsenden
Datenverkehr auf Ihrem System umgehen müssen . Geht. Darüber hinaus zum zweiten
Teil dieses Entwurfs Deep Dive. Abgesehen von den Anforderungen müssen
Sie auch eine Speicherschätzung basierend
auf der Datenmodalität vornehmen.
Sie müssen nur
eine grobe Schätzung
darüber abgeben, Sie müssen nur
eine grobe Schätzung
darüber abgeben wie viele Daten gespeichert werden müssen. Außerdem müssen Sie über
die Anzahl der Anfragen,
den von Ihnen bereitgestellten Service
und das Leseschreibverhältnis nachdenken . Nachdem Sie über all
diese Speicherschätzungen gesprochen
haben, müssen Sie über
ein Datenbankdesign nachdenken. Hier finden die Aktionen statt
, die Sie als Benutzer
ausführen können , um mit
Ihrem System zu interagieren. Sie können hier auch
darüber nachdenken , welche Art von
Datenbank Sie
verwenden werden und warum
Sie sich für SQL, NoSQL usw. entscheiden können. Sie müssen nur
über jede Option diskutieren und darüber
nachdenken, welche am besten zu Ihrer Lösung passt
. Dann wäre ein vierter Schritt grundlegenden
High-Level-Design
zu beginnen, bei dem Sie
über die Clients,
die Server und
auch die Datenbank schreiben können . Und ausgehend von
diesem grundlegenden Design können
Sie außerdem auf weitere Details
eingehen und die Dienste
isolieren, die über das Caching
gesprochenen Daten und
auch die Replikation der
Dienste
partitionieren und Datenbanken, sogar Lastenausgleich
und Nachrichtenwarteschlangen. Wenn das zu Ihrem
spezifischen Problem passt. Es gibt natürlich optional, welche anderen
Dinge Sie
denken können , abhängig dem Problem,
das Ihnen gegeben wird, nämlich die
Verschlüsselung einiger Nachrichten oder Passwörter. Einige Telemetrie,
die sicherstellen, dass Sie Dinge im
Auge behalten , die in Ihrer
Anwendung am meisten verwendet werden. Einige
API-Gateway-Dienstermittlung und auch d-Analysedienst , der die Anforderungen
und die Benutzerbeta analysiert. Und nach diesem Design
Deep-Dive, dem letzten Schritt, müssen
Sie dies tun,
um einfach abzuschließen,
was bedeutet, dass Sie mit dem gegebenen
Design aufbauen können. Wenn es sinnvoll erscheint, können
Sie darüber nachdenken,
einige Engpässe und
Verbesserungsbereiche zu identifizieren einige Engpässe und
Verbesserungsbereiche und ein wenig darüber zu sprechen. Dies ist die allgemeine
Struktur, die Sie beachten
müssen, bevor Ihr
Systemdesign-Interview
beginnen ,
ohne das Problem zu
erhalten. In einigen zukünftigen Vorträgen werden
wir uns
bestimmte Fragen zum Systemdesign
ansehen bestimmte Fragen zum Systemdesign wie das Entwerfen des
winzigen URL-Systems, Suchmaschinen,
freigegebenen Laufwerken usw. kann aus dieser genauen Vorlage sehen, wie ich all diese Schritte
anwende, meine Herangehensweise bei der
Lösung von DC-Problemen. Wenn das für Sie
interessant klingt, freue
ich mich darauf, Sie
in den nächsten Vorträgen zu sehen. Vielen Dank, dass Sie bis zum Ende dieser Zeit bei
mir geblieben sind.
4. Der URL: Hallo Leute und willkommen zurück
zum Systemdesign-Interview Tutorial. In diesem Vortrag
werden wir ein
berühmtes Problem diskutieren , das oft in solchen
Interviews
gegeben wird. Und genauer gesagt das Entwerfen eines neuen
URL-Kürzungsdienstes. Genau wie zum Beispiel haben
Sie vielleicht einen winzigen
URL-Punkt L gesehen und so weiter. In diesem Vortrag werde ich alle
Aspekte
durchgehen , die Sie berücksichtigen
müssen, wenn S
dieses Thema in einem
Systemdesign-Interview trägt . Und nachdem Sie sich diese Vorlesung angesehen
haben, werden Sie wissen, wie
Sie diese Frage stellen können. Aber nicht nur das, Sie würden auch wissen, wie Sie ähnliche
Problemstudien angehen
können. Denn durch die Lösung dieses Problems werden
wir auch
die Vorlage respektieren, die wir für jede Frage des
Systeminterviews
verwenden sollten jede Frage des
Systeminterviews
verwenden , die uns gestellt wird. Beginnend mit diesem
Interviewproblem müssen
wir, wie gesagt,
einen
URL-Kürzungsdienst wie eine winzige URL entwerfen . Und diese Oberfläche wird natürlich
eine
kurze Lyse liefern ,
rote zu lange URLs. Jetzt
ist die Schwierigkeit
des Systemdesign-Interviews ziemlich grundlegend
und oft die am meisten gegebene
im Systemdesign-Interview. Es ist also sehr wichtig, dass Sie wissen, wie Sie dieses Problem
lösen können. Das erste, was wir besprechen
müssen, ist warum müssen wir die URL
verkürzen? Hier sind mehrere Gründe
und warum wir das brauchen würden. Zuallererst sparen sie
viel Speicherplatz, wenn sie angezeigt werden, sagen sie voraus und so weiter. Und wenn Sie
sie von Ihrer eigenen Tastatur aus eingeben möchten, neigen
Sie weniger dazu,
Fehler zu machen, wenn Sie sie eingeben. Es wird auch verwendet, um die Links über
Geräte hinweg zu
optimieren und die
Leistung von Anzeigen zu messen. Das zweite, was wir ansprechen
müssen die Anforderungen
und Ziele
unseres Systems, die wir entwerfen
müssen. Bei dieser Frage erinnere
ich Sie hier daran, dass Sie, wenn Sie sich in einem
Systemdesign-Interview befinden, sowie andere
Arten von Interviews. Und du
bekommst eine Frage. Sie müssen am Anfang
alle Anforderungen
klären . Bevor Sie versuchen, Ihr Problem zu
beantworten. Sie müssen die Frage stellen , um den genauen Umfang des
Systems zu ermitteln , das Sie
Interviewer berücksichtigen, und
gehen Sie zu den
Funktionen, die diese winzige URL-Oberfläche den Endbenutzern
bereitstellen sollte. Wir haben sie in
die beiden wichtigsten Kategorien
von Anforderungen unterteilt , die funktional
und nicht funktional sind. Wenn wir über die
funktionalen Anforderungen nachdenken, können
wir uns vorstellen, eine URL zu
unserem Service zu geben und eine kürzere und einzigartige zurückgenerieren zu
können. Und das wird als Kurzlink bezeichnet
. Dieser Link, den unser Service
bereitstellt, sollte ebenfalls kurz genug sein, um ihn
einfach kopiert und einfügen zu können. Und wir werden
später diskutieren, was kurz genug bedeutet und uns auch
auf diesen Begriff einigen. Jetzt kann die zweite funktionale
Anforderung sein, dass der Benutzer Kürze einen benutzerdefinierten Wert
für seine URLs
auswählen kann. Wenn sie also nicht wollen, dass eine zufällig
von unserer Oberfläche erzeugt wird, sollten
sie auch eine eigene auswählen können
. Diese Verbindungen, die
unsere Oberfläche bereitstellt sollten auch eine
Zeitspanne nach dem Tod haben. Sie sollten gelöscht werden
und laufen ebenfalls ab. Denn sonst würde unsere
Datenbank
irgendwann überlaufen , wenn Sie diese Links weiterhin darin
haben würden. Schließlich sollte der Zugriff der Benutzer
auf einen kurzen Link
natürlich natürlich den ursprünglichen Link verweisen, den der
kurze Link darstellt. Es gibt auch einige
nicht funktionale Anforderungen für den URL-Kürzungsdienst, nämlich dass die
rote Richtung in Echtzeit
ohne Latenz
erfolgen sollte . Stellen Sie sich vor, Sie
möchten auf
einen L-Y-L-Y-Link klicken und es
wird ewig dauern, bis es geladen wird. Sie waren der tatsächliche
Link, auf
den Sie zugreifen möchten , der überhaupt
nicht gut wäre. Und auch nervig. Eine weitere nicht funktionale
Anforderung
wäre auch , dass der verkürzte Link , der bereitgestellt wird, von einem
böswilligen eventuellen Benutzer überhaupt
nicht zu erraten oder
vorhersehbar sein sollte . Die letzten und wichtigsten
nicht funktionalen Anforderungen. Wäre, dass unser System, unser Service hoch verfügbar
sein sollte. Denn wenn es ausgefallen wäre, ist die URL-Umleitung, dass sie
natürlich mit ihr
führen würde . Einige zusätzliche
Anforderungen
können hier nicht sein, dass unser Service für APIs zugänglich sein
sollte. So können Dritte eine tatsächliche Anfrage an
unsere Endpunkte stellen und auf die URL
zurückgekürzt werden als Antwort auf die URL
zurückgekürzt werden, wenn
die Anfrage in Ordnung ist. Auch einige Analysen, die
wir mit diesem Zitronenbaum machen können. Und sie sollten sich darum kümmern, wie
oft Auferstehung stattfand und je
öfter die Richtung verknüpft ist, Zugang und solche Dinge. Nachdem wir all
diese Anforderungen
und Kosten des Systems besprochen haben, können wir zum dritten übergehen, nämlich die Schätzung
der Kapazität, die
der Dienst haben sollte, und
auch die zu überwindende Einschränkung. Wenn wir also über
den Service nachdenken , den
wir implementieren werden, wird er natürlich schwer gelesen. liegt daran, dass viele rote
Richtungsanfragen im Vergleich zur neuen URL-Kürzung verfügbar sein
werden. Und wir können von
etwa 90 zu einem Verhältnis
zwischen Lese und Schreiben ausgehen . Denn wenn Sie darüber nachdenken, generieren
Sie den Link nur einmal, aber natürlich würde er viel mehr als einmal
gelesen. Nun, die Verkehrsschätzungen
für den Dienst, können
wir davon ausgehen, dass
wir über
100 oder 500 Millionen neue
URL-Kürzung pro Monat haben 100 oder 500 Millionen neue
URL-Kürzung werden
, die erstellt werden. 500 Millionen URLs sind
vielleicht Tower-Service. Mit unserem Prozentsatz des
Leseschreibvorgangs können
wir in diesem Monat mit rund 50
Milliarden roten Erektionen rechnen können
wir in diesem Monat mit rund 50
Milliarden roten Erektionen rechnen. Wir können auch über
Abfragen pro Sekunde für
unser System nachdenken , um zu
verhindern, dass unsere Datenbank abstürzt. Abgesehen davon müssen
wir uns auch die Speicherschätzungen
ansehen. Hier können wir wieder Schätzungen machen. Angenommen, wir speichern alle
URL-Kürzungsanfragen für fünf Jahre. Da wir 500 Millionen
neue URLs und B- und
D-Objekte haben, die wir voraussichtlich speichern werden, werden
etwa 30 Milliarden betragen. Und vorausgesetzt, sie haben jeweils etwa
400 bis 500 Bytes benötigt, benötigen
wir
ungefähr 15 Terabyte um unsere gesamten Daten zu speichern. Wir müssen auch über
die Bandbreitenschätzungen nachdenken, nicht nur über die
Speicherschätzung für richtig, wir können jede Sekunde mit etwa 200 bis
300 neuen URLs rechnen. Und das ist natürlich ein Top. Wir werden uns
die Spitze dieses Sortiments ansehen. Die gesamten eingehenden Daten
für unseren Service würden also etwa 500 Byte pro Anfrage mal zwei oder 300 neue
URLs und B Sekunde betragen, also etwa 100 bis 200
Kilobyte pro Sekunde. Eine Leseanfrage. Seit jeder Sekunde erwarten wir bereits
etwa 20 bis 30
Tausend
URL-Richtungen , dass die gesamten
ausgehenden Daten etwa zehn
Megabyte pro Sekunde betragen
werden. Wir können uns auch eine
gewisse Speicherschätzung ansehen. Was ist, wenn wir einige
unserer am häufigsten verwendeten kurzen URLs abfangen wollen , die sehr SH gesagt x sind. Nun, wir können uns die 8020-Regel ein
wenig ansehen. Das heißt, dass die 20%
unserer URLs 80% des Datenverkehrs
generieren werden. 20% unserer
generierten kurzen URLs
werden also die heißen sein. Und kurz darauf können
wir sehen, dass wir, wenn wir
20 bis 30 Tausend
Anfragen pro Sekunde haben , etwa 1,7
bis 8 Milliarden Anfragen pro Tag erhalten werden . Um 20% davon zu erfassen, benötigen
wir ungefähr 170 Gigabyte Speicher. Wie Sie bei meinem Ansatz gesehen haben, der Teil der
Kapazitätsschätzung und müssen
der Teil der
Kapazitätsschätzung und
-beschränkungen sehr einfach sein , indem Sie
über das Limit nachdenken und
wie viel tatsächliche
Kapazität und Bandbreite schätzen wie viel tatsächliche
Kapazität und Bandbreite er wird
von implementierter Oberfläche übernommen. Ich sagte, wir können uns auch
einige APIs ansehen und diesen Teil besprechen. Wir können
einige Endpunkte zur Verfügung stellen , die unser
Service
für Dritte bereitstellen wird , die auf unsere Service-Anzeige zugreifen, Anfragen an unsere
Endpunkte stellen und als antworte die verkürzte URL. So können wir zum Beispiel
einen Endpunkt haben , der nach Osten die URL erstellen
nennt. Und es kann die ursprüngliche
URL als String-Parameter verwenden, der natürlich
die ursprüngliche URL ist , die gekürzt werden
soll. Und auch eine Art Schlüssel,
der mit dem
API-Entwicklerschlüssel eines Kontos
verknüpft ist . Wir wissen also, wer diese Anfragen
stellt und haben eine gewisse
Sicherheit in diesen Teilen. Wie ich bereits sagte, an diesem Endpunkt, würden
wir natürlich
die erfolgreiche Einfügung zurückgeben. Würde natürlich eine Zeichenfolge mit
der verkürzten URL
zurückgeben , wenn
die Anfrage gestellt wird. Nun, und wenn nicht, vielleicht ein Fehlercode, können
wir auch einen
Lösch-URL-Endpunkt haben. Was das wichtig ist, können
Sie
es auch erwähnen. Wir müssen auch darüber nachdenken,
wie wir Missbrauch hier verhindern können. Wenn wir eine API bereitstellen, weil ein böswilliger Benutzer
Sie aus dem Geschäft bringen und Ihre Dienste
zerstören könnte , wenn
er eine olivfarbene URL ist das aktuelle Design und
füllen Ihre Datenbank aus. Wir können hier den API-Entwicklerschlüssel einschränken
. Es kann auf eine bestimmte
Anzahl von URL-Kreationen beschränkt sein , die zehn oder 20 Tage
oder ähnliches sagen. Jetzt
wäre der nächste Schritt,
über das
Datenbankdesign und das Schema nachzudenken . Die Definition des Schemas in den frühen Phasen
des Interviews würde Ihnen
wirklich helfen,
den Fluss zwischen den Komponenten zu verstehen ,
den Fluss zwischen den Komponenten würde Sie zu einer späteren
Partitionierung der Daten führen. Nun wären einige Beobachtungen
hier, dass wir Milliarden von Aufzeichnungen für die
Dienste speichern
müssen. Wir werden eine
Menge verkürzte URL haben. Aber diese Objekte
werden,
wie gesagt, sehr klein sein, 500 Kilobyte. Zwischen den Datensätzen gibt es keine Beziehungen. Abgesehen davon, welche
Benutzer diese URL erstellt
haben, können Sie hier ziemlich frei
tun, was wir wollen. Und eine weitere Beobachtung bezüglich
des Datenbankdesigns und Relevanz ist
, dass unser Service sehr stark
auf dem roten Teil sein
wird. Wir benötigen,
wie gesagt, zwei Tabellen, eine zum Speichern der Informationen
über die URL-Zuordnungen und eine für die Daten des Benutzers, der den Kurzlink erstellt hat. Da erwarten wir, viele Zeilen zu
speichern. Und wir müssen auch
keine Beziehung
zwischen Objekten beibehalten . Jetzt wäre die SQL-Art der
Wahl hier sehr gut, da es
auch sehr einfach zu skalieren ist. Also können wir uns
etwas wie Dynamo DB ansehen. Ich bin hierher gekommen, während Sie lösen, wir müssen
das Datenbankschema in
einem Interview erstellen und darüber nachdenken welche Art von Datenbank verwendet werden
sollte, und auch eines aus
Ihrem eigenen Wissen
vorschlagen. Der sechste Schritt hier
wird das grundlegende
Systemdesign und
der Algorithmus sein. Hier werden wir also tatsächlich
auf
die Implementierung eingehen , wie unser Service hinter den Kulissen
funktionieren wird. Das Problem, das wir
hier lösen, besteht darin,
den verkürzten eindeutigen
Schlüssel zu
generieren , der einem bestimmten
größeren und größeren URL-SIC zugeordnet wird . In dieser Situation
haben wir zwei Ansätze. Wir können diese Schlüssel der
Linie mit einem Service zur
Schlüsselgenerierung generieren . Und es wird
vorher
zufällige Strings mit sechs Buchstaben erzeugen zufällige Strings mit sechs Buchstaben und in einer neuen Datenbank
speichern. Wann immer wir die URL hier
verkürzen wollen, können
wir eine nehmen, die bereits von der
Oberfläche generiert wurde und Jahre sie jahre hat. Dieser Ansatz ist sehr
einfach und schnell, aber weil wir die URL
nicht codieren, müssen
wir uns keine Gedanken über Doppelarbeit oder Absprachen machen. Der Service der
Schlüsselgenerierung wird sicherstellen, dass alle Schlüssel eindeutig
sind. Wir müssen hier auch einige
Nebenläufigkeitsprobleme beachten, denn
sobald ein Schlüssel verwendet wird, sollte
er in unserer
Datenbank markiert werden, um sicherzustellen,
dass er nicht wieder verwendet wird
. Und wenn es
mehrere Server
gibt, die diese
Schlüssel gleichzeitig lesen, erhalten
Sie möglicherweise ein Szenario, in dem zwei oder mehr Dienste versucht haben, aus der Datenbank
zu lesen, obwohl von oben
bis zum Service Endpunkte, es wäre sehr weniger wahrscheinlich. Jetzt können die Server diese Generationssysteme zum Lesen und Festzelte in einer Datenbank verwenden. Und sie können zwei
Tabellen verwenden, um die Schlüssel zu speichern. Einer für die eigentlichen Schlüssel
, die noch nicht verwendet werden, und einer für die Schlüssel
, die bereits verwendet werden. Und sobald dieser Generationsdienst einem
der Server den Schlüssel
gibt, essen Sie sie und bringen Sie sie an den Tisch. Wir müssen auch darüber
nachdenken,
wenn unser Erzeugungssystem, das das einzige System
unseres gesamten Dienstes ist, nicht schlecht wäre,
wenn es sterben würde? Und das ist ein sehr guter Punkt denn wir brauchen
ein Standby-Replikat,
dieses Generationssystem, um einen Standby-Server zu haben übernehmen kann
, um sie zu
generieren, ist es einfach für den
Fall, dass etwas passiert
mit einem primären. Nun, ein weiterer Ansatz hier, andere tote Degeneration
der Schlüssel mit dem Service. Ist auch die
eigentliche URL-Codierung zu codieren. Eine tatsächliche URL kann
durch Berechnen eines eindeutigen Hash erstellt werden. Entweder wenn wir über die Shot
250 Sitze oder die leeren fünf
sprechen 250 Sitze oder die leeren fünf und wir die angegebene
URL mit diesen Algorithmen hashen können, können
diese Hashes zur Anzeige
codiert werden. Und eine vernünftige Frage
bei diesem Ansatz wäre, wie groß wäre
der Kurzschlüssel? Es können sechs bis zu
20 gerade Zeichen sein, aber das wäre ein
ziemlich langer Schlüssel. Wir können die Base 64-Codierung verwenden. Und wenn wir sechs Buchstaben lange Tasten
verwenden, wird es
etwa 64 bis zur Macht von
sechs möglichen Strings dauern . Wenn wir
acht Buchstaben lange Schlüssel erzeugen würden, werden
wir etwa 280
Billionen mögliche Strings haben. Aber für unser System wäre
die Buchstabennummer ziemlich hoch. Und wir können davon ausgehen, dass
sechs Buchstaben
für unsere Anzahl von URLs ausreichen können . Wenn wir nun den MD5-Algorithmus
als Hash-Funktion verwenden, wird er natürlich,
wie Sie vielleicht bereits wissen,
128-Bit-Hash-Werte bereitstellen wie Sie vielleicht bereits wissen, . Nach der Base-64-Codierung
erhalten wir eine Zeichenfolge mit mehr
als 21 Zeichen. Jetzt haben wir nur noch Platz für sechs oder acht Zeichen
pro Kurzschlüssel. Wie wählen wir dann unseren Schlüssel aus? Nun, wir können
die ersten Buchstaben nehmen, aber dies kann zu
einer Schlüsselduplizierung führen. Und um das zu lösen, können
wir entscheiden, einige andere Zeichen aus
der Kodierung zu einige andere Zeichen aus
der entfernen oder
dazwischen zu tauschen , um
dieses Problem ganz zu vermeiden. Wir können auch, nachdem wir die
Lösung in einem Interview gegeben haben, über einige Probleme
mit unserer Lösung
nachdenken, wenn es
sich herausstellt, dass es sich als
nicht kugelsicher und diese verschiedenen Probleme herausstellt
und diese verschiedenen Probleme von Ihnen und
nicht von den Interviewer. Sie werden wahrscheinlich zusätzliche Punkte
erhalten, da Sie sich als
bewusster eventueller Mitarbeiter herausstellen. Die verschiedenen Taschentücher
mit der Kodierung einer tatsächlichen URL
unter Verwendung eines Hashtags. Eine eindeutige Lösung kann sein , dass mehrere Benutzer, die gleiche URL
eingeben
, dieselbe verkürzte URL erhalten können. Die Nebenläufigkeitsprobleme
sind, dass es der Fall B war, auch
der letzte Ansatz. Aber hier ist noch eins. Was ist, wenn Teile der
URL, URL codiert sind? Die Problemumgehungen hier nochmal, das Anhängen einer zunehmenden
Sequenznummer an jede Eingabe-URL, um sie
eindeutig zu machen und ihren Hash zu generieren. Eine andere Lösung
könnte darin bestehen, die Benutzer-ID anzuhängen, die eindeutig
an die Eingabe-URL sein sollte. Wenn sich der Benutzer hier nicht
angemeldet hat, könnte
dies ein Problem sein,
da wir dies benötigen würden, um die
Eindeutigkeit des Schlüssels zu bestätigen. Selbst wenn nach all
diesen Schritten, die wir unternommen haben, um sicher zu gehen, dass nichts
wachsen könnte, haben
wir immer noch einen Konflikt. Wir können
den Schlüssel weiter generieren , bis wir den einzigartigen
erhalten. Umschließen des Basissystems
entwirft einen Algorithmus-Teil. Der zweite Teil hier
wäre die
Datenpartitionierung und
Replikation unseres Dienstes. Um unsere Datenbank zu skalieren, müssen
wir sie partitionieren, damit sie weitere Informationen speichern
kann. Wir brauchen etwa Milliarden von
Einträgen in unserer Datenbank. Und hier können wir einen Blick auf die beiden Arten der
Partitionierung werfen, die es gibt, die den Schraubenschlüssel
und die Hash-basierte Partitionierung sind . Beginnend mit der bereichsbasierten Partitionierung von
Wochenendportal-URLs in separaten Partitionen
basierend auf den Hash-Schlüsseln, Zeichen oder sogar einer von ihnen. So können wir alle
URLs speichern, die zum Beispiel
Weizen oder Buchstaben a beginnen ,
in einer Partition, und diejenigen
, die mit
dem Buchstaben B beginnen, in
einer anderen speichern und so weiter. Und wenn wir uns im Gegensatz dazu die hashbasierte Partitionierung
in diesem Schema ansehen, können
wir den Hash des Objekts,
das wir
speichern, nehmen und dann basierend auf der zu verwendenden Partition
berechnen. In unserem Fall können wir
den Hash des Schlüssels oder
die Kürzung verwenden, um
die Partition zu
bestimmen , mit der wir diese spezifische URL
starten werden. Das nächste, worüber wir nachdenken
müssen, wenn dem
Systemdesignproblem
nähern, ist der Cash-Teil. So können wir URLs abfangen, auf
die häufig zugegriffen wird, wie wir bereits zuvor
vorgeschlagen haben. Und wir können jede
der Regal-Lösungen verwenden , die es beispielsweise von
memcached gibt. Wir können aber auch vollständige URLs speichern. Und indem Sie das tun,
speichern Sie die vollständige URL süß ihre jeweiligen Hashes in ihrem
Widmungssurfer. Bevor Sie darüber nachdenken können, kann
der Back-End-Speicher
bei diesem Ansatz schnell prüfen, ob der Cache bereits über
die Design-URL verfügt. Und so
optimaler Service. Wir müssen auch darüber
nachdenken, wie viel Cache-Speicher wir haben
sollten. Also können wir anfangen. Etwa 20% des täglichen Datenverkehrs und basierend auf den Nutzungsmustern des
Kunden
passen außerdem an, wie
viele Fälle Server wir benötigen. Wie oben geschätzt, benötigen wir etwa 170 Gigabyte Speicher,
um 20% des Datenverkehrs einzuzahlen. Da ein moderner
Dienst
256 Gigabyte Speicher haben kann , kann das gesamte
Bargeld problemlos in einen Computer passen. Es ging darum mit
dem Caching-Teil. Wir können auch über den
Load Balancer in unserem System nachdenken, was ziemlich einfach ist. Wir können darüber nachdenken,
diese
Lastenausgleichsschicht an drei Stellen hinzuzufügen . Und das wäre zwischen
den Clients und den
Anwendungsservern zwischen
Anwendungsservern
und Datenbankservern und Cache-Servern. Weiter zu der
Tanzsache,
über die wir nachdenken müssen, wenn diese
Frage zum Systemdesign uns
diese
Frage zum Systemdesign stellen, ist das Bereinigen oder
Bereinigen der Datenbank. Der Eintrag sollte natürlich
nicht ewig in
unserer Datenbank bleiben , da er ihn
ausfüllen und einen Absturz
verursachen würde . Epoche. Ist eine festgelegte
Ablaufzeit erreicht? Was sollte mit dem Link passieren? Nun, wenn wir uns dafür entscheiden, ständig
nach Experimenten
zu
suchen, um sie zu entfernen würde
dies auch viel Druck
auf unsere Datenbank ausüben. Stattdessen können wir
die abgelaufenen Links langsam entfernen ,
indem wir eine faule Bereinigung durchführen. Und die Art und Weise, wie unser
Service sicherstellt , dass nur abgelaufene Links mit B
gelöscht werden mit B
gelöscht wenn der Benutzer versucht,
auf den inspirierten Link zuzugreifen, haben wir den
Zugangscode für den Benutzer gelöscht. Auf diese Weise ist das Löschen
aller URLs auf einmal
abgelaufen und ein Datenbankabsturz
riskierte. Wir können auch eine
Standardablaufzeit für
jeden Link haben , soweit
dieser Aspekt der Fall ist. Schließlich müssen wir auch bedenken, dass der Limit-Baum
, der einige Fragen beantworten sollte wie oft es sich um eine
kurze URL handelt, verwendet wurde. Wie war der Benutzerstandort? Was wäre das Datum und die
Uhrzeit des Zugriffs und so weiter. Sicherheits- und Berechtigungsteil
, der ein weiterer wichtiger ist. Wir können die
Berechtigungsstufe speichern, wobei jede URL in der Datenbank öffentlich oder privat
ist. Für die privaten können
wir auch eine separate
Tabelle erstellen, um Benutzer-IDs zu speichern , die Berechtigungen zum
Anzeigen dieser bestimmten URL haben. Wenn es diese Berechtigung nicht
hat,
kann
unser Endpunkt oder x natürlich in der kurzen URL ein HTTP
für einen einzigen Code zurückgeben,
was bedeutet, dass nicht genügend Achse ist in der kurzen URL ein HTTP
für einen einzigen Code zurückgeben,
was bedeutet, . Natürlich. Dies waren vor allem die Winkel, die Sie beachten
müssen, wenn Sie sich einer Lösung für die Frage zur Verkürzung
der
URL-Oberfläche
in einer Überprüfung des Systementwurfs
nähern Frage zur Verkürzung
der
URL-Oberfläche . Ich hoffe, ihr habt wirklich
etwas aus dieser Vorlesung herausgeholt. Und ich danke dir sehr bis
zum Ende bei mir
geblieben bist. Ich freue mich auch darauf,
euch im nächsten zu sehen.
5. Die photo: Hallo Leute und willkommen zurück
zum Systemdesign-Interview Tutorial in dem wir verstehen, wie wir ein Interview bestehen können, das aus
C3b-Schilderfragen besteht. In diesem Vortrag
werden wir
ein weiteres sehr häufiges Problem besprechen , das bei diesen
Interviews gegeben wird ,
und schauen uns
genau an , wie wir
sie lösen können, um,
wie ich schon sagte, das Interview zu bestehen . Das Problem, das wir in
dieser Vorlesung nicht betrachten
werden , ist die Entwicklung
eines Foto-Sharing-Dienstes. Hier können die Benutzer
Fotos hochladen , um sie
mit anderen Benutzern zu teilen. Und natürlich können einige
ähnliche Dienste
Flickr oder einige
Social-Media-Plattformen sein , obwohl sie
mehr Funktionen in sie
integriert haben . Zunächst verwende
ich bei der
Annäherung dieses Problems die allgemeine
Vorlage, die für
jede Frage zum Systemdesign geeignet ist
, die in einem Interview gegeben werden kann ,
über das ich in einer vorherigen Vorlesung gesprochen habe. Und der erste Schritt, nachdem Sie die Frage
gründlich verstanden und andere
Abfrageanwendungen gestellt
haben, die Sie möglicherweise von Ihrem Interviewer haben,
besteht darin , die Anforderungen
und Ziele von das System, über
das Sie sprechen werden. Bei der Gestaltung unserer
Foto-Sharing-Anwendung möchten
wir einige
funktionale Anforderungen haben, darunter, dass ein Benutzer
einigen anderen Benutzern folgen kann , die
ein Konto auf dieser Plattform haben. Der Benutzer kann auch einige Suchen
durchführen , die auf den freigegebenen
Fotos basieren können. Haben Sie gesucht, können Sie auch Fotos selbst
von ihrem Konto hochladen. Und das System, das wir
implementieren werden , sollte auch eine Art
Nachrichten-Feed generieren und anzeigen, in dem ein Benutzer, wenn er
die Anwendung
öffnet, die Top-Fotos von den Leuten sieht, gegen
die er gekämpft hat, Bögen. Dies sind, wie gesagt, die
funktionalen Anforderungen, aber wir müssen auch
über die funktionalen Anforderungen nachdenken. Die nicht funktionale
Anforderung Nummer eins muss sein, dass das System sehr zuverlässig sein
sollte,
was bedeutet, dass das Foto nicht verloren geht, sobald
der Benutzer ein Foto auf unsere Oberfläche
hochgeladen hat. Als nächstes muss
unsere Oberfläche hochverfügbar sein, daher sind alle Fragen nicht erlaubt. Außerdem sollten wir unsere Latenz
für die Regeneration der Nachrichten
und ähnliches niedrig halten . Das heißt, die
Zeit, die der Benutzer tatsächlich vom Start
der Anwendung bis zu
dem Punkt wartet , an dem er tatsächlich einige Fotos von
anderen Benutzern sieht , denen er folgt. Jetzt ist der erste Schritt erledigt. Und wir definieren die
Anforderungen und Ziele
des Systems, das
wir gerade entwerfen werden. Wir können ein paar andere
Designüberlegungen treffen. Hier. Wir können damit ausgehen , dass all diese Dienste, die
wir implementieren werden, ziemlich offensichtlich
ist, dass sie sehr viel gelesen
werden,
weil Nettoverschuldung , wenn Benutzer
tatsächlich Fotos hochladen, aber eine viel höhere
Anzahl von Benutzern tatsächlich die Fotos sehen
, die ich andere Benutzer gesehen habe. Sie können das denken, wie Sie
denken würden, wenn Sie
ein Foto in Ihrer
Social-Media-App veröffentlichen . Sie posten sehr wenige Male, aber Sie sehen tatsächlich viele andere Funktionen im Vergleich zu sehen, wie Sie tatsächlich hochladen. Deshalb
wird dieses System schwer gelesen. Aufgrund der Tatsache, dass unser
Service schwer gelesen wird, müssen
wir uns auf den Abruf konzentrieren. Das Foto ist sehr schnell. Jetzt können die Benutzer auch so viele Fotos
wie Tageslicht
hochladen. Das ist also zu beachten
, da wir
eine sehr effiziente Verwaltung
des Speichers für diese Fotos benötigen eine sehr effiziente Verwaltung . Und auch, ich speichere gesagt, wenn ein Benutzer ein Foto hochlädt, dieses System, das wir entworfen
haben, garantieren wir, dass es nicht verloren geht. Übergang ging zu einigen
Schätzungen und Einschränkungen für die Kapazität der Dinge, die
wir speichern werden. Wir können davon ausgehen, dass
wir 100 Millionen Nutzer mit
etwa 10 Tausend
täglich aktiven Nutzern
und 2 Millionen neuen
Fotos täglich haben 100 Millionen Nutzer mit etwa 10 Tausend
täglich aktiven Nutzern werden. Das wären ungefähr 23
neue Fotos pro Sekunde. Und diese Berechnungen
, mit denen wir
hier durchführen werden, finden zu einem weiteren Zeitpunkt statt , an dem
unser Service hoch angenommen
und erfolgreich
sein wird . Deshalb
siehst du, dass ich
diese sehr hohen
Beträge für diese aufteile . Eine tatsächliche Zahl. Nun
würde der Gesamtplatz, der
für einen Tag mit
Fotos benötigt wird, etwa 2
Millionen betragen, weil wir sagten, dass wir jeden Tag 2
Millionen neue Fotos haben würden. Und wir können über die
durchschnittliche Größe der Fotodatei nachdenken, die 100 Kilobyte betragen kann, die für unsere Kapazität
insgesamt
etwa 200 Gigabyte betragen wird . Das
berücksichtigt nur einen Tag. Aber was ist, wenn wir
den Raum für, sagen
wir, fünf Jahre hinweisen ? Nun, wir können
200 mit 3655 Jahren multiplizieren, und wir werden
ungefähr 365, also 365 Terabyte bekommen. Jetzt, da wir diese
Kapazitätsschätzung aus dem Weg haben, können
wir über das
hochrangige Systemdesign nachdenken. Denn auf hohem Niveau
müssen wir nur zwei Szenarien unterstützen. Eine zum Hochladen der Fotos, das ist Workflow
in unserem Service. Und ja, sie wollten diese Fotos
ansehen oder durchsuchen. Der Service, den wir implementieren werden , muss
die Fotos natürlich in einer Datenbank speichern. Und wir werden hier
ein paar Object
Storage-Server benötigen . Darüber hinaus wird
er zum Datenbankschema
zum Speichern dieser Fotos auch im Interview
besprochen. Wir müssen bedenken, dass wir ungefähr drei Einheiten haben. Eine, die der Benutzer
sein wird, als nächstes die Fotos und dann die
Benutzer, denen sie folgen. Das Schema kann drei Tabellen
enthalten. Wenn ein Foto, das einen Lichtbildausweis haben
kann
, der der Primärschlüssel
sein wird. Und dann ein paar andere
Felder wie die Benutzer-ID, die natürlich der
Benutzer tot ist, haben sie gepostet, was ein
Fremdschlüssel in dieser Tabelle sein wird. Dann ist ein sehr wichtiges
anderes Feld hier das
Erstellungsdatum, das vom Typ
datetime sein wird. Und dies ist ein sehr wichtiges
Feld, da es nützlich sein wird , wenn der Benutzer seinen Newsfeed
öffnet, wir wollten ihm die neuesten
und beliebtesten Fotos besorgen, aber für den neuesten
Teil werden
wir wir wollten ihm die neuesten
und beliebtesten Fotos besorgen,
aber für den neuesten
Teil werden
wir fressen diese Region schlagen Feld. Dann haben wir auch
die Benutzertabelle, die natürlich
einen Primärschlüssel der Benutzer-ID haben wird. Und dann noch ein paar andere Daten, die
wir für ihn speichern wollten. Wenn wir
E-Mail-Marketing betreiben wollen, kann seine E-Mail behalten. Aber wir brauchen auch den
Namen, das Geburtsdatum, das Datum für jedes Konto und vielleicht den letzten Login. Ich denke nach. Wir bräuchten auch eine Tabelle
für den Benutzer folgen, die ein Feld annehmen würde , das beide Teil
des Primärschlüssels sein wird. Und das sind natürlich Benutzer-IDs der Benutzer
, die einander folgen. Dies
berücksichtigt natürlich das Szenario, in dem
der Folgebenutzer jeweils in beide Richtungen geht, wie auf Facebook, wenn
Sie einen Freund hinzufügen. Wenn du dich also
beide als Freund akzeptieren würdest,
nicht wie ein Instagram, bei dem das Follow
unidirektional sein kann. Du kannst also jemandem folgen
, der dir nicht folgt. Wir haben dieses Szenario in
dieser Diskussion nicht , nur damit wir es ein
bisschen einfacher machen
können. Jetzt
wäre der unkomplizierte
Ansatz zum Sturm der
Schemadetektoren, über die gesprochen Sturm der
Schemadetektoren, über die gesprochen werden, ein MySQL erfordert
offensichtlich die Gelenke, aber wir können es in einem
verteilten Schlüsselwertspeicher speichern, um die Vorteile, die auch von NoSQL
angeboten werden. Nachdem wir in unserem Interview über das
Datenbankschema gesprochen
haben, müssen wir auch eine weitere
Schätzung der Datengröße vornehmen. Das D entscheidet also
über die Schätzung des enthält Informationen über die Felder, die in unserer Datenbank gespeichert werden. Und wir müssen
über die ganzen Zahlen,
Strings und so weiter nachdenken . Später wird in unserer Datenbank
gespeichert. Wir können davon ausgehen, dass jede
Eingabeabfrage und DateTime vier Bytes
überschritten haben. Jede Zeile in der
Benutzertabelle wird also etwa 68 Bytes haben. Hätte es,
wie ich zuvor gezählt habe,
ungefähr sechs Felder gehabt . Wenn wir, sagen
wir, 250 Millionen Benutzer hätten , benötigen
wir etwa 16
Gigabyte Speicher, nur damit
der Benutzer
mit all seinen Informationen
in unserer Datenbank gespeichert
werden kann . Aber was ist mit den Fotos? Jede Zeile in der
Fototabelle wird also etwa 284 Byte Cs haben. Wir haben auch ein Fotopaket, das ein Var-Diagramm
mit 265 Zeichen sein wird und das 265 dauert.
Sehen Sie sich den
Fotoeintrag an, der ziemlich länger
wäre als der Benutzer, aber das wäre ziemlich normal. Wenn wir berücksichtigen dass täglich
etwa 1 Million neue Fotos hochgeladen werden,
benötigen
wir für
einen Tag etwa 200 und 50 Megabyte
Speicher. Und das wird
fast zehn Jahre dauern, ungefähr ein Terabyte. Die letzte Tabelle, jeder
der Benutzer folgt der Tabelle. Und wenn es
aus acht Bytes besteht, hatten
wir nur den Primärschlüssel, der
aus zwei Integralen besteht, die jeweils vier Bytes sind. Wir können über
250 Millionen Nutzer nachdenken. Sie können
weiteren 250 Millionen Benutzern folgen ,
und wir werden weitere weitere
Petabyte Speicher für die Tabelle
des
Benutzers
treffen . Der gesamte Platz, der für
all diese Tabellen für die Ohren benötigt wird, würde,
wie gesagt,
etwa zwei Terabyte betragen, was eigentlich ziemlich
gut für eine Anwendung ist. Und die Oberfläche dieser Typen. Nächstes Wochenende warf auch einen
kurzen Blick auf das Design der Komponenten, die wir in diesem Service haben werden. Das Foto wird hochgeladen oder
richtig knackig langsam. Lesen Sie, wer schneller sein wird, besonders wenn sie von Bargeld bedient
werden. Hochladen können Benutzer verfügbare
Deckverbindungen verbrauchen ,
da
das Hochladen ein langsamer Prozess
ist und das bedeutet, dass
wir nicht bedient werden können. Jedes System ist mit den
richtigen Anfragen beschäftigt. Wir sollten bedenken, dass diese Webdienste
eine Verbindung haben , wenn wir uns treffen,
bevor wir das System entwerfen. Wenn Sie also davon ausgehen, dass
ein Webserver maximal 500
Verbindungen gleichzeitig
haben kann , können
diese Engpässe mit mehr als
500 gleichzeitigen Uploads oder Lesevorgängen behandelt werden, können
wir Lesevorgänge teilen und schreibt
in separate Dienste. Dies wird es uns auch ermöglichen,
diese Operationen
in Zukunft
unabhängig und
viel einfacher zu skalieren diese Operationen
in Zukunft
unabhängig und , da es sich um
zwei separate Einheiten handelt. Für Redundanz-Teil jetzt ist das
Verlieren von Dateien, die ich
bereits erwähnt habe, keine Option. Wir können mehrere Kopien
jeder Datei als Schuldenlösung starten . Denn wenn ein Speicher würfelt, können
wir die vierte
zu stark, die andere Kopie abrufen. Das gleiche Prinzip
gilt aber auch für andere Komponenten. Wenn wir also die
Verfügbarkeit des Systems haben wollen, das hoch
wäre, würde
unser System zu keinem Zeitpunkt sterben. Wir müssen auch Replikate
des Dienstes ausführen lassen. Dienste sind verstorben. Das System bleibt erschreckend
verfügbar, da diese Redundanz
den einzigen Fehlerpunkt
im System beseitigt . Das ist ein sehr wichtiger Punkt. Wenn Sie ein Interview mit dem
Systemdesign führen, müssen
Sie überlegen, ob Sie die
Implementierung
tatsächlich
einen einzigen Punkt des
Scheiterns macht. S Schulden sind Implementierung
tatsächlich
einen einzigen Punkt des
Scheiterns macht . S Schulden ein Nachteil und
müssen beachtet werden. Und Sie müssen auch
eine Problemumgehung dafür finden. Wenn zu irgendeinem Zeitpunkt nur eine Instanz
der Dienste erforderlich ist, um sie auszuführen, können
wir eine redundante
sekundäre Kopie
des auszuführen, können
wir eine redundante
sekundäre Kopie
des Dienstes ausführen, die keinen
Datenverkehr
bereitstellt, aber nach dem tödlich für weiße Taube
Primär hat ein Problem. Wie gesagt, sind es zwei Instanzen desselben Dienstes,
der in der Produktion
ausgeführt wird,
und einer schlägt fehl. Das System kann auf
die gesunde Kopie übergehen. Und dies kann
automatisch geschehen oder einen manuellen Eingriff erfordern, obwohl
Sie, wenn Sie zu
keinem Zeitpunkt in
Ihr System heruntergehen , Sie es besser implementieren
und automatisch wiederherstellen. Denn sonst müssten
Sie
beachten, dass Ihr
System Kaugummi ist und dann manuell in die
Entwicklerschulden eingreifen können
, können Sie natürlich den
17. verfügbaren 2D umleiten. Wir können auch über
das Sharding von Daten sprechen. Da ich natürlich
so hohe Datenmengen denke, müssen
wir sie irgendwie teilen. Wir können die
Benutzer-ID abbilden, damit wir
alle Fotos eines Benutzers in
der gleichen scharfen und definierten
DB kurz halten können alle Fotos eines Benutzers in
der , die ein Terabyte beträgt. Sie benötigen vier
Charts, um
etwa vier Terabyte Daten zu speichern . Nun, für Leistung und Skalierbarkeit Wochenende
behalten Sie etwa zehn von ihnen. Auch hier wird FOR System immer
größer, wir werden in der Lage sein, den gesamten Schuldenverkehr zu
bewältigen. Wir müssen die scharfe Zahl nach
dem
Benutzer Vielfaches von zehn finden . Fangen wir dort an. Identifizieren Sie jedes
Foto in unserem System eindeutig. Wir können diese
Nummer an den Lichtbildausweis anhängen, und das wäre
eine ziemlich einfache Lösung in dieser Hinsicht. Wie können wir die
Lichtbildausweise generieren, während jede Datenbank ihre eigene automatische
Inkrementsequenz für die Lichtbildausweise
haben kann . Und da wir diese
Idee des scharfen
Lichtbildausweises anhängen werden, wird er
in unserem gesamten System einzigartig machen. Obwohl wir
dieses Partitionierungssystem entwickelt haben, hat
es einige Nachteile. Wenn wir zum Beispiel nicht
alle Bilder speichern können, die mein Diagramm
überlasten, müssen
wir
diese auf mehrere verteilen und verursachen eine
höhere spätere Krankheit. Und auch die Herzbenutzer
müssen ganz
anders gehandhabt werden, da ihnen viele
andere Benutzer und viele Leute folgen . Sie werden sehen, wie sie
die Fotos hochladen , und Schulden
können in dieser Hinsicht Probleme verursachen. Wir können natürlich den
Lichtbildausweis und nicht den Benutzer-ID
partitionieren, was ein anderer Ansatz sein kann. Denn wenn wir in der Regel
dieser Lichtbildausweis zuerst sind, können
wir die scharfe
Zahl wieder durchfinden, das Lichtbildausweismodul, was bedeutet, dass sie im Grunde
weniger stellig sind. Und natürlich
wären die
oben genannten Probleme, über
die wir gerade gesprochen haben,
die Nachteile nach dem
ersten Ansatz waren die Nachteile nach dem
ersten Ansatz über
die wir gerade gesprochen haben,
die Nachteile nach dem
ersten Ansatz waren, an dieser Stelle
gelöst worden. Um
die Lichtbildausweise zu generieren, können
Sie keine
automatische Inkrementierungssequenz haben da Sie wissen müssen, dass der
Lichtbildausweis zuerst definiert wird die scharfe Lösung hier
könnte darin bestehen,
eine separate Datenbank zu widmen diese
automatisch inkrementierende ID zu
generieren, müssen
wir auch
viel
über die Zukunft nachdenken und unser
Wachstum des Systems verbinden. Wenn wir eine große Anzahl
logischer Partitionen haben, um das
Datenwachstum am Anfang zu akkumulieren, mehrere logische
Partitionen in einer einzigen physischen Datenbank, CCS-Datenbank, oder wir können mehrere
Datenbankensysteme, die darauf laufen. Wir können separate
Datenbanken für jede logische Partition
auf jedem Server haben. Wann immer wir der Meinung sind, dass ein bestimmter
Datenbankserver viele Daten enthält, können
wir einige logische
Partitionen auf einem anderen Server erstellen und
eine Konfigurationsdatei pflegen. Und das wäre das
einzige, was wir
aktualisieren müssten, um eine eventuelle Änderung anzukündigen. Das Ranking und die
Newsfeed-Generierung ein weiteres Problem, mit dem
wir konfrontiert sind. So wie wir
damit umgehen werden. Oder zumindest eine Möglichkeit, damit umzugehen, besteht darin, den US-Feed
vorzugenerieren. Wir können einige Server haben, deren einzige Aufgabe darin
besteht, Benutzer zu generieren, um sie
kontinuierlich zu generieren und in
einer anderen Tabelle namens
User News Feed zu speichern . Wenn der Benutzer
dieses Foto für eine neue Suite benötigt, fragen
wir einfach diese
Tabelle ab und geben die Ergebnisse zurück. Leslie, wir
müssen auch über
den Bargeld- und
Lastenausgleich des Systems nachdenken den Bargeld- und
Lastenausgleich des Systems da es sehr verwendet wird, wir müssen
einen Cache für mich in
Data Service einführen , um
die Datenbankzeilen abzufangen. Das bedeutet die Hot
Folder und Benutzer. Wir können den Demand
Case verwenden, um diese Daten und
Anwendungsserver zu verwenden.
Bevor Sie auf die Datenbank zugreifen,
können Sie schnell überprüfen, ob der Cache die
gewünschten Routen hat. Ein
vernünftiger Ansatz wäre hier das R U, das am wenigsten
verwendet wird. Für die Richtlinie zur Cache-Räumung. Wir können das Integrant
intelligentere Kiersten erstellen, diese unter Verwendung der 8020-Regel, die besagt, dass 280%
des Volumens der Fotos, die
täglich gelesen werden, 80%
des Datenverkehrs generieren werden, damit wir
die ersten 20% einfach einlösen können. ging also um alle
Schritte und endlose Daten. Ich würde beim
Systemdesign-Interview als machtlos
betrachten und würde eine Implementierung des Foto-Sharing-Service-Designs
erhalten. Ich danke euch
sehr, dass du bis zum
Ende dieser Vorlesung
bei mir geblieben bist. Und ich freue mich darauf, Sie im nächsten zu
sehen.