Designprinzipien – Moderne Anwendungsentwicklung

Best Practices für Anwendungsarchitekturen.

 

Alle öffnen Alle schließen

    • Verwenden Sie nach Möglichkeit Low-Code-Plattformen und nutzen Sie ausgereifte Programmiersprachen und schlanke Frameworks, wenn dies nicht möglich ist

      Überblick
      Die Programmiersprachen und Frameworks, die Sie zum Erstellen Ihrer App verwenden, spielen im Laufe der Zeit eine entscheidende Rolle bei der erfolgreichen Bereitstellung und Wartung Ihrer App. Entscheidungen zu Sprache und Framework haben langfristige Konsequenzen für die Skalierung Ihres Unternehmens, den Betrieb Ihrer App und die Bereitstellung hochwertiger Funktionen für Ihre Kunden. Änderungen an Sprache oder Framework sind in der Regel teuer. Die Unterstützung paralleler Ökosysteme mehrerer Sprachen und Frameworks erhöht die Komplexität und reduziert die Agilität.

      Die Auswahl von Sprache und Framework wirkt sich auf eine Reihe von Faktoren aus, darunter Bereitstellungsgeschwindigkeit, Stabilität und Stärke des bestehenden Ökosystems, Einsatzbereitschaft und Produktionsleistung. Verwenden Sie nach Möglichkeit Low-Code-Plattformen, damit Sie sich auf die Lösung Ihrer Geschäftsprobleme konzentrieren können, anstatt den Komplikationen der traditionellen Entwicklung zu begegnen. Wenn die Anforderungen Ihrer App komplexer sind, wählen Sie ausgereifte Sprachen und schlanke Frameworks aus.

      Grundlegende Details
      Mit Low-Code-Plattformen können Sie Unternehmensanwendungen schneller erstellen, testen und bereitstellen als mit herkömmlicher manueller Codierung. Diese Plattformen eignen sich gut für die Erstellung angepasster Apps in Zusammenarbeit mit geschäftlichen Stakeholdern sowie für Datenberichts- und Analyse-Apps. Mithilfe von Low-Code-Plattformen können Sie außerdem SaaS-Apps erweitern und Legacy-Anwendungen modernisieren. Mit diesem Ansatz können Sie Komplikationen vermeiden, wenn Sie neue Leistungsmerkmale wie Datenvisualisierung, Datenerfassung, Datenanalysen, Sicherheit, Barrierefreiheit, Performance und Globalisierung hinzufügen wollen. Eine Low-Code-Plattform verringert diese Komplikationen erheblich und reduziert die von Ihnen verwaltete Codemenge drastisch.

      Wenn Ihre App jedoch anspruchsvollere Anforderungen hat, wählen Sie eine ausgereifte Programmiersprache in Verbindung mit einem schlanken Framework. Wählen Sie bei der Auswahl einer Programmiersprache eine Sprache aus, die Ihnen die folgenden wichtigen Vorteile bietet:

      • Sicherheit
      • Hohe Performance und Effizienz
      • Tool-Support
      • Umfangreiche, aktuelle Dokumentation
      • Ein Ökosystem aus Bibliotheken
      • Compliance mit einer Testsuite oder Referenzimplementierung
      • Eine starke Community

      Neuere Sprachen haben in der Regel eine höhere Änderungsrate bei ihrem Sprachdesign und den entsprechenden Ökosystemen und Bibliotheken. Eine höhere Änderungsrate bedeutet, dass es schwieriger ist, Risiken zu bewerten und teurer, später Änderungen vorzunehmen.

      Wählen Sie bei der Auswahl eines Frameworks ein Framework aus, das Open Source ist. Open Source-Frameworks werden ständig Peer Reviews unterzogen. Das bedeutet, dass die Features dem nahe kommen, was die meisten Entwickler wollen, weil sie zur Erstellung und Wartung des Frameworks beitragen. Bugs werden schnell gefunden und behoben. Es ist auch sinnvoll, dass Sie ein schlankes Framework auswählen, das nur wenige Ressourcen wie CPU, Arbeitsspeicher, Netzwerkbandbreite oder Datei-Handles verbraucht.

      Verwenden Sie ein App-Framework, um den Aufgabenfokus (Geschäftslogik über Textbausteine und Gerüst) mit Flexibilität (zur Unterstützung aktueller und zukünftiger Featureanforderungen) aufeinander abzustimmen. Führen Sie ein Framework ein, das benutzerfreundliche, vernünftige und nicht umstrittene Standardwerte für allgemeine Features wie Logging, Telemetrie, Sicherheit, Konfiguration sowie für allgemeine Muster bereitstellt, wie das Erstellen von REST-APIs.

      Empfehlungen von Oracle
      Oracle APEX ist eine Low-Code-Plattform, die Ihnen hochrangige Komponenten wie Formulare, Diagramme und UI-Widgets bereitstellt. APEX stellt außerdem allgemeine Entwurfsmuster über eine intuitive grafische Entwicklungsumgebung bereit. Mit APEX entwickelte Apps können über SQL auf lokale Daten zugreifen und mit REST-APIs in externe Services integriert werden. Darüber hinaus können Sie die in APEX entwickelten Funktionen als REST-APIs für die externe Nutzung veröffentlichen.

      Falls eine Low-Code-Plattform für Ihre App ungeeignet ist, ist es sinnvoll, Java als Programmiersprache zu verwenden. Java bietet eine stabile und umfassende Palette an Funktionen für die meisten gängigen Anwendungsfälle sowie ein gesundes Ökosystem aus vertrauenswürdigen und stabilen Bibliotheken und Frameworks zur Entwicklung moderner Apps. Der Fokus von Java auf Einfachheit und Lesbarkeit sowie seine hervorragende Unterstützung für Entwicklertools – einschließlich statischer Analysetools und Test-Frameworks – reduzieren die Wartungskosten für Software und das Risiko von Bugs in Produktionsanwendungen.

      Verwenden Sie GraalVM, um Ihre App zu entwickeln und auszuführen. GraalVM ist eine JDK-Distribution, die durch dynamische Laufzeitoptimierung, häufiges und proaktives Patching von Sicherheitslücken und kostengünstige Leistungsanalysen und Diagnosetools wie Java Flight Recorder die Stabilität von Java mit erstklassiger Performance verbindet.

      Erstellen Sie Ihre App mit einem API-First-Ansatz, der entweder Graal Development Kit for Micronaut oder das Helidon-Framework verwendet. Beide Ansätze bieten ein Gerüst, mit dem die Zeit für die Bereitstellung Ihrer App reduziert wird, sowie benutzerfreundliche Muster für gängige Anwendungsfälle, wie REST-APIs.Dieses basiert auf einer Reihe einfacher, nicht kontroverser Framework-Entscheidungen für häufige Aktivitäten, wie Logging, Telemetrie und Abspeichern. Beide Ansätze unterstützen außerdem leistungsstarke Services durch eine Unterstützung blockierungsfreier E/A mit idiomatischen reaktiven APIs und eine geringe Latenz durch die Unterstützung leistungsstarker Netzwerkbibliotheken.

      • Entscheiden Sie sich für Helidon MicroProfile bei Anwendungen, die eng mit dem Java-Ökosystem des Unternehmens abgestimmt sind, wie beispielsweise CDI, JAX-RS oder JPA. Die standardmäßige Unterstützung von Helidon für moderne Java-Unternehmensmuster durch MicroProfile vereinfacht das Portieren vorhandener Java EE-Apps in Microservices.
      • Entscheiden Sie sich für Graal Development Kit for Micronaut (GDK), Helidon SE oder Helidon SE bei Apps, die nicht vom vorhandenen Java-Ökosystem des Unternehmens abhängig sind. Das Kompilierungszeit-Anwendungsgerüst von GDK erhöht die App-Performance zur Laufzeit und ermöglicht die Überprüfung auf Framework-Ebene, wodurch viele Sicherheits- und Qualitätsprobleme im Zusammenhang mit der Reflexion und Laufzeitkonfiguration beseitigt werden können.

      Sowohl Helidon als auch GDK unterstützen das native GraalVM-Image, mit dem Sie speichereffiziente und kompakte Apps erstellen können.

    • Erstellen Sie Ihre App als Suite von Services, die über REST-APIs kommunizieren

      Überblick
      Teilen Sie die Funktionen oder Aufgaben Ihrer App in unabhängige, lose gekoppelte Services auf, die in Verbindung miteinander funktionieren. Entwerfen Sie jeden Service mit einem begrenzten Funktionsumfang, der auf ein Feature oder eine Funktion fokussiert ist. Im Vergleich zu einer traditionellen monolithischen Architektur verbessert dieser Ansatz die App-Wartung, die Funktionsentwicklung, Tests, das Deployment und die Skalierbarkeit.

      Nutzen Sie einen REST-API-Designansatz, um klare und verständliche Schnittstellen für die Kommunikation mit und zwischen Services bereitzustellen. Ein API-Vertrag bietet den erforderlichen Mechanismus für die Zusammenarbeit von Teams und die Nutzung von Funktionen, ohne auf die internen Details der Implementierung eines Service angewiesen zu sein. Beispiel: Ein Service kann vollständig im Besitz eines Entwicklungsteams sein, das sich bei dessen Implementierung frei verbessern kann, ohne Codeabhängigkeiten mit anderen Entwicklungsteams koordinieren zu müssen.

      Grundlegende Informationen
      Beginnen Sie mit einem Contract-First-Ansatz, indem Sie die REST-API eines Service angeben. Danach erstellen Sie einen Prototyp für eine Implementierung der API, damit Ihre Stakeholder, zum Beispiel die Teams, die sie verwenden, diese testen können. Wenn sich alle zu den Details der API einig sind, können unabhängige Teams parallel arbeiten, um den Service und andere Services zu implementieren, die sie nutzen.

      Definieren Sie Policendurchsetzungen für Sicherheits- und Servicevereinbarungen frühzeitig im Produktlebenszyklus, um sicherzustellen, dass alle Aspekte des Servicevertrags eindeutig sind.

      Behandeln Sie die API-Spezifikation als Code, und verwalten Sie sie in einem Versionskontrollsystem zusammen mit Ihrem Quellcode und Ihren Policy-Konfigurationen.

      Empfehlungen von Oracle
      Geben Sie Ihre API im implementierungsunabhängigen Format OpenAPI an, und speichern Sie sie in einem Repository, das von Oracle Cloud Infrastructure (OCI) DevOps bereitgestellt wird.

      Implementieren Sie Ihre Services mit einem schlanken Open Source-Ansatz, wie Graal Development Kit for Micronaut oder Helidon.

      Stellen Sie Ihre Services auf serverlosen Plattformen wie OCI Kubernetes Engine oder Oracle Functions bereit, um eine einfache Bereitstellung, Skalierbarkeit und Kosteneffizienz zu gewährleisten.

      Mit Oracle Cloud Infrastructure API Gateway können Sie geschützte und gesteuerte private oder öffentliche Endpunkte aus der API-Spezifikation erstellen.

      Verwenden Sie Oracle Cloud Infrastructure Service Mesh, um die Kommunikation zwischen Services, die in Ihrem OCI Kubernetes Engine-Cluster gehostet werden, zu vereinfachen und zu sichern. Außerdem ermöglicht Ihnen OCI Service Mesh, den gesamten Netzwerktraffic zwischen Ihren Services über die Kennzahlen und Logs zu beobachten, die von der Proxykomponente ausgegeben werden, die wiederum als Sidecar auf Anwendungspods ausgeführt wird.

    • Verpacken Sie Ihre App als Container und stellen Sie sie bereit

      Überblick
      Ein Container verpackt Code und seine Abhängigkeiten als eine Einheit, sodass eine App schnell und zuverlässig in mehreren Computing-Umgebungen ausgeführt wird. Ein Containerimage ist eine Datei, die bei der Ausführung einen Container in einer Computing-Umgebung erstellt und startet.

      Im Vergleich zu herkömmlichen virtuellen Maschinen sind Container kleiner, benötigen weniger Ressourcen und haben schnellere Startzeiten. Sie sind auch plattformunabhängig und können überall Apps ausführen. Um diese Vorteile zu nutzen, zerlegen Sie Ihre App in Services, die jeweils eine diskrete Geschäftsfunktion ausführen und jeden Service als Container verpacken. Bei Legacy-Apps ersetzen Sie jede vorhandene Funktion in Ihrer App schrittweise durch einen Container-Service, bis die gesamte App umgestaltet ist.

      Grundlegende Details
      Das Verpacken von Anwendungscode und Abhängigkeiten in eine einzelne ausführbare Einheit (ein Containerimage) bedeutet, dass ein Container extrem portierbar ist. Indem Container diese Portabilität mit Infrastrukturabstraktion kombinieren, sorgen sie für betriebliche Konsistenz in Ihrer App. Egal, ob Ihre App On-Premise auf einem physischen Server oder in der Cloud auf einer virtuellen Maschine ausgeführt wird, es werden jedes Mal dieselben Ergebnisse erzielt.

      Durch diese konsistente Reproduzierbarkeit und Vorhersagbarkeit vereinfachen Container DevOps-Prozesse und ermöglichen es Ihren Entwicklungsteams, Ihre Apps schneller bereitzustellen. Durch die Isolierung auf Prozessebene und den häufigen Austausch von Containern werden die Prozesse im Zusammenhang mit der Behebung von Software-Sicherheitslücken vereinfacht und beschleunigt. Durch die Nutzung von Apps in modulare Container-Services sind sie zudem sehr robust. Ein Fehler oder Ausfall in einem einzelnen Service bringt die gesamte App nicht zu Fall, und Sie können jeden Service unabhängig vom Rest der App aktualisieren oder patchen.

      Im Gegensatz zu einer virtuellen Maschine verfügt ein Container nicht über ein eigenes Betriebssystem. Stattdessen wird das Betriebssystem des Hosts gemeinsam verwendet. Daher sind Container kleiner und können schneller als virtuelle Maschinen gestartet werden. Die meisten Containerimages sind mehrere zehn MB groß im Vergleich zu virtuellen Maschinen, die mehrere Gigabyte sein können, und ihre Startzeiten liegen in Sekunden statt der Minuten, die zum Starten virtueller Maschinen benötigt werden.

      Die beste Möglichkeit, Ihre App mit modularisierten Services in Containern auszuführen und zu skalieren, ist die Bereitstellung eines Service pro Container. Dieser Ansatz isoliert Services voneinander, wodurch Ausfallzeiten vermieden und die unabhängige Skalierung für jeden Service ermöglicht wird.

      Auch wenn Sie Container manuell bereitstellen können, ist es besser, eine Containerverwaltungssoftware zu verwenden, die in Ihre Tools für kontinuierliche Integration und kontinuierliches Deployment integriert ist.

      Empfehlungen von Oracle
      Verwenden Sie Oracle Cloud Infrastructure Registry (Container Registry) zum Speichern Ihrer Container-Images und Oracle Cloud Infrastructure Kubernetes Engine zum Ausführen und Verwalten Ihrer Container. Diese vollständig verwalteten Services sind eng in OCI-Plattformfunktionen integriert, in allen Oracle Cloud-Regionen verfügbar und erfüllen gesetzliche Standards wie PCI, ISO, SOC, HIPAA und FedRAMP.

      Zusätzlich zum Speichern von Containerimages in Container Registry können Sie Manifestlisten (auch als Images mit mehreren Architekturen bezeichnet) speichern, um mehrere Architekturen zu unterstützen, wie ARM und AMD64. Um potenzielle Sicherheitslücken zu identifizieren und zu mindern, aktivieren Sie das Scannen von Images auf allen in Container Registry hochgeladenen Images. Sie sollten auch Ihre Container-Images signieren, um sicherzugehen, dass nur autorisierte und vertrauenswürdige Images in OKE bereitgestellt werden.

    • Automatisierung von Erstellung, Tests und Bereitstellung

      Überblick
      Kontinuierliche Integration (CI) und kontinuierliches Deployment (CD) sind eine Reihe von Tools und Verfahren, mit denen Entwicklungsteams Codeänderungen häufig und zuverlässig bereitstellen können. Zu der CI/CD-Best Practice gehören Codeprüfungen, Richtlinien für Einheitentests, Integrationstests, Code-Check-ins, Einreichen von Tickets und die Bereitstellung von Anwendungen in Entwicklungs- und Testumgebungen.

      Die kontinuierliche Integration beschreibt eine Praktik, in der Entwickler ihre Codeänderungen häufig in die Hauptverzweigung eines gemeinsam genutzten Repositorys integrieren. Die Änderungen der Entwickler werden validiert, indem ein Build erstellt und dann automatisierte Tests für den Build ausgeführt werden. Die Tests stellen sicher, dass Ihre App nicht unterbrochen wird, wenn neue Änderungen in die Hauptverzweigung integriert werden.

      Die Vorteile der kontinuierlichen Integration umfassen:

      • Weniger Bugs werden in die Produktion versendet, da automatische Tests Regressionsausfälle frühzeitig erkennen
      • Integrationsprobleme werden frühzeitig gelöst, sodass der Erstellungsprozess einfacher wird
      • Fehler werden schneller und einfacher erkannt und gefunden (da jede Änderung in der Regel klein ist)

      Die kontinuierliche Bereitstellung ist ein Schritt über die kontinuierliche Integration hinaus. Nach dem Bestehen der entsprechenden Tests wird ein Build automatisch an eine Test- und/oder Produktionsumgebung geliefert. Ziel der kontinuierlichen Bereitstellung ist es, immer eine Codebasis zu haben, die für das Deployment in einer Kundenproduktionsumgebung bereit ist.

      Weitere Vorteile der kontinuierlichen Bereitstellung sind:

      • Die Automatisierung komplexer Deployments bedeutet, dass Ihr Team weniger Zeit für die Vorbereitung auf ein Release benötigt
      • Häufigere Releases und die Beschleunigung der Feedbackschleife Ihrer Kunden
      • Schnellere Iteration, da weniger Druck auf Entscheidungen bei kleinen Änderungen besteht

      Das kontinuierliche Deployment geht einen Schritt weiter als die kontinuierliche Bereitstellung. Jede Änderung, die alle Tests besteht, wird automatisch in der Kundenproduktionsumgebung bereitgestellt. Es gibt keine menschliche Intervention. Nur ein nicht erfolgreicher Test kann verhindern, dass eine neue Änderung für die Produktion bereitgestellt wird. Ohne menschliches Eingreifen ist das kontinuierliche Deployment stark auf eine gut konzipierte Testautomatisierung angewiesen.

      Weitere Vorteile eines kontinuierlichen Deployments sind:

      • Höhere Entwicklungsgeschwindigkeit, da für Releases keine Unterbrechung erforderlich ist
      • Höhere Kundenzufriedenheit durch verbesserte Qualität und kontinuierliche Verbesserungen

      CI/CD bietet Best Practice zum Speichern, Integrieren, Deployment und Verwalten von Code, um zu automatisieren, wie Sie Ihre Apps erstellen. Diese Best Practice umfasst:

      • Arbeiten Sie nach dem „shift-left“-Paradigma und konzentrieren Sie sich darauf, Probleme so früh wie möglich im Softwareentwicklungszyklus (SDLC) zu erkennen und zu vermeiden. Überwachen Sie beispielsweise die Drittanbieterabhängigkeiten Ihrer App auf Sicherheitslücken während der kontinuierlichen Integration.
      • Verwenden Sie ein Git-basiertes Code-Repository, um alle Ihre Code-Assets zu speichern, und einen unveränderlichen Artefaktdienst, um abgeleitete Assets zu speichern.
      • Um eine kontinuierliche Integration zu implementieren, führen Sie den gesamten Code mindestens einmal täglich in eine Verzweigung "Freigabekandidat" zusammen. Stellen Sie beim Zusammenführen von Code in dieser Verzweigung sicher, dass Builds automatisch ausgelöst werden. Führen Sie als Teil der Build-Pipeline alle Einheitentests aus, und beheben Sie alle Pipeline-Ausfälle sofort, bevor Sie eine weitere Entwicklung in der Release-Kandidatenverzweigung durchführen. Verwenden Sie Sicherheits-Scans für den Code, um Sicherheitslücken zu erkennen. Speichern Sie kein Artefakt mit einem Sicherheitslückenproblem. Beheben Sie alle Sicherheitslücken in der Release-Kandidatenverzweigung, bevor Sie die Entwicklung fortsetzen.
      • Um ein kontinuierliches Deployment zu implementieren, stellen Sie Release-Kandidaten automatisch in eine Testumgebung bereit oder verwenden kanarische Deployments. Wenn Test-Deployments erfolgreich sind, werden sie automatisch in die vollständige Produktion hochgestuft. Wenn Test-Deployments nicht erfolgreich sind, beheben Sie die Probleme sofort, bevor Sie die weitere Entwicklung in der Release-Kandidatenverzweigung durchführen. Verwenden Sie Sicherheitsfunktionen als Teil von Deployments, um zu verhindern, dass nicht autorisierte und anfällige Artefakte in der Infrastruktur bereitgestellt werden.
      • Verwenden Sie in der Produktionsumgebung Überwachungstools, um den Zustand der bereitgestellten Anwendungen zu bewerten und Sicherheitslücken nach dem Deployment zu erkennen. Wenn Probleme erkannt werden, implementieren Sie ein automatisches Rollback zur vorherigen Version. Führen Sie Sicherheitsprüfungen in der Post-Deployment-Umgebung durch, und beheben Sie alle aufgetretenen Probleme sofort.

      Empfehlungen von Oracle
      Verwenden Sie den DevOps-Service, um das Deployment Ihrer Cloud-nativen Apps zu automatisieren. Speichern Sie zuerst den Code in einem DevOps-Code-Repository, und erstellen Sie eine Releaseverzweigung. Arbeiten Sie in kleinen Schritten, um Änderungen an der Release-Verzweigung vorzunehmen und Probleme in der Verzweigung täglich abzustimmen, um deren Stabilität zu gewährleisten. Verwenden Sie dann die Triggerfunktionalität im Code-Repository, um automatisch eine DevOps-Build-Pipeline zu starten.

      Verwenden Sie eine einzelne DevOps-Build-Pipeline, um alle Artefakte zu erstellen, die mit dem Code-Repository verknüpft sind. Wenn der Build nicht erfolgreich verläuft, konfigurieren Sie die Build-Pipeline so, dass sie auf Genehmigung wartet, bevor sie abgeschlossen wird. Die Genehmigungsanforderung muss an den Benutzer weitergeleitet werden, der den Build ausgelöst hat. Sie sollten das Problem mit einem neuen Code-Commit lösen und anschließend den Abschluss des Builds genehmigen. Für erfolgreiche Builds konfigurieren Sie die Erstellungspipeline, um die Artefakte automatisch an den Oracle Cloud Infrastructure Artifacts Registry-Service zu übermitteln und automatisch eine DevOps-Deployment-Pipeline auszulösen.

      Fügen Sie Application Dependency Management hinzu, um Sicherheitslücken (CVEs) in Anwendungsabhängigkeiten während einer Build-Phase in einer OCI-DevOps-Build-Pipeline zu erkennen. Auf diese Weise können Sie potenzielle CVEs erkennen und beseitigen, sobald sie bekannt werden.

      Mit Resource Manager können Sie alle Infrastrukturumgebungen in einer Zone mit maximaler Sicherheit erstellen, um automatisch von der Deployment-Sicherheit profitieren zu können. Mit Resource Manager können Sie die Infrastruktur als Code verwenden, um die einheitliche Infrastrukturerstellung in allen Regionen zu automatisieren. Anschließend können Sie die DevOps-Deployment-Pipeline so konfigurieren, dass sie immer in den Ressourcen bereitgestellt wird, die Sie in der Sicherheitszone erstellt haben.

      Erstellen Sie eine einzelne DevOps-Deployment-Pipeline, die alle Artefakte bereitstellt, die aus einer einzelnen Build-Pipeline erstellt wurden. Organisieren Sie Deployment-Umgebungen, wie OCI-Region, Availability-Domain und Faultdomain. Konfigurieren Sie die Pipeline mit einer kanarischen, rollenden oder Blue/Green Deployment-Strategie. Konfigurieren Sie sie auch so, dass sie Tests automatisch auslöst. Aktivieren Sie OCI-Überwachung und Application Performance Monitoring in Ihrer Anwendung und Infrastruktur, um Probleme zu erkennen.

      Wenn keine Probleme erkannt und Tests erfolgreich abgeschlossen wurden, konfigurieren Sie die Deployment-Pipeline so, dass die Artefakte automatisch in der nächsten Umgebung der Deployment-Strategie bereitgestellt werden, bis die Artefakte vollständig in allen Produktionsumgebungen bereitgestellt sind. Konfigurieren Sie die Pipeline beim Deployment in der Produktionsumgebung so, dass sie in allen Faultdomains in einer Availability-Domain nacheinander bereitgestellt wird. Sorgen Sie für die Bereitstellung an jede Availability-Domain in einer Region nacheinander und dann jeweils nacheinander in jeder Region. Verwenden Sie OCI Monitoring und Application Performance Monitoring weiter in der Anwendung und Infrastruktur, um Probleme schnell zu erkennen. Richten Sie Alerts ein, und wenn Schlüsselmetriken während des Deployments plötzlich gelöscht werden, verläuft das Deployment automatisch nicht erfolgreich, und lösen Sie ein Rollback auf die vorherige Version aus.

    • Nutzen Sie verwaltete Services, um Komplexität bei der App-Entwicklung und beim Betrieb zu beseitigen

      Überblick
      Ein verwalteter Service stellt spezifische Funktionen bereit, ohne dass Sie Wartungsaufgaben im Zusammenhang mit der Optimierung von Performance, Verfügbarkeit, Skalierung, Sicherheit oder Upgrades ausführen müssen. Mit einem verwalteten Service können Sie sich auf die Bereitstellung von Features für Ihre Kunden konzentrieren, anstatt sich um die Komplexität von Vorgängen zu sorgen.

      Ein verwalteter OCI-Service stellt eine skalierbare und sichere Komponente für die Cloud-native Entwicklung bereit. Verwenden Sie verwaltete Services, um Ihre App zu entwickeln und auszuführen und die Daten zu speichern. Sie erhalten erstklassige Lösungen, ohne über Fachwissen in jeder Domain verfügen zu müssen, um Ihre App zu erstellen und zu betreiben.

      Grundlegende Details
      Mit verwalteten Services können Sie hoch verfügbare, skalierbare, agile und leistungsstarke Anwendungen mit Sicherheit, Compliance und Resilienz erstellen.

      Verwaltete Services abstrahieren die Komplexität der zugrundeliegenden Komponenten Ihrer App, sodass Sie Daten einfach speichern und abrufen oder Ihre App erstellen und ausführen können. Die Services können in Toolsets integriert werden und bieten automatisiertes Erstellen, Testen und Deployment Ihrer App. Verwaltete Services verbessern die Produktivität und reduzieren die Markteinführungszeit.

      Verwaltete Services zentralisieren und automatisieren verschiedene Aufgaben des Infrastrukturmanagements, um menschliche Fehler und Fachkenntnisse zu vermeiden. Die zugrundeliegende Infrastruktur wird aktuell und sicher gehalten, und mit den Services können Sie Änderungen oder Zugriff überwachen und verfolgen, was die Vertraulichkeit und Integrität Ihrer App und Daten gewährleistet.

      Verwaltete Services sind hochverfügbar und skalierbar, erfüllen die Anforderungen Ihrer App und Sie bezahlen nur für das, was Sie auch nutzen. Sie können klein anfangen und skalieren, ohne dass die Performance oder Zuverlässigkeit beeinträchtigt wird.

      Empfehlungen von Oracle
      Wir empfehlen die folgenden Cloud-Services:

      • Oracle Autonomous Database zur Verwaltung von Daten für Data Warehousing oder Transaktionsverarbeitung. Autonomous Database bietet In-Memory-, NoSQL- und SQL-Datenbanken mit einem autonomen Vorteil, um den Verwaltungsaufwand zu verringern.
      • Oracle Cloud Infrastructure Kubernetes Enginezum Erstellen, Ausführen und Verwalten Ihrer Container.
      • Mit Oracle Functions können Sie Anwendungen erstellen, ausführen und skalieren, die für kurze Dauer sicher und isoliert ausgeführt werden, ohne Infrastruktur zu verwalten.
      • Mit Oracle API Gateway können Sie geschützte und gesteuerte private oder öffentliche Endpunkte aus Ihren API-Spezifikationen erstellen.
      • Mit Oracle Cloud Infrastructure Object Storage können Sie eine unbegrenzte Menge unstrukturierter Daten eines beliebigen Inhaltstyps sicher speichern oder abrufen. Es lässt sich problemlos skalieren, ohne dass es zu einer Beeinträchtigung der Performance oder Servicezuverlässigkeit kommt.
      • Oracle Cloud Observability and Management Platform-Services können in alle oben genannten Services integriert werden, um einen Einblick in Logs, Metriken und Ereignisse zu ermöglichen.
      • Oracle Application Express (APEX) ermöglicht das schnelle Erstellen von modernen, datengesteuerten Low-Code-Anwendungen. APEX kann die Verfügbarkeit und Skalierbarkeit maximieren, um die sich ändernden Anforderungen Ihrer Low-Code-App zu erfüllen. Sie ermöglicht automatisiertes Management, konsistent hohe Performance, automatische Skalierung und einfache Administration.

      Diese Services sind hochverfügbar, leistungsstark und elastisch. Die zugrundeliegende Infrastruktur wird verwaltet und gepatcht, um sicherzustellen, dass Ihre App sicher bleibt.

    • Die App-Ebene zustandslos halten

      Überblick
      Der Status einer App kann aus vielen Elementen bestehen, darunter Datencaches, Voreinstellungen eines Benutzers, Personalisierung, zwischen Services ausgetauschte Nachrichten, die Position in einem mehrstufigen Workflow, App-Deployment, Laufzeitkonfiguration und eine Benutzersession (z.B. die Seite, die ein Benutzer zuletzt besucht hat, oder die Größe und Artikel im Warenkorb eines Benutzers). Wenn der Status Ihrer App verloren geht, kann dies zu Datenverlusten, einer Fehlfunktion in Ihrer App, einer suboptimalen Benutzererfahrung und manchmal zu einem vollständigen Ausfall der App führen.

      Wenn Sie den Status Ihrer App in lokalen Dateisystemen oder im Arbeitsspeicher eines einzelnen Hosts speichern, kann er verloren gehen, wenn Ihre App Ausfälle aufweist, wie Neustarts oder lokalisierte Datenträgerausfälle. Speichern Sie stattdessen den Status in externen Persistenzspeichern. Verwenden Sie so wenige Persistenzspeicher wie möglich, im Idealfall nur einen, um die Datenkonsistenz zu gewährleisten.

      Grundlegende Details
      Die Elemente des Status einer App werden in der Regel als mehrere Artefakte in verschiedenen Formaten gespeichert, wie serialisierte Objekte, JSON- oder XML-Dokumente oder Textdateien. Wenn diese Elemente in mehreren Persistenzspeichern gespeichert werden, wie z.B. in externen Dateisystemen, Nachrichtenspeichern, Objektspeichern, mehreren Datenbanken oder in einem elastischem Blockspeicher, können die verschiedenen Datenspeicher nicht mehr synchronisiert werden und dies kann zu Inkonsistenzen im Status führen. Eine App muss auch Transaktionen, Joins und Idempotenz implementieren, um die Datenkonsistenz sicherzustellen, wenn der Status als Einheit aktualisiert werden muss.

      Wenn Elemente des Status einer App in mehreren Speichern verteilt werden, erhöhen sich die Chancen auf Sicherheitslücken. Lifecycle-Vorgänge – wie das Hinzufügen und Entfernen von Knoten, Patching, Backup und Recovery sowie die Replikation für Katastrophen und Recovery – werden äußerst komplex und erfordern eine besondere Berücksichtigung der Zustandskonsistenz in verschiedenen Filialen.

      Daher ist es besser, wenn möglich den Zustand der App und ihre Daten in einer einzigen Datenbank zu speichern. Daten bleiben in einem einzigen Speicher konsistent und können einfacher verwaltet werden. Mit diesem Ansatz können App-Instanzen ersetzt werden. Dies hilft insbesondere bei modernen Anwendungsarchitekturen wie elastischen Microservices oder ephemeren Instanzen, bei denen nur eine Instanz für die Bereitstellung einer einzelnen oder einiger Anforderungen vorhanden ist. Das Hinzufügen eines Knotens wird vereinfacht, da ein neuer Knoten die neueste Kopie des Status erhalten kann und das Entfernen eines Knotens nicht dazu führt, dass der Status vollständig verloren geht. Patches können im Rolling-Modus eingespielt werden, indem nur die ausführbaren Dateien ersetzt werden. Ein Knoten kann aus Backups wiederhergestellt werden und den Status aus der Datenbank abrufen. Der Status kann konsistent als Einheit für die Disaster Recovery in verschiedenen Regionen repliziert werden. Ein konsistenter Status in verschiedenen Regionen kann sicherstellen, dass nach einem Failover oder Switchover keine funktionalen Probleme in Ihrer App auftreten.

      Empfehlungen von Oracle
      Wenn Ihre App eine Datenbank verwendet, speichern Sie ihren Status in derselben Datenbank. Eine Datenbank bietet bessere Verfügbarkeit, Integrität und Sicherheit als Alternativen, wie Dateien oder speicherresidente Darstellungen. Idealerweise verwenden Sie eine Datenbank mit mehreren Modellen (die verschiedene Formate speichern können), um alle Elemente des Status Ihrer App zu speichern. Mit einer Datenbank mit mehreren Modellen anstelle von mehreren Einzeldatenspeichern können Sie außerdem auf einfache Weise Konsistenz in allen Elementen Ihres App-Status erreichen und aufrechterhalten. (Hinweis: Obwohl es zulässig ist, den gecachten Status in der App zu speichern, muss die App so konzipiert sein, dass sie die Datenbank als Quelle der Wahrheit verwendet und ihren Status aus der Datenbank neu erstellen kann.) Oracle Database ist für diesen Zweck ideal geeignet. Sie speichert verschiedene Formate und bietet eine vorhersehbare Leistung, sodass die Speicherung des Status Ihrer App die Leistung Ihrer App nicht beeinträchtigt.

      Wenn Ihre App keine Datenbank verwendet, speichern Sie den Status mit anderen dauerhaften Persistenzspeichern, wie Oracle Cloud Infrastructure Object Storage. Wenn der App-Status nicht in einem einzelnen Datenspeicher gespeichert werden kann, entwerfen Sie Ihre App, um den Status in mehreren Datenspeichern zu speichern, die nach einem Ausfall synchronisiert und als konsistente Einheit wiederhergestellt werden können.

      Im Folgenden finden Sie einige Empfehlungen zum Speichern des Status in einer Oracle Database.

      • Benutzersessionobjektstatus: Verwenden Sie JSON-Objekt-/relationale Zuordnung, wie JPA oder relationale Tabellen.
      • Lokale Datencaches: Bei Daten, die in der App-Tier im Cache gespeichert werden, muss die Datenquelle eine Datenbank sein. Die Caches müssen beim Hochfahren der App oder bei Bedarf neu erstellt werden. Bei Aktualisierungen der Caches muss die Write-Behind-Methode verwendet werden, mit der die Backend-Datenbank aktualisiert wird. Andere Instanzen von Cache in App-Instanzen müssen über die Änderungen benachrichtigt werden, damit die Caches aktualisiert werden können.
      • App-Konfigurationsdaten: Dies sind Artefakte, wie Verbindungsendpunkte, Grenzwerte, Logging-Ebenen, Logziele und Portnummern, die normalerweise als JSON-Dokumente, XML-Dateien oder Eigenschaftendateien gespeichert werden. Verwenden Sie den entsprechenden Datentyp, um diese Daten in einer Datenbank zu speichern.
      • Prozessübergreifende Kommunikation oder Remoteprozessaufrufe: In der Regel kommunizieren Anwendungs-Microservices und -komponenten über Nachrichten miteinander. Verwenden Sie Oracle Database-Transaktionswarteschlangen, um solche Nachrichten dauerhaft zu machen und sicherzustellen, dass Nachrichten überleben und verarbeitet werden, wenn ein Ausfall auftritt.
      • Text (wie Auditlogdatensätze): Apps generieren Logdateien, wie Auditlogs und Diagnoseprotokolle. Verwenden Sie die Oracle Text-Funktionalität, um solche Logs zentral zu speichern.
      • Performanceüberwachung: Apps generieren Metriken oder Zeitreihendaten zu Leistungsüberwachungszwecken. Verwenden Sie Oracle Database-Zeitreihendaten oder JSON-Datenfunktionen, um solche Daten zu speichern.
      • Workflowstatus: Einige Workflow-Engines speichern den Status einer App lokal, und der Failover solcher Workflows kann zu einem Verluststatus führen. Verwenden Sie die Workflow-Engine in der Datenbank, um solche Probleme zu vermeiden. Konfigurieren Sie mindestens Workflow-Engines, um die Datenbank als Persistenzspeicher für ihren Status zu verwenden.
    • Verwenden Sie eine konvergente Datenbank mit vollständiger Unterstützung aller Daten

      Überblick
      Ihre App verwendet möglicherweise Daten in verschiedenen Formaten, wie tabellarisch (relational), unstrukturiert, XML, JSON, räumlich oder grafisch. Normalerweise benötigte eine derartige Vielfalt für jedes Datenformat eine andere Art von Datenbank. Beispiel: eine relationale Datenbank für relationale Daten, ein Dokumentspeicher für unstrukturierte Daten oder eine Diagrammdatenbank für hierarchische verknüpfte Daten. Die Verwendung mehrerer Datenbanken führt jedoch häufig zu zusätzlicher Betriebskomplexität und Dateninkonsistenz. Verwenden Sie stattdessen eine einzige Datenbank mit mehreren Modellen, um mehrere Datentypen und -formate zu speichern, zu indexieren und zu durchsuchen.

      Nutzen Sie die Datenbankfunktionalität, um Ihre App-Logik zu vereinfachen. Beispiel: Verwenden Sie SQL für Abfragen, Joins und Analysen; verwenden Sie Transaktionen, um Konsistenz und Isolation zu gewährleisten; und verwenden Sie integrierte Algorithmen und Analysefunktionen für maschinelles Lernen, um unnötige Datenübertragung zu vermeiden. Um sensible Daten zu schützen, verwenden Sie die Sicherheitsfunktionen und die Zugriffskontrolle der Datenbank und verwenden die Replikation, um die Verfügbarkeit, Skalierbarkeit und Resilienz Ihrer Anwendungen zu verbessern.

      Grundlegende Details
      Verwenden Sie eine Datenbank mit mehreren Modellen, um verschiedene Datentypen zu speichern, wie JSON-Dokumente, Eigenschaftsdiagramme und relationale Daten. Erweiterte Datenbanken mit mehreren Modellen bieten umfassende Unterstützung für alle in der Datenbank gespeicherten Datentypen. Sie können ein neues JSON-Dokument speichern, relationale Zeilen einfügen und ein Eigenschaftsdiagramm innerhalb derselben ACID-Transaktion aktualisieren. Sie können SQL-Anweisungen verwenden, um diese verschiedenen Datentypen zu verknüpfen, zu filtern und zu aggregieren. Dadurch erhalten Sie die starke Konsistenz und den garantiert gleichzeitigen Zugriff, die Sie von relationalen Datenbanken gewöhnt sind. Neben diesem umfassenden Features kann eine Datenbank mit mehreren Modellen auch als ein einziger Datenspeicher verwendet werden, der über andere APIs als SQL zugänglich ist, wie REST-APIs, Dokumentspeicher-APIs und Diagramm-APIs.

      Ein wesentlicher Vorteil der Verwendung einer Datenbank mit mehreren Modellen ist die Wiederverwendbarkeit. Obwohl Daten verschiedene Typen und Ausprägungen aufweisen können, ändert sich die zugrundeliegende Technologie zur Verwaltung dieser Daten nicht. Das bedeutet, dass Sie nicht mehrere Datenbanktechnologien kennenlernen und verstehen müssen, wie Sie jeden einzelnen Datentyp verwenden und optimieren. Und weil die Technologie konstant bleibt, müssen Sie Ihren App-Code nicht umschreiben. Darüber hinaus verbessert eine Datenbank mit mehreren Modellen die Resilienz Ihrer App, indem sie die Datenfragmentierung reduziert und so Backup und Recovery erleichtert.

      Empfehlungen von Oracle
      Mit Oracle Autonomous Database, einer konvergierten Datenbank mit mehreren Modellen, können Sie alle Ihre Daten speichern, verwalten und analysieren. Vereinfachen Sie die Verwaltung Ihrer App, indem Sie die Daten in Tabellen über Ansichten bereitstellen, sodass das zugrunde liegende Schema geändert werden kann, ohne dass sich dies auf Ihre vorhandenen Apps auswirkt. Verwenden Sie editionsbasierte Neudefinition, damit Sie Ihre App ohne Ausfallzeiten aktualisieren können. Verwenden Sie Oracle Data Safe, um Sicherheitskontrollen zu implementieren und auszuwerten, sensible Daten zu maskieren und Datenzugriffe zu prüfen. Verwenden Sie Oracle Data Guard als hoch skalierbaren Lesecache für Ihre Daten, und verwalten Sie ein konsistentes Backup für das Disaster Recovery.

      Oracle Autonomous Database führt operative Aufgaben ohne Auswirkungen oder Unterbrechung in seiner Workload aus. Das bedeutet, dass Sie der App keine komplexe Kompensationslogik hinzufügen müssen, um Skalierungs- oder Failover-Szenarios zu verarbeiten. Die Datenbank verwaltet Ressourcen wie CPU und Speicher unabhängig und bietet elastische bidirektionale Skalierbarkeit.

    • End-to-End-Überwachung und -Nachverfolgung von Instrumenten

      Überblick
      Eine einzelne Benutzeranforderung kann einem komplexen Pfad über mehrere Services oder Microservices hinweg folgen, aus denen eine moderne App besteht. Das komplette Tracing folgt auf die Weiterleitung jeder Anforderung von ihrer Quelle bis zu den Tiefen Ihrer Infrastruktur und hilft Ihnen beim Debugging der Ursache eines Problems. Monitoring wird im Allgemeinen als Diagnosetool verwendet. Dadurch werden Ihre Entwickler benachrichtigt, wenn Ihre App nicht wie erwartet funktioniert.

      Entwickler, Administratoren und Sicherheitsbeauftragte müssen die Integrität, Performance, den Betriebsstatus und mögliche Sicherheitsvorfälle Ihrer App zuverlässig und zeitnah verstehen. Durch dieses Verständnis wird sichergestellt, dass die Funktion und Performance Ihrer App die Erwartungen während ihres Lebenszyklus erfüllen und auch die Diagnose und Anwendungswiederherstellung optimieren können. Umfassende, durchgängige Überwachung und Verfolgung sollten einfach zu implementieren und zu verwalten sein, ohne Ihrer App Komplexität hinzuzufügen.

      Grundlegende Informationen
      Ihre Anwendung kann sich in vielerlei Hinsicht anders verhalten als erwartet. Sie kann beispielsweise eine schlechte Leistung erbringen oder sogar komplett versagen. Im Gegensatz zu einer herkömmlichen monolithischen App stellt eine App, die auf Microservices basiert, aufgrund mehrerer Interaktionen zwischen den Komponenten zusätzliche diagnostische Herausforderungen dar.

      Das Tracing ist der beste Weg, um schnell zu verstehen, was mit einer Benutzeranforderung geschieht, während sie sich durch die Microservices und andere Komponenten bewegt, aus denen Ihre App besteht (z. B. die Infrastruktur). Verwenden Sie komplettes Tracing, um Daten über jede Benutzeranforderung zu sammeln. Prüfen Sie dann die Daten, um zu sehen, wo Ihre App Engpässe und Latenzzeiten aufweisen kann. Beispiel: Eine Anforderung kann mehrere Microservices durchlaufen, bevor sie erfüllt wird. Ohne eine Möglichkeit, die gesamte Anforderung zu verfolgen, gibt es keine Möglichkeit, die Ursache des Ausfalls zu ermitteln.

      Die Überwachung ist im Allgemeinen viel gezielter, sodass Sie das Verhalten Ihrer App besser verstehen, indem Sie Ihre App instrumentieren und dann Metriken erfassen, aggregieren und analysieren. Durch die komplette Überwachung wird außerdem eine intelligente und automatisierte Integration mit Tools ermöglicht, die die Ressourcenkapazität dynamisch anpassen und Antworten auf unerwartete Ereignisse koordinieren.

      Ein klares, genaues und zeitnahes Verständnis des Betriebszustands und der Geschichte einer App besteht nicht nur aus der Messung der Erfahrung von Endbenutzern. Möglicherweise müssen Sie auch die Compliance mit regionalen oder nationalen Gerichtsbarkeiten sicherstellen, die möglicherweise die Erstellung von bedarfsgesteuerten, detaillierten Aktivitätsberichten oder Bestätigungen zur Handhabung bestimmter, sensibler Datenelemente erfordern.

      Im Allgemeinen sollten Überwachungslösungen mit Drittanbieter-Tools kompatibel sein und insbesondere den administrativen Tools Ihrer Umgebung entsprechen. Es ist wichtig, die Designflexibilität aufrechtzuerhalten und eine Abhängigkeit von den Anbietern zu vermeiden.

      Empfehlungen von Oracle
      Schaffen Sie von Anfang an umfassende Überwachungs- und Tracingfunktionen in Ihrer App und halten Sie diese während des gesamten Lebenszyklus einheitlich. Die Funktionen sollten die Entwicklung, Tests und Bereitstellung nicht noch komplexer machen, sondern einfach zu implementieren und zu verwalten sein. Übernehmen Sie nach Möglichkeit Lösungen, die auch die Vielfalt der Plattformen berücksichtigen, die Sie derzeit nutzen und in Zukunft bereitstellen können.

      OCI-Services wie Monitoring bieten Out-of-the-box-Unterstützung für die Überwachung. Außerdem können Sie viele OCI-Services auf Ihre App-Komponenten erweitern, indem Sie eine konsistente Deployment- und Managementerfahrung über unterstützte APIs und SDKs nutzen. Beispiel: Sie können die automatische Erfassung von Überwachungsmetriken oder die Logerfassung mit zentralisiertem Speicher für alle virtuellen Maschinen und Anwendungen hinzufügen.

      Während der Entwicklung und beim Testen können Sie Services so konfigurieren, dass nur grundlegende Debugging- oder Performancetestinformationen erfasst werden. Wenn Ihre App sich der Produktionsbereitstellung nähert, erhöhen Sie den Umfang, die Häufigkeit und die Rückverfolgbarkeit der gesammelten Informationen, indem Sie einfache Aktualisierungen vorhandener Konfigurationsparameter vornehmen.

      Oracle Cloud Infrastructure Service Mesh erfasst automatisch eine Vielzahl von Kommunikationsmetriken und Protokollen für Services, die in OCI Kubernetes Engine ausgeführt werden. Mit diesen Daten können Sie den Zustand Ihrer Services im Mesh überwachen und die Anwendungs-Performance verbessern.

      Nutzen Sie die robuste, zentrale Datenerfassung für Ihre gesamte Cloud-Mandantenumgebung, um einen einzelnen Speicherort für Analyse, koordinierte Prüfung und Alertgenerierung bereitzustellen. Service Connector Hub ermöglicht flexible, konsistente und anpassbare Antworten auf Ereignisse. OCI Logging Analytics ermöglicht eine effiziente Analyse und Untersuchung aller Ihrer Cloud- (und externen) Ereignisprotokollierungssysteme. Sie können auch OCI Service Connector Hub, Functions und Notifications verwenden, um erfasste Kennzahlen und Logs in umsetzbare Alerts umzuwandeln. Außerdem können Sie unsere Integrationen in Drittanbieterprodukte und -services wie Splunk und Grafana nutzen.

      Mit den folgenden OCI-Services können Sie Logging, Überwachung und Tracing in allen Umgebungen konsolidieren, in denen Ihre App gehostet wird: Logging, Monitoring, Logging Analytics, Application Performance Monitoring, OS Management, Database Management und Java Management Service. Diese vollständig verwalteten Services sind in allgemeine OCI-Infrastrukturressourcen integriert und bieten unterstützte Mechanismen zur Integration Ihrer benutzerdefinierten App-Ressourcen.

    • Eliminieren Sie Single Point of Failure durch automatisierte Datenreplikation und Fehlerwiederherstellung

      Überblick
      Ein Single Point of Failure ist eine Komponente einer App, die beim Ausfall Ihre gesamte App nicht verfügbar oder unzuverlässig macht. Wenn Sie eine App entwickeln, die hochverfügbar und zuverlässig ist, verwenden Sie die automatisierte Datenreplikation, um sicherzustellen, dass der Ausfall einer einzelnen Komponente nicht zu Datenverlust führt.

      Die rechnerübergreifende Datenreplikation und die Verwendung redundanter Netzwerke schützen Sie vor routinemäßigen Ausfällen von Maschinen und Netzwerken. Die Replikation Ihrer Daten in Data Centern (oder „Availability-Domains“) über mehrere geografische Regionen hinweg schützt Sie vor lokalisierten Katastrophen, wie Bränden, Erdbeben, Fluten oder Hurrikanen.

      Grundlegende Details
      Damit Ihre App High Availability erreichen kann, müssen Sie sicherstellen, dass die Daten, von denen Ihre App abhängt, bei Ausfällen verfügbar bleiben. Der Schlüssel zur hohen Verfügbarkeit von Daten ist Redundanz durch automatisierte Datenreplikation.

      Bei der Replikation werden Datenbankobjekte wie Tabellen in mehreren Datenbanken, aus denen ein verteiltes Datenbanksystem besteht, kopiert und verwaltet. An einem Standort angewendete Änderungen werden vor der Weiterleitung und Anwendung an den einzelnen Replikaten an Remote-Standorten lokal erfasst und gespeichert.

      Replizierte Datenbanken können in zwei verschiedenen Modi funktionieren: aktiv/passiv und aktiv/aktiv. Im Aktiv/Passiv-Modus gibt es ein einzelnes Primär-Replikat und mindestens ein Sekundär-Replikat. Nur das Primär-Replikat nimmt an der App-Datenverarbeitung teil. Im Aktiv/Aktiv-Modus beteiligen sich alle Replikate an der Datenverarbeitung. Der Aktiv/Aktiv-Modus bietet eine bessere Ressourcenverwendung und höhere Verfügbarkeit, da kein primär-sekundäres Failover erforderlich ist.

      Durch Redundanz wird sichergestellt, dass Datenreplikationen unabhängig voneinander ausfallen. Maschinen- oder Datenträgerausfälle sind in der Regel unabhängig, ein Netzwerk- oder Stromausfall kann jedoch dazu führen, dass eine Gruppe von Rechnern gleichzeitig ausfällt. Zum Schutz vor solchen Vorfällen muss die Netzwerk- und Strominfrastruktur ebenfalls redundant sein, und Datenreplikate müssen sorgfältig über verschiedene Rechner und Speicherorte hinweg platziert werden, die nicht gemeinsam ausfallen können.

      Empfehlungen von Oracle
      OCI-Data Center sind sorgfältig konzipiert, um einzelne schwerwiegende Schwachstellen zu vermeiden. Eine typische Data Center- oder Availability-Domain enthält mehrere unabhängige Fehlereinheiten, die als Faultdomains bezeichnet werden. Zwei unabhängige Faultdomains können nicht gemeinsam ausfallen. Ebenso kann eine einzelne Region über mehrere Availability-Domains verfügen, die geografisch getrennt sind, um sicherzustellen, dass zwei davon nicht gleichzeitig ausfallen können.

      Verwenden Sie OCI-Speicherservices wie Block Volumes, Object Storage und File Storage, um Daten in Fault- und Availability-Domains zu replizieren, sodass sich kein Single Point of Failure auf die Verfügbarkeit der Daten Ihrer App auswirken kann. Profitieren Sie von der robusten Fehlerisolierung, die in OCI integriert ist, indem Sie mit der OCI Kubernetes Engine Ihre App über mehrere Fault- und Availability-Domains hinweg bereitstellen. Oracle Autonomous Database, Data Guard und GoldenGate bieten aktiv/aktive Hardware- und Softwarereplikation für hohe Verfügbarkeit sowie Patching und Upgrades ohne Ausfallzeiten. Verwenden Sie diese verwalteten Services für hochverfügbare Daten, ohne dass Sie eine eigene Speicherinfrastruktur erstellen und verwalten müssen.

    • Implementieren Sie automatisierte Defense in Depth zur Sicherung Ihrer App und ihrer Daten

      Überblick
      Defense in Depth ist ein Ansatz, bei dem mehrere, unabhängige und redundante Sicherheitskontrollen als Verteidigungsschichten für eine App fungieren. Die Schichten sind so ausgelegt, dass sie Sicherheit bieten, auch wenn eine davon ausfällt, zum Beispiel eine Firewall kombiniert mit der Angriffserkennung.

      Die manuelle Verwaltung und Konfiguration von Sicherheitskontrollen kann jedoch komplex, undurchsichtig und fehleranfällig sein – individuell und kollektiv. Sichern Sie stattdessen Ihre App und ihre Daten mit automatisierten Sicherheitskontrollen.

      Grundlegende Details
      Defense in Depth verwaltet das Risiko durch die Verwendung verschiedener Kontrollen, die physische, technische, administrative, betriebliche, personelle und verfahrenstechnische Elemente der Sicherheit abdecken. Ihre Unabhängigkeit bedeutet, dass sie eine tiefgreifende Verteidigung bieten, die mit Fehlern, Exploits oder anderen Sicherheitslücken umgehen. Die Kontrollen sind so konzipiert, dass sie Risiken auf unterschiedliche Weise angehen und Logging, Auditing und andere Funktionen bereitstellen, um sicherzustellen, dass versuchte Sicherheitsverstöße erkannt und den zuständigen Stakeholdern gemeldet werden.

      Anstatt ein komplexes Set an Sicherheitskontrollen manuell zu konfigurieren, verwenden Sie einfache und präskriptive automatisierte Steuerelemente, um Ihre App zu sichern. Automatisierte Sicherheitskontrollen beseitigen menschliche Fehler (die Ursache vieler Sicherheitsvorfälle) und helfen Ihnen, Ihre App und ihre Daten zu sichern, ohne dass Sie ein Sicherheitsexperte werden müssen.

      Empfehlungen von Oracle
      Implementieren Sie benutzerfreundliche, automatisierte Sicherheitskontrollen in allen Phasen des App-Lebenszyklus, einschließlich Entwicklung, Erstellung, Test, Bereitstellung und Laufzeit. Prüfen Sie Benutzer, Berechtigungen und Zugriffs-Policys in jedem Schritt im Lebenszyklus, und stellen Sie sicher, dass der Zugriff nur erteilt wird, wenn dies angemessen ist. Erkennen Sie Sicherheitsprobleme, die frühzeitig im Softwareentwicklungslebenszyklus eingeführt werden. Durch die Früherkennung wird sichergestellt, dass Ihre App in der Produktion mit Best Practice für die Sicherheitsarchitektur bereitgestellt wird und dass Betriebssicherheitsprobleme durch Fehlkonfigurationen oder offengelegte Schwachstellen erkannt und gemindert werden.

      OCI bietet mehrere automatisierte Sicherheitsservices zur Sicherung Ihrer App und ihrer Daten. Im Folgenden finden Sie einige Empfehlungen für die Verwendung von OCI-Services:

      • Verwenden Sie eine Web Application Firewall (WAF), um den Traffic von unbekannten Standorten zu begrenzen. Verwenden Sie für die Transport Layer Security (TLS) Load Balancer-Zertifikate und die Autorotation. Aktivieren Sie die WAF auf jedem Load Balancer, der HTTPS-Inhalte bereitstellt. Aktivieren Sie von Oracle verwaltete Regeln, und optimieren Sie sie auf falsch positive Werte. Begrenzen Sie den Traffic aus Ländern, mit denen Sie keine Geschäfte tätigen, mit Geo-IP-Zugriffsregeln. Tor-Knoten mit Threat Intelligence in WAF blockieren
      • Nutzen Sie Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) für einen Identity-First-Sicherheitsansatz, der ein einfaches Onboarding und Management von Benutzern ermöglicht. Verwenden Sie OCI IAM am Frontend Ihrer App, um Benutzer mit sicheren Authentifizierungsmethoden zu authentifizieren und gleichzeitig eine optimale Benutzererfahrung durch kontextbezogene adaptive Sicherheit, optionale föderierte Anmeldung, Anmeldung über soziale Netzwerke oder kennwortlose Authentifizierung (je nach Anforderungen) zu gewährleisten. Unterstützen Sie regulatorische Anforderungen, indem Sie Benutzern die Möglichkeit geben, ihre Zustimmung für Nutzungsbedingungen zu verwalten und Anforderungen an die Data Residency zu unterstützen. Verwenden Sie OCI IAM am Backend, um den Zugriff auf die Komponenten Ihrer App nach Bedarf zu beschränken. Setzen Sie die Authentifizierung für Administratoren durch starke Optionen für die Multifaktor-Authentifizierung (MFA) durch. Setzen Sie starke Sicherheits-Policys durch, die den Zugriff nur über explizit erteilte Berechtigungen zulassen. Separate Zuständigkeiten, damit der Zugang auf diejenigen beschränkt wird, die ihn benötigen.
      • Verschlüsseln Sie Daten im Ruhezustand mit Schlüsseln, die im OCI Vault gespeichert sind, unterstützt durch Hardware-Sicherheitsmodule. Sie können für jeden Service auch separate Verschlüsselungsschlüssel verwenden und trotzdem OCI Vault-Entitäten an Compartments ausrichten. Drehen Sie Masterverschlüsselungsschlüssel mindestens jährlich und Datenschlüssel alle drei Monate. Verwenden Sie in der Produktion einen privaten Tresor und replizieren Sie die Schlüssel in sekundären Regionen. Erstellen Sie Backups, und speichern Sie sie in Oracle Cloud Infrastructure Object Storage in einer separaten Region. Sichern Sie Verschlüsselungsschlüssel, und beschränken Sie den Zugriff auf Schlüssel nur auf solche, die vom App-Eigentümer autorisiert wurden.
      • Verwenden Sie integrierte Sicherheits-Principals, um Compute-Instanzen für Aktionen mit anderen OCI-Services zu autorisieren.
      • Setzen Sie das Prinzip der Mindesterreichbarkeit und der Endpunktisolierung durch, indem Sie das Netzwerksicherheitsgruppenfeature in virtuellen OCI-Cloud-Netzwerken (VCNs) verwenden. Aktivieren Sie das NetFlow-Logging auf jedem VCN. Überwachen Sie das DNS-Logging auf Verschlüsselungsaktivität oder auf Befehls- und Kontrollserveraktivität.
      • Starten Sie Ihre App mit Oracle Security Zones in einer Secure-by-Default-Konfiguration. Verwenden Sie Zonen mit maximaler Sicherheit für Compartments mit privaten Subnetzen. Stellen Sie sicher, dass der Operatorzugriff auf alle Compute-Instanzen in privaten Subnetzen über Oracle Cloud Infrastructure Bastion geleitet wird.
      • Aktivieren Sie Oracle Cloud Guard, beheben oder akzeptieren und deaktivieren Sie alle Probleme. Ermöglichen Sie Benachrichtigungen zu Abweichungen und behandeln Sie neue Probleme mit Dringlichkeit.
      • Ermöglichen Sie Oracle Data Safe, Oracle Databases durch Überwachung von Benutzern und Zugriff abzusichern. Data Safe scannt auch die Datenbanken auf Best Practices zur Sicherheit und Alerts zu Abweichungen.
      • Scannen Sie Instanzen und Container mithilfe von Oracle Cloud Infrastructure Vulnerability Scanning Service regelmäßig nach bekannten Sicherheitsproblemen.
      • Verwenden Sie OCI Service Mesh, um die Kommunikation zwischen Services in Ihrem OCI Kubernetes Engine-Cluster zu authentifizieren und zu verschlüsseln. Mit OCI Service Mesh können Sie außerdem Zugriffs-Policies konfigurieren, um die Kommunikation zwischen Services zu steuern und externe Anforderungen zu validieren.