Hallo, Kollegen.
Heute wird Ihnen die Übersetzung des Artikels von Tugberk Ugurlu angeboten, der sich bemüht hat, in vergleichsweise kurzer Form die Prinzipien des Designs moderner Softwaresysteme darzulegen. Hier ist, was der Autor über sich selbst in Kurzfassung mitteilt:

Da es absolut unmöglich ist, ein so kolossales Thema wie Architektur-Muster + Entwurfsmuster bis zum Stand von 2019 in einem übersichtlichen Artikel abzudecken, empfehlen wir nicht nur den Text von Herrn Ugurlu, sondern auch die zahlreichen Links, die er darin freundlicherweise bereitgestellt hat. Wenn es Ihnen gefällt, können wir auch einen spezialisierten Text über das Design verteilter Systeme veröffentlichen.

Foto von der Website Unsplash
Wenn Sie noch nie mit Herausforderungen konfrontiert waren, wie man ein Softwaresystem von Grund auf neu entwirft, ist es manchmal unklar, wo man anfangen soll. Ich denke, es ist notwendig, zunächst die Grenzen abzustecken, um mehr oder weniger sicher zu wissen, was genau Sie entwerfen möchten, und dann – die Ärmel hochzukrempeln und zu arbeiten, ohne diese Grenzen zu überschreiten. Ein guter Ausgangspunkt kann ein Produkt oder eine Dienstleistung sein (idealerweise eines, das Ihnen sehr gefällt), und Sie sollten sich mit seiner Umsetzung vertraut machen. Möglicherweise werden Sie überrascht sein, wie einfach dieses Produkt aussieht und welche enormen Komplexitäten sich tatsächlich dahinter verbergen. Vergessen Sie nicht: , und das ist in Ordnung.
Ich denke, der beste Rat, den ich denen geben kann, die mit dem Entwurf eines Systems beginnen, lautet: Machen Sie keine Annahmen! Von Anfang an müssen die Fakten, die über dieses System bekannt sind, und die damit verbundenen Erwartungen konkretisiert werden. Hier sind einige gute Fragen, deren Antworten Ihnen helfen werden, mit dem Entwurf zu beginnen:
- Was ist das Problem, das wir zu lösen versuchen?
- Wie hoch ist die maximale Anzahl von Benutzern, die mit unserem System interagieren werden?
- Welche Muster für das Schreiben und Lesen von Daten werden wir verwenden?
- Was sind die erwarteten Ausfallfälle, und wie gedenken wir, damit umzugehen?
- Welche Erwartungen bestehen an die Konsistenz und Verfügbarkeit des Systems?
- Müssen bei der Arbeit irgendwelche Anforderungen im Zusammenhang mit externen Prüfungen und Regulierungen berücksichtigt werden?
- Welche Arten von vertraulichen Daten beabsichtigen wir zu speichern?
Dies sind nur einige Fragen, die mir und den Teams, an denen ich im Laufe meiner beruflichen Laufbahn teilgenommen habe, nützlich waren. Wenn Sie die Antworten auf diese Fragen kennen (und auf alle anderen, die im Kontext relevant sind, in dem Sie arbeiten), können Sie allmählich in die technischen Details der Aufgabe eintauchen.
Legen wir den Ausgangswert fest
Was verstehe ich hier unter „Ausgangswert“? Tatsächlich können die meisten Probleme in der Softwareindustrie heutzutage „mit“ bestehenden Methoden und Technologien gelöst werden. Indem Sie sich in dieser Landschaft zurechtfinden, haben Sie einen gewissen Vorteil, wenn Sie mit Herausforderungen konfrontiert werden, die jemand vor Ihnen gelöst hat. Denken Sie daran, dass Programme zur Lösung von Geschäfts- und Benutzerproblemen geschrieben werden, weshalb wir bestrebt sind, die Aufgaben auf die direkteste und einfachste (aus der Sicht des Benutzers) Weise zu lösen. Warum ist es wichtig, sich daran zu erinnern? Vielleicht gefällt es Ihnen in Ihrem Koordinatensystem, für jede Aufgabe einzigartige Lösungen zu finden, da Sie denken, „was für ein Programmierer bin ich, wenn ich überall Mustern folge“? In Wirklichkeit liegt die Kunst darin, Entscheidungen darüber zu treffen, wo und was zu tun ist. Natürlich müssen wir alle von Zeit zu Zeit mit einzigartigen Problemen umgehen, von denen jedes eine echte Herausforderung darstellt. Wenn unser Ausgangswert jedoch klar definiert ist, wissen wir, wo wir unsere Kräfte einsetzen: entweder auf die Suche nach bereits vorhandenen Lösungen für die uns gestellte Aufgabe oder auf deren weitere Untersuchung und ein tieferes Verständnis.
Ich denke, ich konnte Sie überzeugen, dass, wenn ein Spezialist sicher versteht, wie die architektonischen Komponenten bestimmter bemerkenswerter Softwaresysteme beschaffen sind, dieses Wissen unerlässlich sein wird, um die Kunst eines Architekten zu erlernen und eine solide Grundlage in diesem Bereich zu schaffen.
Gut, wo fangen wir an? Bei gibt es ein Repository auf GitHub mit dem Namen , aus dessen Materialien Sie lernen können, wie man groß angelegte Systeme entwirft und sich auf Vorstellungsgespräche zu diesem Thema vorbereitet. Im Repository gibt es einen Abschnitt mit Beispielen , wo insbesondere betrachtet wird, wie einige Unternehmen ihre Systeme entwerfen , wie Twitter, Uber usw.
Bevor wir jedoch zu diesem Material übergehen, lassen Sie uns die wichtigsten architektonischen Herausforderungen, mit denen man in der Praxis konfrontiert ist, näher untersuchen. Das ist wichtig, da man eine Vielzahl von Aspekten eines hartnäckigen und vielschichtigen Problems konkretisieren und es dann im Rahmen der geltenden Regulierung in diesem System lösen muss. , ein ehemaliger Mitarbeiter von Facebook, hat , in dem er seine eigene Erfahrung beim Durchsehen von Hunderten von Bewerbern teilt. Obwohl das Video ausdrücklich die Gestaltung großer Systeme und die Erfolgskriterien, die für die Auswahl eines solchen Kandidaten wichtig sind, behandelt, wird es dennoch eine umfassende Ressource darüber sein, welche Dinge bei der Systemgestaltung am wichtigsten sind. Ich empfehle auch dieses Videos.
Erwerben Sie Kenntnisse über Datenspeicherung und -abruf
In der Regel hat Ihre Entscheidung, wie Sie Ihre Daten langfristig speichern und bereitstellen werden, einen entscheidenden Einfluss auf die Systemleistung. Daher müssen Sie in erster Linie die erwarteten Lese- und Schreibmerkmale Ihrer Daten im System verstehen. Danach sollten Sie in der Lage sein, diese Kennzahlen zu bewerten und Entscheidungen basierend auf den getroffenen Bewertungen zu treffen. Sie können diese Aufgabe jedoch nur effektiv bewältigen, wenn Sie mit den bestehenden Datenspeicherungsmustern vertraut sind. Grundsätzlich setzt dies solide Kenntnisse in Bezug auf .
Datenbanken können als Datenstrukturen betrachtet werden, die außergewöhnliche Skalierbarkeit und Langlebigkeit aufweisen. Daher sollte das Wissen über Datenstrukturen Ihnen auch bei der Auswahl einer bestimmten Datenbank von großem Nutzen sein. Zum Beispiel ist ein Datenbankserver, der verschiedene Arten von Werten unterstützt. Er ermöglicht die Arbeit mit Datenstrukturen wie Listen und Mengen und das Abrufen von Daten mithilfe bekannter Algorithmen, wie zum Beispiel , und organisiert diese Arbeit in einem langlebigen und hochverfügbaren Stil.

