Hallo Kollegen.
Heute präsentieren wir Ihnen die Übersetzung eines Artikels von Tugberk Ugurlu, der in überschaubarem Umfang die Prinzipien des Designs moderner Softwaresysteme darstellt. Folgendes teilt der Autor über sich selbst mit:

Da es unmöglich ist, ein so umfangreiches Thema wie Architektur- und Entwurfsmuster im Rahmen eines kurzen Artikels zu erfassen, empfehlen wir nicht nur den Text von Herrn Ugurlu, sondern auch die zahlreichen Links, die er darin bereitwillig platziert hat. Wenn es Ihnen gefällt, veröffentlichen wir gern auch einen spezielleren Text über das Design vernetzter Systeme.

Foto von Unsplash
Wenn Sie sich noch nie mit Herausforderungen wie der Entwicklung eines Software-Systems von Grund auf beschäftigt haben, kann es zu Beginn dieser Arbeit manchmal unklar sein, wo Sie anfangen sollen. Ich denke, es ist wichtig, zunächst die Grenzen abzustecken, um eine klare Vorstellung davon zu bekommen, was genau Sie entwerfen möchten. Danach sollten Sie die Ärmel hochkrempeln und loslegen, ohne diese Grenzen zu überschreiten. Ein guter Ausgangspunkt könnte ein Produkt oder eine Dienstleistung sein (idealerweise eines, das Ihnen sehr gut gefällt), um dessen Implementierung zu analysieren. Sie könnten überrascht sein, wie einfach dieses Produkt aussieht und welche komplexen Herausforderungen tatsächlich dahinterstecken. 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, ist: Treffen Sie keine Annahmen! Von Anfang an sollten die bekannten Fakten über dieses System und die damit verbundenen Erwartungen konkretisiert werden. Hier sind einige gute Fragen, deren Antworten Ihnen helfen können, mit dem Entwurf zu beginnen:
- Was ist das Problem, das wir zu lösen versuchen?
- Wie viele Benutzer werden voraussichtlich gleichzeitig mit unserem System interagieren?
- Welche Schreib- und Lese-Muster werden wir verwenden?
- Was sind die erwarteten Ausfallfälle und wie beabsichtigen wir, damit umzugehen?
- Welche Anforderungen stellen wir an die Konsistenz und Verfügbarkeit des Systems?
- Müssen wir bei der Arbeit irgendwelche Anforderungen bzgl. externer Prüfungen und Regulierungen berücksichtigen?
- Welche Arten von vertraulichen Daten planen wir zu speichern?
Das sind nur einige Fragen, die sowohl mir als auch den Teams, in denen ich im Laufe meiner beruflichen Laufbahn tätig war, hilfreich waren. Wenn Sie Antworten auf diese Fragen (und auf andere, die im Kontext Ihrer Tätigkeit relevant sind) kennen, können wir nach und nach in die technischen Details der Aufgabe eintauchen.
Wir setzen den Ausgangspunkt
Was verstehe ich hier unter dem „Basisniveau“? Heutzutage lassen sich die meisten Probleme in der Softwareindustrie mit bereits bestehenden Methoden und Technologien lösen. In diesem Kontext haben Sie einen gewissen Vorteil, wenn Sie mit Herausforderungen konfrontiert werden, die andere bereits zuvor gelöst haben. Vergessen Sie nicht, dass Programme zur Lösung der Probleme von Unternehmen und Nutzern entwickelt werden. Daher streben wir an, diese Probleme auf die direkteste und einfachste Weise (aus Sicht des Nutzers) zu lösen. Warum ist es wichtig, dies im Hinterkopf zu behalten? Vielleicht fühlen Sie sich in Ihrem Koordinatensystem wohler, wenn Sie für jede Herausforderung eine einzigartige Lösung finden, weil Sie denken: „Was für ein Programmierer wäre ich, wenn ich überall den Mustern folge?“ Tatsächlich liegt die Kunst hier darin, Entscheidungen darüber zu treffen, wo und was zu tun ist.. Natürlich steht jeder von uns von Zeit zu Zeit vor einzigartigen Herausforderungen, die jede für sich eine echte Herausforderung darstellen. Wenn wir jedoch ein klares Fundament haben, wissen wir, wo wir unsere Energie investieren sollten: entweder in die Suche nach bestehenden Lösungen für die vorliegende Aufgabe oder in eine tiefere Analyse und das Verständnis dieser.
Ich denke, ich konnte Sie überzeugen, dass es für einen Spezialisten, der die architektonischen Bestandteile einiger bemerkenswerter Softwaresysteme umfassend versteht, von unschätzbarem Wert ist, um die Kunst des Architekten zu meistern und ein solides Fundament in diesem Bereich aufzubauen.
Gut, wo fangen wir an? Bei finden Sie ein Repository auf GitHub mit dem Namen , das Ihnen hilft, das Design von groß angelegten Systemen zu erlernen und sich auf Vorstellungsgespräche zu diesem Thema vorzubereiten. Im Repository gibt es einen Abschnitt mit Beispielen für , in dem unter anderem erforscht wird, wie einige namhafte Unternehmen , zum Beispiel, Twitter, Uber usw.
Bevor wir uns diesem Thema zuwenden, lassen Sie uns die wichtigsten architektonischen Herausforderungen, mit denen wir in der Praxis konfrontiert werden, näher betrachten. Dies ist entscheidend, da eine Vielzahl von Aspekten des komplexen Problems konkretisiert und dann im Rahmen der bestehenden Vorschriften dieser Systeme gelöst werden muss. , ein ehemaliger Mitarbeiter von Facebook, hat , in dem er seine Erfahrungen beim Screening von Hunderten von Bewerbern teilt. Obwohl das Video eindeutig die Gestaltung großer Systeme und die erfolgreichen Kriterien, die bei der Auswahl von Kandidaten für solche Positionen wichtig sind, behandelt, stellt es dennoch eine umfassende Ressource darüber dar, was beim Design von Systemen am wichtigsten ist. Ich empfehle auch dieses Videos.
Vertiefen Sie Ihr Wissen über Datenspeicherung und -abruf.
In der Regel hat Ihre Entscheidung, wie Sie Ihre Daten langfristig speichern und abrufen, einen entscheidenden Einfluss auf die Systemleistung. Daher sollten Sie zunächst die erwarteten Eigenschaften von Schreib- und Lesevorgängen in Ihrem System verstehen. Anschließend müssen Sie in der Lage sein, diese Kennzahlen zu bewerten und Ihre Auswahl basierend auf diesen Bewertungen zu treffen. Doch nur wenn Sie mit den bestehenden Datenspeicherungsmustern vertraut sind, können Sie diese Aufgabe effektiv bewältigen. Grundsätzlich erfordert dies fundierte Kenntnisse über .
Datenbanken können als Datenstrukturen betrachtet werden, die durch außergewöhnliche Skalierbarkeit und Langlebigkeit gekennzeichnet sind. Daher sollten Ihnen Kenntnisse über Datenstrukturen auch bei der Auswahl einer bestimmten Datenbank von großem Nutzen sein. Zum Beispiel, – ein Server für Datenstrukturen, der verschiedene Arten von Werten unterstützt. Er ermöglicht die Arbeit mit Datenstrukturen wie Listen und Mengen und das Abrufen von Daten mithilfe gängiger Algorithmen, wie etwa , und organisiert diese Vorgänge auf eine langlebige und hochverfügbare Weise.

