Java >> Java Tutorial >  >> Java

Grundlagen eines verteilten Systemdesigns

Wenn Sie ein Anfänger in der Softwareentwicklung sind, liegt Ihr Fokus auf der Mikroebene. Was passiert in deinem Code? Was passiert in Ihrer Bewerbung? Aber wenn Sie anfangen, auf Systemdesign-Weise zu denken, kann es Ihnen in Ihrer Karriere immens helfen. Systemdesign ist ein großes Thema, aber ich werde die wichtigen Grundlagen des verteilten Systemdesigns behandeln. Das Verständnis des Systemdesigns ist der Schlüssel zum Aufbau eines guten Systems. Daher sollte ein Entwickler unbedingt versuchen, etwas über Systemdesign zu lernen.

Grundlagen eines verteilten Systems

In diesem Beitrag werden wir die folgenden Grundlagen lernen.

  1. Schlüsselmerkmale eines verteilten Systems
  2. Lastenausgleich
  3. Caching
  4. Datenbank
  5. Datenbankindizes
  6. Proxys
  7. CAP-Theorem
  8. Konsistentes Hashing

Schlüsselmerkmale eines verteilten Systems

Skalierbarkeit

  • Skalierbarkeit ist die Fähigkeit des Systems, zu wachsen und eine erhöhte Nachfrage zu bewältigen
  • Horizontale Skalierung – Sie skalieren, indem Sie Ihrem Ressourcenpool weitere Server hinzufügen.
  • Vertikale Skalierung – Sie skalieren, indem Sie einem vorhandenen Server mehr Leistung hinzufügen.

Zuverlässigkeit

  • Es ist die Wahrscheinlichkeit, dass ein System in einem bestimmten Zeitraum ausfällt. Das Ziel ist insbesondere, diese Wahrscheinlichkeit so weit wie möglich zu minimieren.
  • Um Zuverlässigkeit zu erreichen, ist Redundanz erforderlich. Daher ist es mit Kosten verbunden.

Verfügbarkeit

  • Verfügbarkeit ist die Zeit, die ein System betriebsbereit bleibt, um seine erforderliche Funktion in einem bestimmten Zeitraum auszuführen.
  • Wenn ein System zuverlässig ist, ist es verfügbar. Im Vergleich dazu ist es, wenn es verfügbar ist, nicht unbedingt zuverlässig.

Effizienz

  • Latenz – Reaktionszeit
  • Durchsatz – die Anzahl der in einer bestimmten Zeiteinheit gelieferten Artikel

Lastenausgleich

Der Load Balancer leitet den Datenverkehr von Clients zu verschiedenen Servern. Es verfolgt den Status aller Ressourcen, während Anforderungen verteilt werden. Ebenso reduziert ein Load Balancer die Belastung einzelner Server und verhindert, dass ein Anwendungsserver zu einem Single Point of Failure wird. So kann der Load Balancer zwischen Clients und Webservern, zwischen Webservern und einer internen Plattformebene (Anwendungsserver) und zwischen interner Plattform und Datenbankservern hinzugefügt werden.

Um einen Load Balancer für die Verteilung von Anfragen an Server zu organisieren, kann man verschiedene Algorithmen wie Round Robin, Weighted Round Robin, Least Connection Method, Least Response Time, Least Bandwidth, IP Hash verwenden.

Infolgedessen kann der Load Balancer ein Single Point of Failure sein. Um dies zu umgehen, kann ein zweiter Load Balancer mit dem ersten verbunden werden, um einen Cluster zu bilden.

Caching

Caches nutzen das Prinzip der Lokalität von Referenzen. Ein Cache ist wie ein Kurzzeitgedächtnis. Das heißt, es ist schneller mit begrenztem Platz. Darüber hinaus können Caches auf allen Ebenen der Architektur vorhanden sein, befinden sich jedoch häufig auf der Ebene, die dem Frontend am nächsten liegt.

Anwendungsserver-Cache

Das Platzieren eines Caches direkt auf einem Anforderungsschichtknoten ermöglicht die lokale Speicherung von Antwortdaten.

Inhaltsverteilungsnetzwerk

CDNs sind eine Art Cache, der für Websites ins Spiel kommt, die große Mengen statischer Daten bereitstellen.

Cache-Ungültigkeitserklärung

  1. Cache durchschreiben – Daten gleichzeitig in den Cache und die entsprechende Datenbank schreiben.
  2. Cache umschreiben – Schreiben Sie die Daten in den permanenten Speicher und umgehen Sie den Cache. Daher führen kürzlich geschriebene Daten zu einem Cache-Mißerfolg.
  3. Write-Back-Cache – Schreiben Sie die Daten allein in den Cache und synchronisieren Sie sie nach einem bestimmten Intervall mit dem Back-End-Speicher.

Richtlinien zur Cache-Entfernung

  1. Zuerst rein, zuerst raus
  2. Last-in-First-out
  3. Am längsten verwendet
  4. Am seltensten verwendet
  5. Zuletzt verwendet
  6. Zufälliger Ersatz

Datenbank

Sie benötigen ein Speichersystem für Ihre Daten. Offensichtlich sind Datenbanken die häufigste Lösung. Dementsprechend gibt es zwei Arten von Datenbanken. Grundsätzlich relationale Datenbanken und nicht-relationale Datenbanken.

Wenn Ihre Daten strukturiert sind, können Sie eine relationale Datenbank verwenden. Außerdem bieten relationale Datenbanken eine strukturierte Abfragesprache (SQL) zum Abfragen der Datenbanken.

Nicht-relationale Datenbanken sind unstrukturiert und verteilt.

SQL

  1. Daten in Zeilen und Spalten speichern
  2. Jede Zeile enthält Informationen zu einer Entität
  3. MySQL, MS SQL, Oracle, PostgreSQL, SQLite sind einige Beispiele für relationale Datenbanken.
  4. SQL-Datenbanken verwenden SQL für Abfragen.
  5. Vertikal skalierbar, aber teuer.
  6. Horizontal skalierbarer, aber zeitaufwändiger Prozess.
  7. SQL-Datenbanken sind ACID-konform (Atomicity, Consistency, Isolation, and Durability).
  8. Wenn Sie ACID-Konformität und strukturierte Daten benötigen, verwenden Sie SQL-Datenbanken.

NoSQL

  1. Schlüsselwertspeicher – Redis, Dynamo DB
  2. Dokumentendatenbanken – Couch DB und MongoDB
  3. Wide-Column-Datenbanken – Columnar-Datenbanken eignen sich am besten für die Analyse großer Datensätze – Cassandra und HBase
  4. Grafikdatenbanken – gespeicherte und miteinander verknüpfte Daten im Grafikformat. Anschließend werden Daten mit Knoten (Entitäten), Eigenschaften (Informationen über Entitäten) und Linien (die Verbindung zwischen Entitäten) gespeichert – Neo4J und InfiniteGraph
  5. Schemata sind dynamisch. Spalten können spontan hinzugefügt werden und jede Zeile muss nicht Daten für jede Spalte enthalten.
  6. Verwenden Sie UnQL (Unstructured Query Language).
  7. Einfach horizontal skalierbar.
  8. Nicht ACID-konform
  9. Ermöglicht eine schnelle Entwicklung, speichert eine große Datenmenge ohne Struktur.

Datenbankindizes

Wenn die Suchleistung der Datenbank schlecht war, erstellen wir Indizes, um diese Leistung zu verbessern. Von nun an besteht das Ziel beim Erstellen eines Indexes für eine bestimmte Tabelle in einer Datenbank darin, das Durchsuchen der Tabelle zu beschleunigen.

Indizes verbessern die Leseleistung, verringern jedoch die Schreibleistung. Folglich erhöhen Indizes auch die Speichernutzung. Wenn Ihre Datenbank leseintensiv ist, sind Indizes eine gute Strategie. Fügen Sie keine Indizes hinzu, wenn die Datenbank schreibintensiv ist.

Proxies

Proxy-Server ist eine Software oder Hardware, die als Vermittler für Anfragen von Clients fungiert, die Ressourcen von anderen Servern suchen. Dementsprechend werden Proxys verwendet, um Anfragen zu filtern, Anfragen zu protokollieren und manchmal die Anfragen umzuwandeln. Darüber hinaus kann der Proxy-Server-Cache viele Anfragen bedienen.

Proxy öffnen

Ein offener Proxy-Server ist für jeden Internetnutzer zugänglich. Dadurch kann jeder Internetnutzer den Proxy zur Weiterleitung der Anfragen nutzen.

Reverse-Proxy

Ein Reverse-Proxy ruft Ressourcen im Auftrag des Clients von einem oder mehreren Servern ab. Folglich werden diese Ressourcen dann an den Client zurückgegeben.

CAP-Theorem

In keinem verteilten System können Sie alle drei Konsistenz erreichen , Verfügbarkeit und Partitionstoleranz .

Das CAP-Theorem besagt, dass Sie nur zwei dieser drei Optionen erhalten können.

Konsistenz – Alle Knoten sehen gleichzeitig dieselben Daten.

Verfügbarkeit – Jede Anfrage erhält eine Antwort auf Erfolg/Fehler.

Partitionstoleranz – Ein partitionstolerantes System kann jede Menge Netzwerkausfälle tolerieren, die nicht zu einem Ausfall des gesamten Netzwerks führen. Insbesondere die knotenübergreifende Datenreplikation trägt dazu bei, das System am Laufen zu halten.

Konsistentes Hashing

Konsistentes Hashing ist ein Mechanismus, der es ermöglicht, die Daten so über einen Cluster zu verteilen, dass die Reorganisation minimiert wird, wenn Knoten hinzugefügt oder entfernt werden. Wenn Sie also konsistentes Hashing verwenden, führt die Größenänderung der Hash-Tabelle zur Neuzuordnung von k/n Schlüsseln.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass die Kenntnis dieser Grundlagen über ein verteiltes System einem Entwickler beim Schreiben von Code oder beim Entwerfen eines Systems immens helfen kann. Studieren Sie auf jeden Fall diese Grundlagen, aber Sie sollten auch etwas über domänengetriebenes Design lernen. Wenn Ihnen dieser Beitrag trotzdem gefallen hat, können Sie meinen Blog hier abonnieren.

Referenzen

  1. Systemdesign-Grundlage – Systemdesign-Grundlage
  2. Systemdesign – Systemdesign

Java-Tag