Foto von der Website Unsplash
Sobald Sie sich ausreichend mit verschiedenen Datenablage-Mustern vertraut gemacht haben, sollten Sie sich mit der Konsistenz und Verfügbarkeit von Daten beschäftigen. Zuerst müssen Sie die zumindest grob verstehen und dann dieses Wissen verfeinern, indem Sie sich eingehender mit etablierten Mustern der und beschäftigen. So erweitern Sie Ihren Horizont in diesem Bereich und erkennen, dass das Lesen und Schreiben von Daten tatsächlich zwei sehr unterschiedliche Probleme sind, die jeweils ihre eigenen Herausforderungen mit sich bringen. Mit einigen Mustern zur Gewährleistung von Konsistenz und Verfügbarkeit können Sie die Systemleistung erheblich steigern und gleichzeitig eine kontinuierliche Datenversorgung für Ihre Anwendungen garantieren.
Abschließend, wenn wir über Fragen der Datenablage sprechen, sollte auch das Caching erwähnt werden. Sollte es sowohl auf dem Client als auch auf dem Server gleichzeitig durchgeführt werden? Welche Daten werden Sie im Cache haben? Und warum? Wie organisieren Sie die Cache-Invalidierung? Wird sie regelmäßig in bestimmten Zeitintervallen durchgeführt? Wenn ja, wie häufig? Ich empfehle, diese Themen im des oben genannten Leitfadens zur Systemarchitektur zu beginnen.
Kommunikationsmuster
Systeme bestehen aus verschiedenen Komponenten; dies können verschiedene Prozesse sein, die innerhalb eines physischen Knotens arbeiten, oder verschiedene Maschinen, die in verschiedenen Teilen Ihres Netzwerks tätig sind. Einige dieser Ressourcen in Ihrem Netzwerk können privat sein, andere müssen jedoch öffentlich und für externe Verbraucher zugänglich sein.
Es ist notwendig, die Kommunikation dieser Ressourcen untereinander sowie den Austausch von Informationen zwischen dem gesamten System und der Außenwelt sicherzustellen. Im Kontext der Systemarchitektur stehen wir hier erneut vor einer Reihe neuer einzigartiger Herausforderungen. Wir betrachten, wie nützlich sein können und welche.

Foto von der Website Unsplash
Bei der Organisation der Kommunikation mit der Außenwelt ist es immer sehr wichtig, was mit der gleichen Ernsthaftigkeit angegangen werden sollte.
Verbindungsverteilung
Ich bin mir nicht sicher, ob die Herausstellung dieses Themas als eigenständiger Abschnitt für alle gerechtfertigt erscheint. Dennoch werde ich dieses Konzept hier ausführlich darlegen, wobei ich der Meinung bin, dass das Material dieses Abschnitts am besten mit dem Begriff „Verteilung von Verbindungen“ (connection distribution) beschrieben wird.
Systeme werden durch die richtige Verbindung vieler Komponenten gebildet, und ihre Kommunikation untereinander wird oft auf der Basis etablierter Protokolle organisiert, wie z.B. TCP und UDP. Diese Protokolle sind jedoch häufig nicht ausreichend, um alle Anforderungen moderner Systeme zu erfüllen, die oft unter hoher Last betrieben werden und stark von den Bedürfnissen der Benutzer abhängen. Es ist oft notwendig, Möglichkeiten zur Verteilung von Verbindungen zu finden, um mit solchen hohen Lasten im System umzugehen.
Die Grundlage dieser Verteilung bildet das wohl bekannte (DNS). Ein solches System ermöglicht die Umwandlung eines Domainnamens, zum Beispiel gewichteter Rundlaufalgorithmus (weighted round robin) und latenzbasierte Methoden, die helfen, die Last zu verteilen.
ist prinzipiell wichtig, und praktisch jedes größere System im Internet, mit dem wir heute zu tun haben, befindet sich hinter einem oder mehreren Lastenausgleichsgeräten. Lastenausgleichsgeräte helfen, Kundenanfragen auf viele verfügbare Instanzen zu verteilen. Lastenausgleichsgeräte gibt es sowohl in hardware- als auch in softwarebasierter Form, jedoch haben wir es in der Praxis oft mit softwarebasierten Lösungen zu tun, wie z.B. und . sind konzeptionell ebenfalls sehr ähnlich wie Lastenausgleichsgeräte, obwohl es zwischen diesen beiden eine Reihe von gibt. Diese Unterschiede müssen unbedingt berücksichtigt werden, wenn Sie ein System unter Berücksichtigung Ihrer Anforderungen entwerfen.
Es ist auch wichtig, sich über (CDN) zu informieren. Ein CDN ist ein globales, verteiltes Netzwerk von Proxy-Servern, das Informationen aus den Knoten liefert, die geografisch näher am jeweiligen Benutzer liegen. CDNs sind besonders vorteilhaft, wenn Sie mit statischen Dateien arbeiten, die in JavaScript, CSS und HTML geschrieben sind. Darüber hinaus sind heutzutage solche Cloud-Services weit verbreitet, die Traffic-Manager bereitstellen, wie zum Beispiel , die Ihnen globale Verteilung und reduzierte Latenzzeiten bei der Arbeit mit dynamischen Inhalten bieten. Solche Dienste sind jedoch in der Regel nur dann nützlich, wenn Sie mit zustandslosen Webdiensten arbeiten müssen.
Lassen Sie uns über Geschäftslogik sprechen. Strukturierung von Geschäftslogik, Aufgabenflüssen und Komponenten
Wir haben also verschiedene infrastrukturelle Aspekte des Systems besprochen. Höchstwahrscheinlich denkt der Benutzer nicht einmal über all diese Elemente Ihres Systems nach und ehrlich gesagt, kümmert er sich überhaupt nicht darum. Der Benutzer interessiert sich dafür, wie es ist, mit Ihrem System zu interagieren, was er erreichen kann, wenn er so handelt, und wie das System die Benutzerbefehle ausführt, was es mit den Benutzerdaten macht und so weiter.
Wie aus dem Titel dieses Artikels hervorgeht, wollte ich über Softwarearchitektur und Systemdesign sprechen. Ich hatte nicht vor, Entwurfsmuster zu behandeln, die beschreiben, wie Softwarekomponenten erstellt werden. Je mehr ich jedoch darüber nachdenke, desto mehr scheint mir, dass die Grenze zwischen Entwurfsmustern und Architekturmustern sehr verschwommen ist und diese beiden Konzepte eng miteinander verbunden sind. Nehmen wir zum Beispiel (Event Sourcing). Wenn Sie dieses Architekturpattern übernehmen, wird es fast alle Aspekte Ihres Systems beeinflussen: langfristige Datenspeicherung, das in Ihrem System akzeptierte Konsistenzniveau, die Form der Komponenten darin usw. Daher habe ich beschlossen, einige Architekturpatterns zu erwähnen, die sich direkt mit Geschäftslogik befassen. Auch wenn ich mich in diesem Artikel auf eine einfache Liste beschränken muss, empfehle ich Ihnen, sich damit vertraut zu machen und die Ideen, die mit diesen Mustern verbunden sind, zu durchdenken. Hier ist sie:
- Konzepte , insbesondere ,
Kollaborative Ansätze
Es ist äußerst unwahrscheinlich, dass Sie in einem Projekt die einzige Person sind, die den Prozess der Systemgestaltung verantwortet. Vielmehr werden Sie wahrscheinlich mit Kollegen interagieren müssen, die sowohl innerhalb Ihrer Aufgabe als auch darüber hinaus arbeiten. In diesem Fall könnte es notwendig sein, die gewählten technologischen Lösungen gemeinsam mit den Kollegen zu bewerten, Geschäftsbedürfnisse zu identifizieren und zu verstehen, wie Aufgaben am besten parallelisiert werden können.