Foto von Unsplash
Sobald Sie sich mit verschiedenen Datenstorage-Mustern vertraut gemacht haben, sollten Sie sich mit der Konsistenz und Verfügbarkeit von Daten beschäftigen. Zunächst müssen Sie die mindestens in groben Zügen verstehen, und dann sollten Sie dieses Wissen verfeinern, indem Sie sich näher mit etablierten Mustern der и . Auf diese Weise erweitern Sie Ihren Horizont in diesem Bereich und erkennen, dass das Lesen und Schreiben von Daten in Wirklichkeit zwei sehr unterschiedliche Probleme darstellen, die jeweils ihre eigenen spezifischen Herausforderungen mit sich bringen. Mit ein paar Mustern zur Sicherstellung von Konsistenz und Verfügbarkeit können Sie die Systemleistung erheblich steigern und gleichzeitig eine unterbrechungsfreie Datenbereitstellung in Ihren Anwendungen garantieren.
Abschließend möchte ich im Zusammenhang mit Speicherfragen auch das Caching ansprechen. Sollte es sowohl auf dem Client als auch auf dem Server stattfinden? Welche Daten werden in Ihrem Cache gespeichert? Und warum? Wie organisieren Sie die Cache-Invalidierung? Erfolgt dies regelmäßig in bestimmten Zeitabständen? Wenn ja, wie oft? Ich empfehle, mit diesen Themen zu beginnen bei dem oben erwähnten Lehrbuch zur Systemgestaltung.
Kommunikationsmuster
Systeme bestehen aus verschiedenen Komponenten; dies können sowohl unterschiedliche Prozesse sein, die innerhalb desselben physischen Knotens arbeiten, als auch verschiedene Maschinen, die in unterschiedlichen Teilen Ihres Netzwerks agieren. Einige dieser Ressourcen innerhalb Ihres Netzwerks können privat sein, während andere öffentlich und für externe Nutzer zugänglich sein müssen.
Es ist notwendig, die Kommunikation dieser Ressourcen untereinander sowie den Austausch von Informationen zwischen dem gesamten System und der Außenwelt sicherzustellen. Im Kontext des Systemdesigns begegnen wir hier erneut einer Reihe neuartiger Herausforderungen. Lassen Sie uns untersuchen, wie , und welche v.

