Bausteine verteilter Anwendungen. Null-NĂ€herung

Bausteine verteilter Anwendungen. Null-NĂ€herung

Die Welt steht nicht still. Der Fortschritt schafft neue technologische Herausforderungen. Mit den sich Ă€ndernden Anforderungen muss sich auch die Architektur der Informationssysteme weiterentwickeln. Heute werden wir ĂŒber ereignisorientierte Architektur, Konkurrenz, ParallelitĂ€t, AsynchronitĂ€t und darĂŒber sprechen, wie man in Erlang friedlich damit leben kann.

EinfĂŒhrung

Je nach GrĂ¶ĂŸe des geplanten Systems und den Anforderungen daran wĂ€hlen wir Entwickler die Methode zur InformationsĂŒbertragung im System aus. In den meisten FĂ€llen kann ein Broker-basierendes Schema, beispielsweise auf RabbitMQ oder Kafka, eine praktikable Lösung zur Organisation der Interaktion der Dienste sein. Aber manchmal sind der Ereignisfluss, die SLA und der Kontrollgrad ĂŒber das System so beschaffen, dass uns bestehende Messaging-Systeme nicht ausreichen. NatĂŒrlich kann man das System etwas komplexer gestalten, indem man die Verantwortung fĂŒr die Transportschicht und die Clusterbildung ĂŒbernimmt, zum Beispiel mit ZeroMQ oder nanomsg. Aber wenn das System ĂŒber ausreichende Bandbreite und Funktionen des standardmĂ€ĂŸigen Erlang-Clusters verfĂŒgt, erfordert die EinfĂŒgung einer zusĂ€tzlichen EntitĂ€t eine detaillierte Untersuchung und wirtschaftliche Rechtfertigung.

Das Thema reaktive verteilte Anwendungen ist recht umfangreich. Um im Format eines Artikels zu bleiben, wird sich die heutige Diskussion nur auf homogene Umgebungen konzentrieren, die auf Erlang/Elixir basieren. Das Ökosystem Erlang/OTP ermöglicht die Implementierung einer reaktiven Architektur mit minimalem Aufwand. Aber in jedem Fall benötigen wir eine Kommunikationsschicht.

Theoretische Grundlagen

Das Design beginnt mit der Definition von Zielen und BeschrÀnkungen. Das Hauptziel liegt nicht im Bereich der Entwicklung um der Entwicklung willen. Wir benötigen ein sicheres und skalierbares Werkzeug, auf dessen Grundlage moderne Anwendungen unterschiedlichen Niveaus erstellt werden können und, was am wichtigsten ist, weiterentwickelt werden können: beginnend bei Ein-Server-Anwendungen, die eine kleine Zielgruppe bedienen und sich spÀter zu Clustern von bis zu 50-60 Knoten entwickeln können, bis hin zu Föderationen von Clustern. Daher besteht das Hauptziel darin, den Gewinn durch Senkung der Entwicklungskosten und der Eigentumskosten des Endsystems zu maximieren.

Lassen Sie uns vier Hauptanforderungen an das Endsystem hervorheben:

  • CEreignisorientierung.
    Das System ist stets bereit, einen Strom von Ereignissen zu verarbeiten und die erforderlichen Maßnahmen zu ergreifen;
  • MaschinenfĂ€higkeit.
    Einzelblöcke können sowohl vertikal als auch horizontal skaliert werden. Das gesamte System sollte in der Lage sein, unbegrenzt horizontal zu wachsen;
  • Ordnungssicherheit.
    Alle Ebenen und alle Dienste mĂŒssen in der Lage sein, sich bei AusfĂ€llen automatisch wiederherzustellen;
  • Garantierte Reaktionszeit.
    Zeit ist wertvoll, und Benutzer sollten nicht zu lange warten mĂŒssen.

Erinnern Sie sich an das alte MĂ€rchen ĂŒber "Die kleine Lokomotive, die es konnte"? Damit das entstehende System erfolgreich aus der Prototyp-Phase herauskommt und fortschrittlich ist, muss sein Fundament die Mindestanforderungen erfĂŒllen. KONNTE.

Dem Messaging als Infrastrukturwerkzeug und Basis fĂŒr alle Dienste wird ein weiterer Punkt hinzugefĂŒgt: Benutzerfreundlichkeit fĂŒr Programmierer.

Ereignisorientierung

Damit die Anwendung von einer Server zu einem Cluster wachsen kann, muss ihre Architektur eine schwache Kopplung gewĂ€hrleisten. Dieses Kriterium erfĂŒllt das asynchrone Modell. Darin kĂŒmmern sich Sender und EmpfĂ€nger um die Informationslast der Nachricht und machen sich keine Gedanken ĂŒber Übertragung und Routing innerhalb des Systems.

Skalierbarkeit

Skalierbarkeit und Effizienz des Systems stehen in engem Zusammenhang. Die Anwendungsbestandteile mĂŒssen in der Lage sein, alle verfĂŒgbaren Ressourcen zu nutzen. Je effektiver wir die KapazitĂ€ten nutzen können und je optimierter unsere Verarbeitungsmethoden sind, desto weniger Geld geben wir fĂŒr Hardware aus.