Foto von der Website Unsplash
Zunächst müssen Sie eine präzise und allgemein anerkannte Vorstellung davon entwickeln, welches Geschäftsziel Sie anstreben und mit welchen beweglichen Elementen Sie dabei umgehen müssen. Methoden des Gruppeneinrichtens, insbesondere (Event Storming), helfen, diesen Prozess erheblich zu beschleunigen und Ihre Erfolgschancen zu erhöhen. Diese Arbeit kann beginnen, bevor Sie , umreißen, und dann vertiefen, während das Produkt reift. Basierend auf dem Grad der Übereinstimmung, der hier erreicht wird, können Sie auch eine für den begrenzten Kontext formulieren, in dem Sie arbeiten. Wenn Sie über die Architektur Ihres Systems berichten müssen, kann Ihnen möglicherweise , vorgeschlagen von , helfen, insbesondere wenn es darum geht zu verstehen, wie tief Sie in die Details des Problems eintauchen müssen, um die Dinge zu visualisieren, die Sie kommunizieren möchten.
Wahrscheinlich gibt es in diesem Bereich auch andere ausgereifte Technologien, die ebenso nützlich sind wie das domänenspezifische Design. Dennoch kommen wir auf das Verständnis des Fachgebiets zurück, weshalb Wissen und Erfahrung im Bereich von Nutzen sein sollten.
Quelle: habr.com