Foto von Unsplash
Bei der Organisation der Kommunikation mit der Außenwelt ist es immer von großer Bedeutung , wofür man ebenfalls mit aller Ernsthaftigkeit an die Sache herangehen und aktiv daran arbeiten muss.
Verbindungverteilung
Ich bin mir nicht sicher, ob es gerechtfertigt ist, dieses Thema in ein eigenes Kapitel auszulagern. Trotzdem werde ich dieses Konzept hier ausführlich darlegen, wobei ich der Auffassung bin, dass der Inhalt dieses Abschnitts am treffendsten mit dem Begriff „Verbindungverteilung“ (connection distribution) beschrieben wird.
Systeme werden durch die richtige Kombination vieler Komponenten gebildet, und ihre Kommunikation basiert oft auf etablierten Protokollen wie TCP und UDP. Diese Protokolle allein reichen jedoch häufig nicht aus, um alle Anforderungen moderner Systeme zu erfüllen, die oft unter hoher Last betrieben werden und stark von den Benutzeranforderungen abhängen. Es ist häufig notwendig, Methoden zur Lastenverteilung zu finden, um mit solch hohen Systemlasten umzugehen.
Die Grundlage dieser Verteilung bildet ein gut bekanntes (DNS). Dieses System ermöglicht die Umwandlung von Domainnamen, beispielsweise durch gewichtete Rundlaufalgorithmen (weighted round robin) und latenzbasierte Methoden, die helfen, die Last zu verteilen.
ist grundlegend, und praktisch jedes größere System im Internet, mit dem wir heute konfrontiert sind, befindet sich hinter einem oder mehreren Load-Balancern. Load-Balancer helfen dabei, Kundenanfragen auf mehrere verfügbare Instanzen zu verteilen. Es gibt sowohl hardware- als auch softwarebasierte Load-Balancer; in der Praxis hat man jedoch häufiger mit softwarebasierten zu tun, beispielsweise mit и . sind konzeptionell ebenfalls sehr ähnlich wie Load-Balancer, wobei es zwischen den beiden eine Reihe von . Diese Unterschiede müssen unbedingt berücksichtigt werden, wenn Sie ein System entwerfen, das auf Ihre Bedürfnisse zugeschnitten ist.
Es ist auch wichtig, über (CDN). CDN – ein global verteiltes Netzwerk von Proxy-Servern, das Informationen von Knoten liefert, die geographisch näher am jeweiligen Benutzer liegen. CDN-Netzwerke sind besonders vorteilhaft, wenn Sie mit statischen Dateien arbeiten, die in JavaScript, CSS und HTML verfasst sind. Außerdem sind heute cloudbasierte Dienste weit verbreitet, die Traffic-Manager bereitstellen, wie zum Beispiel , welche Ihnen eine globale Verteilung und reduzierte Latenzen beim Umgang mit dynamischen Inhalten bieten. Solche Dienste sind jedoch meist dann nützlich, wenn man mit zustandslosen Webdiensten arbeitet.
Lassen Sie uns über Geschäftslogik sprechen. Die Strukturierung von Geschäftslogik, Aufgabenströmen und Komponenten
Wir haben also verschiedene infrastrukturelle Aspekte des Systems besprochen. Wahrscheinlich denkt der Nutzer nicht über all diese Elemente Ihres Systems nach und ehrlich gesagt, kümmert er sich überhaupt nicht darum. Was den Nutzer interessiert, ist, wie die Interaktion mit Ihrem System erfolgt, welche Ergebnisse durch bestimmte Handlungen erzielt werden können und wie das System Benutzerbefehle ausführt und mit Benutzerdaten umgeht.
Wie aus dem Titel dieses Artikels hervorgeht, wollte ich über Softwarearchitektur und Systemdesign sprechen. Ich hatte daher nicht geplant, Designmuster zu behandeln, die beschreiben, wie Softwarekomponenten erstellt werden. Allerdings wird mir beim Nachdenken immer klarer, dass die Grenze zwischen Softwaredesignmustern und Architekturmustern sehr verschwommen ist und dass diese beiden Konzepte eng miteinander verbunden sind. Nehmen wir zum Beispiel (Event Sourcing). Wenn Sie dieses Architektur-Muster übernehmen, wird es nahezu alle Aspekte Ihres Systems beeinflussen: die dauerhafte Speicherung von Daten, den Konsistenzgrad, der in Ihrem System herrscht, die Struktur der Komponenten darin usw. Daher möchte ich einige Architektur-Muster erwähnen, die speziell die Geschäftslogik betreffen. Auch wenn ich in diesem Artikel mit einer einfachen Liste auskommen muss, empfehle ich Ihnen, sich damit vertraut zu machen und über die damit verbundenen Ideen nachzudenken. Hier sind sie:
- Konzepte , insbesondere ,
Kollaborative Ansätze
Es ist äußerst unwahrscheinlich, dass Sie der einzige Teilnehmer sind, der für den Designprozess des Systems verantwortlich ist. Vielmehr werden Sie wahrscheinlich mit Kollegen zusammenarbeiten müssen, die sowohl in Bezug auf Ihre Aufgaben als auch darüber hinaus tätig sind. In diesem Fall kann es erforderlich sein, die gewählten technologischen Lösungen gemeinsam mit den Kollegen zu bewerten, die geschäftlichen Anforderungen herauszufiltern und zu verstehen, wie Aufgaben am besten parallelisiert werden können.

Foto von Unsplash
Zunächst müssen Sie ein präzises und allgemein anerkanntes Verständnis darüber entwickeln, was das Geschäftsziel ist, das Sie zu erreichen versuchen, und mit welchen Variablen Sie dabei umgehen müssen. Methoden des Gruppensimulierens wie insbesondere können diesen Prozess erheblich beschleunigen und Ihre Erfolgschancen erhöhen. Diese Arbeit kann durchgeführt werden, bevor oder nachdem Sie die , festgelegt haben, und dann vertiefen, während das Produkt reift. Basierend auf dem Maß an Konsistenz, das hier erreicht wird, können Sie auch eine für den begrenzten Kontext, in dem Sie arbeiten. Wenn es darum geht, die Architektur Ihres Systems zu erläutern, kann es hilfreich sein, , vorgeschlagen von , insbesondere wenn es darum geht, zu verstehen, wie tief Sie in die Details des Problems eindringen müssen, indem Sie die Dinge 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 kehren wir immer wieder zum Verständnis der Domäne zurück, sodass Kenntnisse und Erfahrungen im Bereich für Sie von Nutzen sein sollten.
Quelle: habr.com