Innerhalb einer Maschine schafft Erlang eine hochkonkurrierende Umgebung. Das Gleichgewicht zwischen Konkurrenz und ParallelitĂ€t kann durch die Auswahl der Anzahl der Betriebssystemthreads, die fĂŒr die Erlang-VM verfĂŒgbar sind, und der Anzahl der Scheduler, die diese Threads nutzen, bestimmt werden.
Erlang-Prozesse haben keinen gemeinsamen Zustand und arbeiten im nicht-blockierenden Modus. Dies ermöglicht eine vergleichsweise niedrige Latenz und eine höhere Durchsatzrate als traditionelle Anwendungen, die auf blockierender Synchronisation basieren. Der Erlang-Scheduler sorgt fĂŒr eine faire Verteilung von CPU und IO, und das Fehlen von Sperren ermöglicht es der Anwendung, selbst in Spitzenlastzeiten oder bei AusfĂ€llen zu reagieren.

Auf Clusterebene besteht ebenfalls ein Problem mit der Ressourcennutzung. Es ist wichtig, dass alle Maschinen im Cluster gleichmĂ€ĂŸig ausgelastet sind und das Netzwerk nicht ĂŒberlastet wird. Stellen wir uns eine Situation vor: Der Nutzerverkehr landet bei den eingehenden Load Balancern (haproxy, nginx usw.), die die Anfragen möglichst gleichmĂ€ĂŸig auf eine Reihe verfĂŒgbarer Backends verteilen. Innerhalb der Anwendungsinfrastruktur ist der Dienst, der die erforderliche Schnittstelle bereitstellt, nur die letzte Meile, und er muss eine Reihe anderer Dienste anfragen, um die ursprĂŒngliche Anfrage zu beantworten. Interne Anfragen erfordern ebenfalls Routing und Lastverteilung.
Um Datenströme effektiv zu verwalten, sollte Messaging den Entwicklern eine Schnittstelle zur VerfĂŒgung stellen, um das Routing und die Lastverteilung zu steuern. Dadurch können die Entwickler mithilfe von Mikroservice-Architekturen (Aggregator, Proxy, Chain, Branch usw.) sowohl Standardaufgaben als auch seltene Probleme lösen.

Aus geschĂ€ftlicher Sicht ist Skalierbarkeit eines der Instrumente des Risikomanagements. Das Hauptziel ist es, die Anforderungen der Kunden zu erfĂŒllen und dabei die Hardware optimal zu nutzen:

  • Durch die Steigerung der Hardwareleistung infolge des Fortschritts wird diese nicht aufgrund von SoftwareunzulĂ€nglichkeiten ungenutzt bleiben. Erlang lĂ€sst sich hervorragend vertikal skalieren und kann immer alle CPU-Kerne und den verfĂŒgbaren Speicher auslasten;
  • In Bezug auf Cloud-Umgebungen können wir die Menge der Hardware je nach aktueller oder vorhergesagter Last verwalten und SLA garantieren.

Fehlertoleranz

Betrachten wir zwei Axiome: „AusfĂ€lle sind nicht akzeptabel“ und „AusfĂ€lle werden immer vorkommen“. FĂŒr das GeschĂ€ft bedeutet ein Softwareausfall Geldverlust und, was noch schlimmer ist, einen Reputationsverlust. Indem man zwischen möglichen Verlusten und den Kosten fĂŒr die Entwicklung ausfallsicherer Software balanciert, findet man oft einen Kompromiss.

Kurzfristig spart eine Architektur, die die Ausfallsicherheit berĂŒcksichtigt, Geld beim Kauf fertiger Clusterlösungen. Diese sind teuer und enthalten ebenfalls Fehler.
Langfristig amortisiert sich eine ausfallsichere Architektur vielfach in allen Phasen der Entwicklung.
Die Messaging-Funktion innerhalb des Codes befindet sich noch in der Entwicklungsphase und ermöglicht eine detaillierte Ausarbeitung der Interaktion der Komponenten innerhalb des Systems. Dadurch wird die Aufgabe der Reaktion und des Fehlermanagements vereinfacht, da alle verantwortlichen Komponenten Fehler verarbeiten und das Gesamtsystem weiß, wie es nach einem Fehler automatisch zum Normalzustand zurĂŒckkehren kann, gemĂ€ĂŸ dem Design.

ReaktionsfÀhigkeit

UnabhĂ€ngig von Fehlern muss die Anwendung auf Anfragen reagieren und die SLA erfĂŒllen. Die RealitĂ€t ist, dass die Menschen nicht warten möchten, daher muss sich das GeschĂ€ft anpassen. Von immer mehr Anwendungen wird hohe ReaktionsfĂ€higkeit erwartet.
ReaktionsfĂ€hige Anwendungen arbeiten in einem nahezu Echtzeitmodus. Die Erlang VM funktioniert im Modus der weichen Echtzeit. FĂŒr bestimmte Bereiche wie den Börsenhandel, die Medizin und das Management von Industrieanlagen ist der Modus der harten Echtzeit wichtig.
ReaktionsfĂ€hige Systeme verbessern das Benutzererlebnis und sind fĂŒr Unternehmen nĂŒtzlich.

VorlÀufiges Ergebnis

Bei der Planung dieses Artikels wollte ich meine Erfahrungen beim Erstellen eines Nachrichtenaustausch-Brokers und beim Aufbau komplexer Systeme darauf basierend teilen. Aber der theoretische und motivationale Teil wurde ziemlich umfangreich.
Im zweiten Teil des Artikels werde ich ĂŒber die Feinheiten der Implementierung von Austauschpunkten, Austauschmustern und deren Anwendung sprechen.
Im dritten Teil werden wir allgemeine Fragen zur Organisation von Diensten, zur RoutenfĂŒhrung und zur Lastverteilung betrachten. Wir werden ĂŒber die praktische Seite der Skalierbarkeit und Fehlertoleranz von Systemen sprechen.

Ende des ersten Teils.

Foto @lucabravo.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster