Hallo Kollegen.
Heute wird Ihrem Gericht eine Übersetzung des Artikels von Tugberk Ugurlu vorgeschlagen, der einen relativ kleinen Umfang angenommen hat, um die Prinzipien des Entwurfs moderner Softwaresysteme darzulegen. Folgendes sagt der Autor im Endeffekt über sich selbst:
Da es absolut unmöglich ist, ein so kolossales Thema in Architekturartikeln wie Architekturmuster + Designmuster ab 2019 zu behandeln, empfehlen wir nicht nur den Text von Herrn Uruglu, sondern auch die zahlreichen Links, die er freundlicherweise darin platziert hat. Wenn es Ihnen gefällt, veröffentlichen wir einen spezielleren Text zum Design verteilter Systeme.
Isaac Smith Schuss von UnsplashWenn Sie sich noch nie solchen Herausforderungen wie dem Entwurf eines Softwaresystems von Grund auf stellen mussten, ist manchmal nicht einmal klar, wo Sie anfangen sollen, wenn Sie mit solchen Arbeiten beginnen. Ich glaube, dass Sie zuerst die Grenzen umreißen müssen, um sich mehr oder weniger sicher vorzustellen, was genau Sie entwerfen werden, und dann die Ärmel hochkrempeln und arbeiten müssen, ohne diese Grenzen zu überschreiten. Als Ausgangspunkt können Sie ein Produkt oder eine Dienstleistung (idealerweise eine, die Ihnen wirklich gefällt) nehmen und deren Implementierung verstehen. Sie werden erstaunt sein, wie einfach dieses Produkt aussieht und welche enorme Komplexität es tatsächlich verbirgt. Denken Sie daran:
Einfach ist normalerweise komplex , und das ist normal.
Ich denke, der beste Rat, den ich denjenigen geben kann, die mit dem Entwurf des Systems beginnen, ist folgender: Machen Sie keine Annahmen! Es ist von Anfang an notwendig, die über dieses System bekannten Fakten und die damit verbundenen Erwartungen zu konkretisieren. Hier sind einige gute Fragen, die Ihnen beim Entwerfen helfen können:
- Was ist das Problem, das wir zu lösen versuchen?
- Wie viele Benutzer werden maximal mit unserem System interagieren?
- Welche Muster zum Schreiben und Lesen von Daten werden bei uns verwendet?
- Was sind die erwarteten Fehler, wie werden wir damit umgehen?
- Was sind die Erwartungen an Konsistenz und Systemverfügbarkeit?
- Müssen Sie Anforderungen im Zusammenhang mit der externen Überprüfung und Regulierung berücksichtigen?
- Welche Arten von vertraulichen Daten werden wir speichern?
Dies sind nur einige Fragen, die sich sowohl für mich als auch für die Teams als nützlich erwiesen haben, an denen ich über die Jahre der beruflichen Tätigkeit teilnehmen konnte. Wenn Sie die Antworten auf diese Fragen kennen (und auf alle anderen, die für den Kontext relevant sind, in dem Sie arbeiten müssen), können Sie sich schrittweise mit den technischen Details der Aufgabe befassen.
Stellen Sie den Anfangspegel einWas meine ich hier mit "Grundlinie"? Tatsächlich können in unserer Zeit die meisten Probleme in der Softwareindustrie mit vorhandenen Methoden und Technologien "gelöst" werden. Wenn Sie in dieser Landschaft geführt werden, haben Sie einen gewissen Vorsprung vor Aufgaben, die jemand vor Ihnen lösen musste. Vergessen Sie nicht, dass Programme geschrieben wurden, um die Probleme von Unternehmen und Benutzern zu lösen. Wir bemühen uns daher, das Problem auf einfachste und einfachste Weise (aus Sicht des Benutzers) zu lösen. Warum muss man sich daran erinnern? Vielleicht suchen Sie in Ihrem Koordinatensystem nach einzigartigen Lösungen für alle Aufgaben, weil Sie denken: "Was für ein Programmierer bin ich, wenn ich überall Mustern folge?" Tatsächlich besteht die
Kunst hier darin, Entscheidungen darüber zu treffen, wo und was zu tun ist . Natürlich muss sich jeder von uns von Zeit zu Zeit einzigartigen Problemen stellen, von denen jedes eine echte Herausforderung darstellt. Wenn unser anfängliches Niveau jedoch klar abgegrenzt ist, wissen wir, wofür wir Energie ausgeben müssen: Suche nach vorgefertigten Lösungen für das vor uns liegende Problem oder dessen weitere Untersuchung und tieferes Verständnis.
Ich glaube, ich habe es geschafft, Sie davon zu überzeugen, dass, wenn ein Spezialist die architektonische Komponente einiger wunderbarer Softwaresysteme sicher versteht, dieses Wissen unabdingbar ist, um die Kunst eines Architekten zu beherrschen und eine solide Basis in diesem Bereich zu entwickeln.
OK, wo fängst du an?
Donna Martin hat auf GitHub ein Repository namens
system-design-primer , auf dessen Grundlage Sie lernen können, wie man große Systeme entwirft und sich auf Interviews zu diesem Thema vorbereitet. Das Repository enthält einen Abschnitt mit Beispielen für
reale Architekturen , in dem insbesondere untersucht wird, wie
einige bekannte Unternehmen wie Twitter, Uber usw. mit dem Design ihrer Systeme umgehen.
Bevor wir jedoch zu diesem Material übergehen, schauen wir uns die wichtigsten architektonischen Herausforderungen genauer an, mit denen wir uns in der Praxis befassen müssen. Dies ist wichtig, da Sie VIELE Aspekte des unlösbaren und vielfältigen Problems spezifizieren und es dann im Rahmen der in diesem System geltenden Verordnung lösen müssen.
Jackson Gabbard , ein ehemaliger Facebook-Mitarbeiter, hat ein
50-minütiges Video über Systemdesign-Interviews aufgenommen , in dem er seine eigenen Erfahrungen bei der Überprüfung von Hunderten von Arbeitssuchenden mitteilte. Trotz der Tatsache, dass sich das Video ausdrücklich auf das Design großer Systeme und Erfolgskriterien bezieht, die bei der Suche nach einem Kandidaten für eine solche Position wichtig sind, wird es dennoch als umfassende Ressource darüber dienen, welche Dinge beim Design von Systemen am wichtigsten sind. Ich biete auch eine
Zusammenfassung dieses Videos an.
Machen Sie sich mit dem Speichern und Abrufen von Daten vertrautIn der Regel wirkt sich Ihre Entscheidung darüber, wie Sie Ihre Daten für einen langen Zeitraum speichern und anzeigen, entscheidend auf die Systemleistung aus. Daher müssen Sie zuerst die erwarteten Eigenschaften des Schreibens und Lesens von Daten in Ihrem System verstehen. Dann müssen Sie in der Lage sein, diese Indikatoren zu bewerten und anhand der vorgenommenen Schätzungen eine Auswahl zu treffen. Sie können diese Arbeit jedoch nur dann effektiv bewältigen, wenn Sie die vorhandenen Muster der Datenspeicherung verstehen. Dies setzt im Prinzip verlässliches Wissen in Bezug auf die
Auswahl der Datenbank voraus .
Datenbanken können als Datenstrukturen betrachtet werden, die sich durch außergewöhnliche Skalierbarkeit und Haltbarkeit auszeichnen. Daher sollten Kenntnisse über Datenstrukturen für Sie bei der Auswahl der einen oder anderen Datenbank sehr hilfreich sein. Beispielsweise ist
Redis ein Datenstrukturserver, der verschiedene Arten von Werten unterstützt. Es ermöglicht Ihnen, mit Datenstrukturen wie Listen und Mengen zu arbeiten, Daten mit bekannten Algorithmen, z. B.
LRU , zu lesen und solche Arbeiten in einem dauerhaften und leicht zugänglichen Stil zu organisieren.
Samuel Zellers Schnappschuss von UnsplashWenn Sie die verschiedenen Muster der Datenspeicherung gut verstanden haben, untersuchen Sie anschließend die Datenkonsistenz und -verfügbarkeit. Zunächst müssen Sie den
GAP-Satz zumindest allgemein lernen und dann dieses Wissen verbessern, indem Sie die etablierten Muster der
Konsistenz und
Zugänglichkeit genauer untersuchen. Auf diese Weise entwickeln Sie Ihren Horizont in diesem Bereich und verstehen, dass das Lesen und Schreiben von Daten zwei sehr unterschiedliche Probleme sind und jedes seine eigenen besonderen Herausforderungen hat. Mit mehreren Mustern ausgestattet, um Konsistenz und Zugänglichkeit zu gewährleisten, können Sie die Systemleistung erheblich steigern und gleichzeitig einen unterbrechungsfreien Datenfluss zu Ihren Anwendungen sicherstellen.
Abschließend sollte zum Abschluss der Diskussion über Datenspeicherungsprobleme auch das Caching erwähnt werden. Sollte es sowohl auf dem Client als auch auf dem Server ausgeführt werden? Welche Daten befinden sich in Ihrem Cache? Und warum? Wie organisiert man die Cache-Ungültigmachung? Wird es regelmäßig in regelmäßigen Abständen durchgeführt? Wenn ja, wie oft? Ich empfehle, das Studium dieser Themen mit dem
nächsten Abschnitt des oben genannten Leitfadens zum Systemdesign zu beginnen.
KommunikationsmusterSysteme bestehen aus verschiedenen Komponenten; Dies können verschiedene Prozesse sein, die innerhalb desselben physischen Knotens ausgeführt werden, oder verschiedene Computer, die in verschiedenen Teilen Ihres Netzwerks arbeiten. Einige dieser Ressourcen in Ihrem Netzwerk sind möglicherweise privat, andere müssen öffentlich und für Verbraucher zugänglich sein, die von außen auf sie zugreifen.
Es ist notwendig, die Kommunikation dieser Ressourcen untereinander sowie den Informationsaustausch zwischen dem gesamten System und der Außenwelt sicherzustellen. Auch hier stehen wir im Kontext des Systemdesigns vor einer Reihe neuer einzigartiger Herausforderungen. Wir finden heraus, wie
asynchrone Aufgabenabläufe nützlich sein können und welche
verschiedenen Kommunikationsmuster verfügbar sind .
Tony Stoddards Schnappschuss von UnsplashBei der Organisation der Kommunikation mit der Außenwelt ist
Sicherheit immer sehr wichtig, was auch ernsthaft angegangen und aktiv einbezogen werden muss.
VerbindungsverteilungIch bin mir nicht sicher, ob es für alle gerechtfertigt erscheint, dieses Thema in einen unabhängigen Abschnitt zu stellen. Trotzdem werde ich dieses Konzept hier erläutern, und ich glaube, dass das Material in diesem Abschnitt am genauesten durch den Begriff „Verbindungsverteilung“ beschrieben wird.
Systeme werden durch korrektes Verbinden vieler Komponenten gebildet, und ihre Kommunikation untereinander wird häufig auf der Grundlage etablierter Protokolle organisiert, z. B. TCP und UDP. Diese Protokolle als solche reichen jedoch häufig nicht aus, um alle Anforderungen moderner Systeme zu erfüllen, die häufig unter hoher Last betrieben werden, und hängen auch stark von den Anforderungen der Benutzer ab. Es ist oft notwendig, Wege zu finden, um Verbindungen zu verteilen, um mit solch hohen Systemlasten fertig zu werden.
Diese Distribution basiert auf dem bekannten
Domain Name System (DNS). Mit einem solchen System können Sie einen Domänennamen konvertieren, z. B. gewichtetes Round-Robin und Methoden, die auf Verzögerungen basieren und zur Lastverteilung beitragen.
Der Lastausgleich ist von grundlegender Bedeutung, und fast jedes große System im Internet, mit dem wir uns heute befassen müssen, befindet sich hinter einem oder mehreren Lastausgleichern. Mit Load Balancern können Sie Clientanforderungen auf die vielen verfügbaren Instanzen verteilen. Load Balancer können entweder Hardware oder Software sein. In der Praxis müssen Sie sich jedoch häufig mit Software befassen, z. B.
HAProxy und
ELB .
Reverse-Proxys sind Load Balancern konzeptionell sehr ähnlich, obwohl es zwischen dem ersten und dem zweiten eine Reihe
unterschiedlicher Unterschiede gibt . Diese Unterschiede müssen berücksichtigt werden, wenn das System gemäß Ihren Anforderungen entworfen wird.
Sie sollten auch
Content Delivery Networks (CDNs) kennen. CDN ist ein global verteiltes Netzwerk von Proxyservern, das Informationen von Knoten liefert, die sich geografisch näher an einem bestimmten Benutzer befinden. CDNs werden bevorzugt, wenn Sie mit statischen Dateien arbeiten, die in JavaScript, CSS und HTML geschrieben sind. Darüber hinaus sind solche Cloud-Dienste heutzutage sehr beliebt, die Verkehrsmanager bereitstellen, z. B.
Azure Traffic Manager , die Ihnen eine globale Verteilung und geringere Verzögerungen bei der Arbeit mit dynamischen Inhalten bieten. Solche Dienste sind jedoch normalerweise in Fällen nützlich, in denen Sie mit Webdiensten arbeiten müssen, ohne den Status zu speichern.
Lassen Sie uns über Geschäftslogik sprechen. Strukturierung von Geschäftslogik, Aufgabenabläufen und KomponentenDaher konnten wir verschiedene Infrastrukturaspekte des Systems diskutieren. Höchstwahrscheinlich denkt der Benutzer nicht einmal an all diese Elemente Ihres Systems und ist ehrlich gesagt überhaupt nicht besorgt über sie. Der Benutzer interessiert sich dafür, wie er mit Ihrem System interagieren kann, was dadurch erreicht werden kann und wie das System Benutzerbefehle ausführt, was und wie mit Benutzerdaten zu tun ist.
Wie der Name dieses Artikels andeutet, wollte ich darin etwas über Softwarearchitektur und Systemdesign erzählen. Dementsprechend hatte ich nicht vor, Software-Designmuster zu behandeln, die beschreiben, wie Softwarekomponenten erstellt werden. Je mehr ich darüber nachdenke, desto mehr scheint mir die Grenze zwischen Software-Design-Mustern und Architektur-Mustern sehr verschwommen zu sein, und diese beiden Konzepte sind eng miteinander verbunden. Nehmen Sie zum Beispiel Event Sourcing. Wenn Sie dieses Architekturmuster übernehmen, wirkt es sich auf fast alle Aspekte Ihres Systems aus: Langzeitdatenspeicherung, Konsistenzgrad Ihres Systems, Umrisse der darin enthaltenen Komponenten usw. usw. Deshalb habe ich mich entschlossen, einige Architekturmuster zu erwähnen, die in direktem Zusammenhang mit der Geschäftslogik stehen. Auch wenn Sie sich in diesem Artikel auf eine einfache Liste beschränken müssen, empfehle ich Ihnen, sich damit vertraut zu machen und über Ideen im Zusammenhang mit diesen Mustern nachzudenken. Hier bitte:
Kollaborative AnsätzeEs ist äußerst unwahrscheinlich, dass Sie als Teilnehmer am Projekt teilnehmen, der allein für den Systemdesignprozess verantwortlich ist. Im Gegenteil, höchstwahrscheinlich müssen Sie mit Kollegen interagieren, die sowohl innerhalb Ihrer Aufgabe als auch darüber hinaus arbeiten. In diesem Fall müssen Sie möglicherweise die ausgewählten technologischen Lösungen zusammen mit Kollegen bewerten, die Geschäftsanforderungen isolieren und verstehen, wie Aufgaben besser parallelisiert werden können.
Kaleidico Snapshot von UnsplashZunächst muss eine genaue und allgemein anerkannte Vorstellung davon entwickelt werden, welches Geschäftsziel Sie erreichen möchten und mit welchen bewegenden Elementen Sie sich befassen müssen. Gruppenmodellierungstechniken, insbesondere Event Storming, können diesen Prozess erheblich beschleunigen und Ihre Erfolgschancen erhöhen. Sie können diese Arbeit ausführen, bevor oder nachdem Sie die
Grenzen Ihrer Services festgelegt haben , und sie dann vertiefen, wenn das Produkt ausgereift ist. Basierend auf dem Grad der Konsistenz, der hier erreicht wird, können Sie auch eine
einzige Sprache für den begrenzten Kontext formulieren, in dem Sie arbeiten. Wenn Sie über die Architektur Ihres Systems sprechen müssen, können Sie
das von
Simon Brown vorgeschlagene
C4-Modell verwenden , insbesondere wenn Sie verstehen müssen, wie viel Sie in die Details des Problems eintauchen müssen, indem Sie die Dinge visualisieren, die Sie melden möchten.
Wahrscheinlich gibt es in diesem Thema eine andere ausgereifte Technologie, die nicht weniger nützlich ist als themenorientiertes Design. Auf die eine oder andere Weise kehren wir jedoch zum Verständnis des Themenbereichs zurück, sodass Kenntnisse und Erfahrungen auf dem Gebiet des
fachorientierten Designs für Sie hilfreich sein sollten.