Share via


Empfehlungen zur Optimierung von Codekosten

Gilt für diese Empfehlung für die Kostenoptimierung in Azure Well-Architected Framework:

CO:11 Optimieren Sie die Codekosten. Bewerten und Ändern von Code, um funktionale und nicht funktionale Anforderungen mit weniger oder billigeren Ressourcen zu erfüllen.

In diesem Leitfaden werden die Empfehlungen zur Optimierung der Codekosten beschrieben. Codeoptimierung ist der Prozess zur Verbesserung der Effizienz, Leistung und Kosteneffizienz von Anwendungscode. Bei der effektiven Codeoptimierung werden Änderungen am Code vorgenommen, um den Ressourcenverbrauch zu verringern, die Ausführungszeit zu minimieren und die Gesamtleistung zu verbessern.

Durch die Optimierung von Code können Sie Ineffizienzen identifizieren und beseitigen, die zu einem erhöhten Ressourcenverbrauch und höheren Kosten führen können. Sie können Die Verarbeitungszeit, die Arbeitsspeicherauslastung und den Netzwerkaufwand reduzieren, was zu anwendungen führen kann, die schneller und reaktionsfähiger sind. Die verbesserte Leistung verbessert die Benutzerfreundlichkeit und ermöglicht es Ihrem System, größere Workloads effizient zu verarbeiten.

Definitionen

Begriff Definition
Codeinstrumentation Die Praxis des Hinzufügens von Codeausschnitten oder Bibliotheken zu Code, die Daten sammeln und die Codeleistung während der Laufzeit überwachen.
Parallelität Die Ausführung mehrerer Prozesse gleichzeitig.
Datenserialisierung Der Prozess des Konvertierens von Datenobjekten in ein Format, das gespeichert oder übertragen werden kann, und deren Wiederherstellung in ihre ursprüngliche Form bei Bedarf.
Heiße Pfade Kritische oder häufig ausgeführte Abschnitte eines Programms, die hohe Leistung und geringe Latenz erfordern.

Wichtige Entwurfsstrategien

Die Kostenoptimierung von Code bedeutet, Code zu verbessern, um dieselbe Funktionalität mit weniger ressourcen pro instance wie CPU-Zyklen, Arbeitsspeicher und Speicher zu erzielen. Durch die Reduzierung des Ressourcenverbrauchs können Sie Geld sparen, wenn Anwendungen große Datenmengen verarbeiten oder hohe Datenverkehrslasten aufweisen.

Codeverbesserungen sind am effektivsten, wenn Sie andere Kostenoptimierungsbemühungen im Bereich Skalierung, Rechteanpassung, Redundanz und Drosselung ausführen. Nachdem Sie sich um diese grundlegenden Elemente gekümmert haben, können Sie die Codeoptimierung in Betracht ziehen.

Möglicherweise wissen Sie nicht, ob Sie über ineffizienten Code verfügen. Serverlose, automatische Skalierung und Zuverlässigkeitsfeatures können Codeineffizienzen maskieren. Die folgenden Strategien können Ihnen helfen, Anwendungscode zu identifizieren und zu beheben, der mehr kostet als er sollte.

Instrumentieren des Codes

Die Instrumentierung von Code ist die Praxis des Hinzufügens von Codeausschnitten oder Bibliotheken, die Daten sammeln und die Codeleistung während der Laufzeit überwachen. Es ermöglicht Entwicklern, Informationen zu wichtigen Metriken wie Ressourcenverbrauch (CPU- oder Arbeitsspeicherauslastung) und Ausführungszeit zu sammeln. Durch die Instrumentierung von Code können Entwickler Einblicke in heiße Codepfade gewinnen, Leistungsengpässe identifizieren und den Code für eine bessere Effizienz und Kosteneffizienz optimieren.

In einer idealen Umgebung sollten Sie codeanalyse früh im Lebenszyklus der Softwareentwicklung durchführen. Je früher Sie ein Codeproblem abfangen, desto günstiger ist es zu beheben.

Automatisieren Sie so viel wie möglich dieser Codeanalyse. Verwenden Sie dynamische und statische Tools für die Codeanalyse, um den manuellen Aufwand zu reduzieren. Beachten Sie jedoch, dass es sich bei diesem Test immer noch um eine Simulation der Produktion handelt. Die Produktion bietet ein klares Verständnis der Codeoptimierung.

Kompromiss: Codeüberwachungstools werden wahrscheinlich die Kosten erhöhen.

Identifizieren und Optimieren von heißen Pfaden

Indem Sie Ihren Code instrumentieren, können Sie den Ressourcenverbrauch von Codepfaden messen. Mithilfe dieser Messungen können Sie heiße Pfade identifizieren. Heiße Pfade haben einen erheblichen Einfluss auf die Leistung und ressourcennutzung. Sie sind kritisch oder führen häufig Abschnitte eines Programms aus, die eine hohe Leistung und geringe Latenz erfordern.

Um heiße Pfade zu identifizieren, ziehen Sie die folgenden Aufgaben in Betracht:

  • Analysieren von Laufzeitdaten: Sammeln und Analysieren von Laufzeitdaten, um Bereiche des Codes zu identifizieren, die erhebliche Ressourcen verbrauchen, z. B. CPU-, Arbeitsspeicher- oder E/A-Vorgänge. Suchen Sie nach Mustern oder Abschnitten von Code, die häufig ausgeführt werden oder lange dauern.

  • Messen der Leistung: Verwenden Sie Profilerstellungstools oder Leistungstestframeworks, um die Ausführungszeit und den Ressourcenverbrauch von Codepfaden zu messen. Diese Messung hilft dabei, Engpässe und Verbesserungsmöglichkeiten zu identifizieren.

  • Betrachten Sie Geschäftslogik und Benutzereffekt: Bewerten Sie die Bedeutung von Codepfaden basierend auf ihrer Relevanz für die Funktionalität der Anwendung oder kritische Geschäftsvorgänge. Bestimmen Sie, welche Codepfade entscheidend sind, um Benutzern Einen Mehrwert zu bieten oder Leistungsanforderungen zu erfüllen.

    Überprüfen Sie leistungsspezifische Empfehlungen für die Programmiersprache, mit der Sie arbeiten. Bewerten Sie Ihren Code anhand dieser Empfehlungen, um Verbesserungsmöglichkeiten zu identifizieren. Entfernen Sie alle unnötigen Vorgänge innerhalb des Codepfads, die sich möglicherweise auf die Leistung auswirken.

  • Entfernen unnötiger Funktionsaufrufe: Überprüfen Sie Ihren Code. Identifizieren Sie alle Funktionen, die für die gewünschte Funktionalität nicht erforderlich sind und sich negativ auf die Leistung auswirken können. Wenn beispielsweise ein Funktionsaufruf eine Überprüfung ausführt, die zuvor im Code erfolgt ist, können Sie diesen unnötigen Funktionsaufruf entfernen.

  • Minimieren von Protokollierungsvorgängen: Die Protokollierung kann beim Debuggen und Analysieren hilfreich sein, aber eine übermäßige Protokollierung kann sich auf die Leistung auswirken. Bewerten Sie die Notwendigkeit jedes Protokollierungsvorgangs, und entfernen Sie unnötige Protokollierungsaufrufe, die für die Leistungsanalyse nicht wichtig sind.

  • Optimieren von Schleifen und Bedingungen: Analysieren Sie Schleifen und Bedingungen im Code. Identifizieren Sie alle unnötigen Iterationen oder Bedingungen, die Sie beseitigen können. Die Vereinfachung und Optimierung dieser Strukturen kann die Leistung Ihres Codes verbessern.

  • Reduzieren unnötiger Datenverarbeitung: Überprüfen Sie Ihren Code auf unnötige Datenverarbeitungsvorgänge, z. B. redundante Berechnungen oder Transformationen. Beseitigen Sie diese unnötigen Vorgänge, um die Effizienz Ihres Codes zu verbessern.

  • Minimieren von Netzwerkanforderungen: Wenn Ihr Code Netzwerkanforderungen sendet, minimieren Sie die Anzahl der Anforderungen, und optimieren Sie deren Nutzung. Batchanforderungen, wenn möglich, und vermeiden Sie unnötige Roundtrips, um die Leistung zu verbessern.

  • Minimieren von Zuordnungen: Identifizieren Sie Bereiche, in denen eine übermäßige Speicherbelegung auftritt. Optimieren Sie den Code, indem Sie unnötige Zuordnungen reduzieren und vorhandene Ressourcen nach Möglichkeit wiederverwenden.

    Durch die Minimierung von Zuordnungen können Sie die Speichereffizienz und die Gesamtleistung verbessern. Verwenden Sie die entsprechenden Speicherverwaltungs- und Garbage Collection-Strategien für Ihre Programmiersprache.

  • Reduzieren der Größe der Datenstruktur: Bewerten Sie die Größe Ihrer Datenstrukturen, z. B. Klassen, und identifizieren Sie Bereiche, in denen eine Reduzierung möglich ist. Überprüfen Sie die Datenanforderungen, und vermeiden Sie unnötige Felder oder Eigenschaften. Optimieren Sie die Speicherauslastung, indem Sie geeignete Datentypen auswählen und Daten effizient verpacken.

  • Bewerten von übergreifenden Implementierungen: Berücksichtigen Sie die Auswirkungen von übergreifenden Implementierungen, z. B. Middleware oder Tokenprüfungen. Bewerten Sie, ob sie sich negativ auf die Leistung auswirken.

Kompromiss: Die Optimierung von Code und heißen Pfaden erfordert Entwicklerkenntnisse bei der Identifizierung von Codeineffizienzen. Diese hochqualifizierten Personen müssen möglicherweise Zeit für andere Aufgaben aufwenden.

Bewerten der Verwendung von Parallelität

Die Auswertung der Verwendung von Parallelität umfasst die Bewertung, ob asynchrone Verarbeitung, Multithreading oder Multiprocessing die Ressourcenauslastung maximieren und Kosten senken können. Mithilfe von asynchroner Verarbeitung, Multithreading oder Multiverarbeitung können Sie mehr Aufgaben mit denselben Ressourcen verarbeiten. Es ist jedoch von entscheidender Bedeutung, eine ordnungsgemäße Implementierung sicherzustellen, um mehr Aufwand zu vermeiden und die Wirtschaftlichkeit zu gewährleisten.

Um zu bewerten, ob die Verwendung von Parallelität geeignet ist, können Sie die folgenden Richtlinien befolgen:

  • Asynchrone Verarbeitung: Die asynchrone Verarbeitung ermöglicht die Ausführung ohne Blockierung. Beispielsweise können Sie einen Prozess starten und dann anhalten, damit ein zweiter Prozess abgeschlossen werden kann.

    Bestimmen Sie die Codekomponenten oder -vorgänge, die Sie asynchron ausführen können. Identifizieren Sie die Programmiersprache oder das Framework, die Sie verwenden, und verstehen Sie das asynchrone Programmiermodell, das es unterstützt, z async/await . B. in .NET oder Versprechen in JavaScript.

    Strukturieren Sie Ihren Code neu, um asynchrone Programmierkonstrukte zu verwenden, indem Sie die nicht blockierende Ausführung von Tasks aktivieren. Entkoppeln Sie lange oder E/A-intensive Vorgänge vom Standard Ausführungsthreads, indem Sie asynchrone Methoden oder Rückrufe verwenden. Verwenden Sie asynchrone APIs oder Bibliotheken, die Ihre Programmiersprache oder Ihr Framework bereitstellt, um asynchrone Workflows zu verarbeiten.

  • Multithreading: Beim Multithreading führen Sie mehrere Threads eines einzelnen Prozesses gleichzeitig aus.

    Identifizieren Sie Abschnitte Ihres Codes, die Sie gleichzeitig und unabhängig ausführen können. Lesen Sie Dokumentation oder Richtlinien, die für die Programmiersprache oder das Framework spezifisch sind, die Sie für bewährte Methoden für Multithreading verwenden. Erstellen Sie mehrere Threads oder Threadpools, um die parallele Ausführung von Aufgaben zu verarbeiten.

    Implementieren Sie Synchronisierungsmechanismen wie Sperren, Mutexes oder Semaphore, um die Threadsicherheit zu gewährleisten und Racebedingungen zu verhindern, wenn Code auf freigegebene Ressourcen zugreift. Erwägen Sie die Verwendung von Abstraktionen auf höherer Ebene, z. B. Threadpools oder aufgabenbasierte Parallelitätsbibliotheken, um die Verwaltung mehrerer Threads zu optimieren und die Parallelitätssteuerung zu vereinfachen.

  • Multiprocessing: Bei multiprocessing können Prozesse parallel ausgeführt werden. Es kann eine bessere Auslastung mehrerer CPU-Kerne als Multithreading bieten.

    Ermitteln Sie, ob sich die Workload oder Vorgänge in Ihrem Code für die parallele Verarbeitung eignen. Identifizieren Sie die Programmiersprache oder das Framework, die Sie verwenden, und erkunden Sie die Funktionen für die Mehrverarbeitung. Betrachten Sie beispielsweise das Multiprocessing-Modul in Python oder parallele Streams in Java. Entwerfen Sie Ihren Code, um die Workload in mehrere unabhängige Aufgaben aufzuteilen, die gleichzeitig verarbeitet werden können.

    Verwenden Sie mehrere Verarbeitungs-APIs oder Bibliotheken, um parallele Prozesse zu erstellen und zu verwalten. Verteilen Sie die Workload auf diese APIs oder Bibliotheken. Um die Koordination und den Datenaustausch zwischen mehreren Prozessen zu ermöglichen, implementieren Sie je nach Programmiersprache oder Framework Kommunikationsmechanismen wie interprocess communication (IPC), shared memory oder message passing.

Verwenden der richtigen SDKs

Wählen Sie für die Kostenoptimierung SDKs aus, die entwickelt wurden, um die Ressourcennutzung zu optimieren und die Leistung zu verbessern. Es ist wichtig, die Features und Funktionen der einzelnen SDK zu bewerten. Berücksichtigen Sie die Kompatibilität mit Ihrer Programmiersprache und Entwicklungsumgebung.

Hier finden Sie eine Anleitung, um die besten SDKs für Ihre Workload auszuwählen:

  • Durchführen von Leistungstests: Vergleichen Sie die Ressourcennutzung und -leistung von SDKs mithilfe von Leistungstests. Wählen Sie das SDK aus, das Ihren Anforderungen in Bezug auf Ressourcenoptimierung und Leistungsverbesserung am besten entspricht. Integrieren Sie das ausgewählte SDK in Ihre Codebasis, indem Sie die bereitgestellte Dokumentation und richtlinien befolgen.

  • Überwachen der Ressourcennutzung und Optimieren von Code: Überwachen der Ressourcennutzung mit dem implementierten SDK. Sammeln Sie Erkenntnisse aus der Überwachung und Analyse, um Ihren Code zu optimieren.

Wählen Sie das richtige Betriebssystem aus.

Die meisten Programmiersprachen können auf verschiedenen Betriebssystemen ausgeführt werden, daher ist es wichtig, Ihr Betriebssystem anhand günstigerer Alternativen zu bewerten. Wenn ein alternatives Betriebssystem die gleiche oder ähnliche Funktionalität zu geringeren Kosten unterstützt, lohnt sich dies. Durch die Wahl eines günstigeren Betriebssystems können Sie möglicherweise die Kosten für Lizenzierungsgebühren und Infrastrukturkosten senken.

Das richtige Betriebssystem kann zur Gesamtkostenoptimierung für Ihre Workload beitragen. Um das richtige Betriebssystem für Ihre Workload auszuwählen, probieren Sie die folgenden Aktivitäten aus:

  • Auswerten Ihrer Anforderungen: Verstehen Sie die spezifischen Anforderungen Ihrer Workload, einschließlich der von Ihnen verwendeten Programmiersprachen und Frameworks. Berücksichtigen Sie alle Abhängigkeiten oder Integrationen in andere Systeme.

  • Kompatibilität berücksichtigen: Stellen Sie sicher, dass das von Ihnen ausgewählte Betriebssystem mit Ihren Programmiersprachen, Frameworks und allen von Ihnen verwendeten Bibliotheken oder Tools von Drittanbietern kompatibel ist. Überprüfen Sie die Dokumentation und die Communityunterstützung für das Betriebssystem, um sicherzustellen, dass es eine gute Kompatibilität mit Ihrem Technologiestapel aufweist.

  • Bewerten der Funktionalität: Ermitteln Sie, ob das alternative Betriebssystem dieselbe oder ähnliche Funktionen wie Ihr aktuelles Betriebssystem unterstützt. Bewerten Sie, ob die erforderlichen Features und Funktionen bereitgestellt werden, die Für Ihre Workload erforderlich sind.

  • Vergleichen von Kosten: Vergleichen Sie die Kosten für Betriebssysteme. Berücksichtigen Sie Faktoren wie Lizenzierungsgebühren, Supportkosten und Infrastrukturanforderungen. Suchen Sie nach günstigeren Alternativen, die die Anforderungen Ihrer Workload erfüllen können, ohne die Funktionalität zu beeinträchtigen.

  • Berücksichtigen von Leistung und Optimierung: Bewerten Sie die Leistungs- und Optimierungsfunktionen des alternativen Betriebssystems. Suchen Sie nach Benchmarks, Fallstudien oder Leistungsvergleichen, um die Leistung in realen Szenarien zu verstehen.

  • Überprüfen der Sicherheit und Stabilität: Bewerten Sie die Sicherheit und Stabilität des alternativen Betriebssystems. Suchen Sie nach Sicherheitsupdates, Patches und Communitysupport, um sicherzustellen, dass das Betriebssystem aktiv verwaltet wird und insgesamt sicher und stabil ist.

  • Herstellerunterstützung in Betracht ziehen: Bewerten Sie die Ebene der Anbieterunterstützung, die für das alternative Betriebssystem verfügbar ist. Überprüfen Sie, ob es offizielle Supportkanäle, Dokumentation und eine Community von Benutzern gibt, die bei Bedarf Hilfe leisten können.

Optimieren des Netzwerkdurchlaufs

Bei der Optimierung des Netzwerkdurchlaufs geht es um die Minimierung des Netzwerkdatenverkehrs zwischen Workloadkomponenten. Bei der Datenübertragung sind häufig Kosten verbunden. Durch die Minimierung des Netzwerkdatenverkehrs können Sie die Zu übertragende Datenmenge reduzieren und gleichzeitig die Kosten senken.

Analysieren Sie Ihre Workload, und identifizieren Sie unnötige Datenübertragungen zwischen Komponenten. Vermeiden Sie die Übertragung redundanter oder doppelter Daten, und übertragen Sie nur wichtige Informationen. Wenn eine Komponente beispielsweise wiederholt dieselben Daten von einer anderen Komponente anfordert, ist sie ein Kandidat für die Optimierung. Sie können Ihren Code umgestalten, um unnötige Aufrufe oder Batchanforderungen zu reduzieren und so die übertragenen Daten zu minimieren. Anwendungen können ganze Objekte oder Datenstrukturen senden, wenn nur wenige Felder benötigt werden. Indem Sie den Code so optimieren, dass nur die erforderlichen Daten gesendet werden, minimieren Sie die Größe der einzelnen Datenübertragungen.

Optimieren von Netzwerkprotokollen

Netzwerkprotokolle spielen eine entscheidende Rolle für die Effizienz der Netzwerkkommunikation. Durch die Optimierung von Netzwerkprotokollen können Sie die Gesamteffizienz der Datenübertragung verbessern und den Ressourcenverbrauch reduzieren.

Berücksichtigen Sie die folgenden Vorschläge:

  • Wählen Sie effiziente Protokolle aus: Wählen Sie Protokolle aus, die für ihre Effizienz in Bezug auf die Datenübertragungsgeschwindigkeit und die Minimierung des Overheads bekannt sind. Erwägen Sie beispielsweise die Verwendung von Protokollen wie HTTP/2 über HTTP/1.1. Diese Protokolle wurden entwickelt, um die Leistung zu verbessern, indem sie die Latenz verringern und die Datenübertragung optimieren. Verwenden Sie Bibliotheken und Frameworks in Ihrer Anwendung, um diese Protokolle zu verwenden.

  • Unterstützung der Komprimierung: Implementieren Sie Komprimierungsmechanismen in Ihren Netzwerkprotokollen, um die Größe der übertragenen Daten zu reduzieren. Die Komprimierung kann die Über das Netzwerk übertragene Datenmenge erheblich reduzieren, was zu einer verbesserten Leistung und geringerer Bandbreitennutzung führt. Die serverseitige Komprimierung ist in der Regel im Anwendungscode oder in der Serverkonfiguration aktiviert.

  • Verwenden von Verbindungspools: Verbindungspooling ermöglicht die Wiederverwendung von eingerichteten Netzwerkverbindungen, um den Aufwand für das Einrichten neuer Verbindungen für jede Anforderung zu reduzieren. Verbindungspools können die Effizienz der Netzwerkkommunikation verbessern, indem der Aufwand für verbindungseinrichtung und -abschaltung vermieden wird. Wählen Sie eine Verbindungspoolbibliothek oder ein Framework aus, und konfigurieren Sie sie, um die Workloadanforderungen zu erfüllen.

  • Implementieren weiterer Optimierungen: Erkunden Sie andere Optimierungen, die speziell für Ihre Workload und Netzwerkumgebung gelten. Beispielsweise können Sie die Zwischenspeicherung von Inhalten, den Lastenausgleich und die Datenverkehrsstrukturierung verwenden, um die Netzwerkdurchquerung weiter zu optimieren.

Minimieren des Netzwerkaufwands

Minimieren Sie die Menge des Netzwerkdatenverkehrs und der Datenübertragung zwischen Komponenten Ihrer Workload. Durch die Reduzierung des Netzwerkaufwands können Sie die Kosten im Zusammenhang mit eingehenden und eingehenden Daten senken und die Gesamtleistung des Netzwerks verbessern.

Berücksichtigen Sie die folgenden Techniken:

  • Reduzieren redundanter Anforderungen: Analysieren Sie den Code, um doppelte oder unnötige Anforderungen zu identifizieren. Anstatt mehrere Anforderungen für die gleichen Daten zu stellen, können Sie den Code ändern, um die Daten einmal abzurufen und bei Bedarf wiederzuverwenden.

  • Optimieren der Datengröße: Überprüfen Sie die Daten, die zwischen Komponenten oder Systemen übertragen werden, und suchen Sie nach Möglichkeiten, ihre Größe zu minimieren. Erwägen Sie Techniken wie das Komprimieren der Daten vor der Übertragung oder die Verwendung effizienterer Datenformate. Durch Verringern der Datengröße können Sie die Nutzung der Netzwerkbandbreite verringern und die Gesamteffizienz verbessern.

  • Batchanforderungen: Erwägen Sie ggf. die Batchverarbeitung mehrerer kleinerer Anforderungen in einer einzelnen größeren Anforderung. Batchverarbeitung reduziert den Aufwand für das Einrichten mehrerer Verbindungen und verringert die Gesamtdatenübertragung.

  • Verwenden der Datenserialisierung: Bei der Datenserialisierung werden komplexe Datenstrukturen oder -objekte in ein Format konvertiert, das einfach über ein Netzwerk übertragen oder in einem persistenten Speichersystem gespeichert werden kann. Diese Strategie umfasst die Darstellung der Daten in einem standardisierten Format, sodass die Daten effizient übertragen, verarbeitet und am Empfangsende rekonstruiert werden können.

    Wählen Sie ein Serialisierungsformat aus, das kompakt, schnell und für die Anforderungen Ihrer Workload geeignet ist.

    Serialisierungsformat BESCHREIBUNG
    Protocol Buffers (protobuf) Ein binäres Serialisierungsformat, das eine effiziente Codierung und Decodierung strukturierter Daten bietet. Es verwendet typisierte Definitionsdateien, um Nachrichtenstrukturen zu definieren.
    MessagePack Ein binäres Serialisierungsformat für die kompakte Übertragung über das Kabel. Es unterstützt verschiedene Datentypen und bietet eine schnelle Serialisierungs- und Deserialisierungsleistung.
    JavaScript Object Notation (JSON) Ein weit verbreitetes Datenserialisierungsformat, das von Menschen lesbar und einfach zu verwenden ist. JSON ist textbasiert und verfügt über eine breite plattformübergreifende Unterstützung.
    Binary JSON (BSON) Ein binäres Serialisierungsformat, das JSON ähnelt, aber für eine effiziente Serialisierung und Deserialisierung konzipiert ist. BSON enthält zusätzliche Datentypen, die in JSON nicht verfügbar sind.

    Abhängig vom Serialisierungsformat müssen Sie Logik implementieren, um Objekte oder Datenstrukturen in das ausgewählte Format zu serialisieren und wieder in ihre ursprüngliche Form zu deserialisieren. Sie können diese Logik mithilfe von Bibliotheken oder Frameworks implementieren, die Serialisierungsfunktionen für das Format bereitstellen.

Optimieren des Datenzugriffs

Das Optimieren des Datenzugriffs bezieht sich auf die Optimierung der Muster und Techniken zum Abrufen und Speichern von Daten, um unnötige Vorgänge zu minimieren. Wenn Sie den Datenzugriff optimieren, können Sie Kosten sparen, indem Sie die Ressourcennutzung reduzieren, den Datenabruf reduzieren und die Effizienz der Datenverarbeitung verbessern. Berücksichtigen Sie Techniken wie Datenzwischenspeicherung, effiziente Datenabfragen und Datenkomprimierung.

Verwenden von Zwischenspeicherungsmechanismen

Das Zwischenspeichern umfasst das Speichern häufig aufgerufener Daten in der Nähe der Komponenten, die sie benötigen. Diese Technik reduziert die Notwendigkeit der Netzwerkdurchquerung, indem die Daten aus dem Cache bereitgestellt werden, anstatt sie über das Netzwerk abzurufen.

Betrachten Sie die folgenden Zwischenspeicherungsmechanismen:

  • Verwenden eines externen Caches: Eine beliebte Zwischenspeicherungslösung ist ein Content Delivery Network. Dies trägt dazu bei, die Latenz zu minimieren und den Netzwerkdurchlauf zu verringern, indem statische Inhalte näher an Den Consumern zwischengespeichert werden.

  • Optimieren der Zwischenspeicherungsparameter: Konfigurieren Sie Zwischenspeicherungsparameter, z. B. Gültigkeitsdauer (Time to Live, TTL), um den Nutzen der Zwischenspeicherung zu optimieren und gleichzeitig potenzielle Nachteile zu minimieren. Durch das Festlegen einer geeigneten Gültigkeitsdauer wird sichergestellt, dass zwischengespeicherte Daten aktuell und relevant bleiben.

  • In-Memory-Zwischenspeicherung verwenden: Erwägen Sie zusätzlich zu externen Zwischenspeicherlösungen die Implementierung von In-Memory-Zwischenspeicherung in Ihrer Anwendung. Die In-Memory-Zwischenspeicherung kann dazu beitragen, Computeressourcen im Leerlauf zu nutzen und die Computedichte der zugeordneten Ressourcen zu erhöhen.

Optimieren des Datenbankdatenverkehrs

Sie können die Effizienz der Anwendungskommunikation mit der Datenbank verbessern. Im Folgenden finden Sie einige wichtige Überlegungen und Techniken zum Optimieren des Datenbankdatenverkehrs:

  • Erstellen von Indizes: Die Indizierung ist der Prozess zum Erstellen von Datenstrukturen, die die Geschwindigkeit des Datenabrufs verbessern. Durch das Erstellen von Indizes für häufig abgefragte Spalten können Sie die Zeit, die zum Ausführen von Abfragen benötigt wird, erheblich reduzieren. Wenn Sie beispielsweise über eine Benutzertabelle mit einer Spalte für Benutzernamen verfügen, können Sie einen Index für die Benutzernamenspalte erstellen, um Abfragen zu beschleunigen, die nach bestimmten Benutzernamen suchen.

    Identifizieren Sie die Spalten, auf die am häufigsten zugegriffen wird, und erstellen Sie Indizes für diese Spalten, um den Datenabruf zu beschleunigen. Analysieren und optimieren Sie die vorhandenen Indizes regelmäßig, um sicherzustellen, dass sie weiterhin effektiv sind. Vermeiden Sie eine Überindizierung, da sie sich negativ auf Einfüge- und Aktualisierungsvorgänge auswirken kann.

  • Optimieren von Abfragen: Entwerfen Sie effiziente Abfragen, indem Sie die spezifischen Datenanforderungen berücksichtigen und unnötige Datenabrufe minimieren. Beginnen Sie mit geeigneten Verknüpfungstypen (z. B. innerer Join und linker Join), basierend auf der Beziehung zwischen Tabellen. Verwenden Sie Abfrageoptimierungstechniken wie Abfragehinweise, Abfrageplananalyse und Abfragewiederholung, um die Leistung zu verbessern.

  • Zwischenspeichern von Abfrageergebnissen: Sie können die Ergebnisse häufig ausgeführter Abfragen im Arbeitsspeicher oder in einem Cache speichern. Nachfolgende Ausführungen derselben Abfrage können dann aus dem Cache bereitgestellt werden, sodass teure Datenbankvorgänge überflüssig sind.

  • Verwenden Sie ein ORM-Framework (Object Relational Mapping): Verwenden Sie ORM-Features wie verzögertes Laden, Zwischenspeichern und Batchverarbeitung, um den Datenabruf zu optimieren und Datenbank-Roundtrips zu minimieren. Verwenden Sie ORM-Frameworks wie Entity Framework für C# oder Hibernate für Java.

  • Optimieren gespeicherter Prozeduren: Analysieren und optimieren Sie die Logik und Leistung gespeicherter Prozeduren. Das Ziel besteht darin, unnötige Berechnungen oder redundante Abfragen in gespeicherten Prozeduren zu vermeiden. Optimieren Sie die Verwendung temporärer Tabellen, Variablen und Cursor, um den Ressourcenverbrauch zu minimieren.

Organisieren von Daten

Die Organisation von Daten für einen effizienten Zugriff und Einen effizienten Abruf umfasst das Strukturieren und Speichern von Daten auf eine Weise, die die Leistung maximiert und den Ressourcenverbrauch minimiert. Sie kann die Antwortzeiten von Abfragen verbessern, die Datenübertragungskosten senken und die Speicherauslastung optimieren.

Im Folgenden finden Sie einige Techniken zum effizienten Organisieren von Daten:

  • Partitionierung: Bei der Partitionierung wird ein großes Dataset in kleinere, besser verwaltbare Teilmengen unterteilt, die als Partitionen bezeichnet werden. Sie können jede Partition separat speichern, um eine parallele Verarbeitung und eine verbesserte Abfrageleistung zu ermöglichen. Beispielsweise können Sie Daten basierend auf einem bestimmten Wertebereich oder durch Verteilen von Daten auf Server partitionieren. Diese Technik kann die Skalierbarkeit verbessern, Konflikte reduzieren und die Ressourcennutzung optimieren.

  • Sharding: Sharding ist eine Technik zur horizontalen Aufteilung von Daten auf mehrere Datenbankinstanzen oder Server. Jeder Shard enthält eine Teilmenge der Daten, und Abfragen können parallel für diese Shards verarbeitet werden. Sharding kann die Abfrageleistung verbessern, indem die Workload verteilt und die Datenmenge reduziert wird, auf die jede Abfrage zugreift.

  • Komprimieren: Bei der Datenkomprimierung wird die Größe der Daten reduziert, um die Speicheranforderungen zu minimieren und die Effizienz der Datenübertragung zu verbessern. Da komprimierte Daten weniger Speicherplatz in Anspruch nehmen, lassen sich Dadurch Einsparungen bei den Speicherkosten erzielen. Komprimierte Daten können auch schneller über Netzwerke übertragen werden und die Datenübertragungskosten senken.

Betrachten Sie beispielsweise ein Szenario, in dem Sie über ein großes Dataset mit Kundeninformationen verfügen. Durch Partitionieren der Daten basierend auf Kundenregionen oder demografischen Daten können Sie die Workload auf mehrere Server verteilen und die Abfrageleistung verbessern. Sie können die Daten auch komprimieren, um die Speicherkosten zu senken und die Effizienz der Datenübertragung zu verbessern.

Optimieren der Architektur

Bewerten Sie Ihre Workloadarchitektur, um Möglichkeiten für die Ressourcenoptimierung zu identifizieren. Ziel ist es, die richtigen Dienste für den richtigen Job zu nutzen.

Um dieses Ziel zu erreichen, müssen Sie möglicherweise Teile der Architektur so umgestalten, dass sie weniger Ressourcen verwenden. Berücksichtigen Sie serverlose oder verwaltete Dienste, und optimieren Sie die Ressourcenzuordnung. Durch die Optimierung Ihrer Architektur können Sie die funktionalen und nicht funktionalen Anforderungen erfüllen und gleichzeitig weniger Ressourcen pro instance verbrauchen.

Verwenden von Entwurfsmustern

Entwurfsmuster sind wiederverwendbare Lösungen, die Entwicklern helfen, wiederkehrende Entwurfsprobleme zu lösen. Sie bieten einen strukturierten Ansatz zum Entwerfen von Code, der effizient, verwaltbar und skalierbar ist.

Entwurfsmuster helfen bei der Optimierung der Nutzung von Systemressourcen, indem Richtlinien für eine effiziente Ressourcenzuordnung und -verwaltung bereitgestellt werden. Beispielsweise trägt das Trennschaltermuster dazu bei, unnötigen Ressourcenverbrauch zu verhindern, indem ein Mechanismus bereitgestellt wird, um Fehler kontrolliert zu behandeln und nach Fehlern wiederherzustellen.

Entwurfsmuster können bei der Kostenoptimierung von Code auf folgende Weise helfen:

  • Verkürzte Entwicklungszeit: Entwurfsmuster bieten bewährte Lösungen für häufige Entwurfsprobleme, die Entwicklungszeit sparen können. Indem Sie etablierten Mustern folgen, können Entwickler sich wiederholende Arbeit vermeiden und sich auf die Implementierung der spezifischen Anforderungen ihrer Anwendungen konzentrieren.

  • Verbesserte Wartbarkeit: Entwurfsmuster fördern modularen und strukturierten Code, der einfacher zu verstehen, zu ändern und zu verwalten ist. Sie können zu Kosteneinsparungen in Bezug auf weniger Debug- und Wartungsaufwand führen.

  • Skalierbarkeit und Leistung: Entwurfsmuster helfen beim Entwerfen skalierbarer und leistungsfähiger Systeme. Muster wie das Cache-Aside-Muster können die Leistung verbessern, indem häufig verwendete Daten zwischengespeichert werden, um die Notwendigkeit für teure Berechnungen oder externe Aufrufe zu reduzieren.

Um Entwurfsmuster zu implementieren, müssen Entwickler die Prinzipien und Richtlinien jedes Musters verstehen und sie im Code anwenden. Erwägen Sie, das geeignete Muster für ein Problem zu identifizieren, dessen Struktur und Komponenten zu verstehen und das Muster in den Gesamtentwurf zu integrieren.

Es stehen verschiedene Ressourcen zur Verfügung, z. B. Dokumentation, Tutorials und Beispielcode. Diese Ressourcen können Entwicklern helfen, Entwurfsmuster effektiv zu erlernen und zu implementieren.

Ändern von Konfigurationen

Überprüfen und aktualisieren Sie Ihre Workloadkonfiguration regelmäßig, um sicherzustellen, dass sie Ihren aktuellen Anforderungen entspricht. Erwägen Sie, die Größen- und Konfigurationseinstellungen für Ressourcen entsprechend den Workloadanforderungen anzupassen. Durch die Optimierung von Konfigurationen können Sie Ressourcen effektiv zuordnen und eine Überbereitstellung vermeiden, um Kosten zu sparen.

Umgestalten der Architektur

Bewerten Sie Ihre Workloadarchitektur, und identifizieren Sie Möglichkeiten für das Umgestalten oder Neugestalten von Komponenten, um den Ressourcenverbrauch zu optimieren. Erwägen Sie Techniken wie die Einführung einer Microservicesarchitektur, die Implementierung des Trennschaltermusters und die Verwendung von serverlosem Computing. Durch die Optimierung Ihrer Architektur können Sie eine bessere Ressourcennutzung und Kosteneffizienz erzielen.

Ändern von Ressourcengrößen

Überwachen und analysieren Sie kontinuierlich die Ressourcenauslastung Ihrer Workload. Passen Sie basierend auf den beobachteten Mustern und Trends die Ressourcendimensionierungs- und Konfigurationseinstellungen an, um den Ressourcenverbrauch zu optimieren.

Erwägen Sie die Berechtigungsanpassung virtueller Computer, das Anpassen der Speicherbelegung und die Optimierung der Speicherkapazität. Durch das Rechteisieren von Ressourcen können Sie unnötige Kosten vermeiden, die mit einer Unter- oder Überbereitstellung verbunden sind.

Kompromiss: Die Überarbeitung von Code und Architektur passt möglicherweise nicht zu den aktuellen Projektplänen und kann zu Zeitplan und Kostenverfall führen.

Azure-Erleichterung

Instrumentierung von Code: Azure bietet Überwachungs- und Protokollierungstools wie Azure Monitor, Application Insights und Log Analytics. Sie können diese Tools verwenden, um die Leistung und das Verhalten Ihres Codes in Echtzeit nachzuverfolgen und zu analysieren.

Identifizieren von Heißen und Optimieren von Pfaden: Application Insights und Application Insights Profiler helfen Ihnen, die heißen Pfade in Ihrem Code zu identifizieren und zu optimieren, indem sie Ausführungszeiten und Ressourcennutzung analysieren. Mit Profiler können Sie unnötige Speicherbelegungen minimieren und die Speicherauslastung optimieren.

Verwenden der richtigen SDKs: Azure bietet SDKs in mehreren Programmiersprachen, die für Leistung und Benutzerfreundlichkeit optimiert sind. Diese SDKs stellen vordefinierte Funktionen und Bibliotheken bereit, die mit Azure-Diensten interagieren, um die Notwendigkeit einer benutzerdefinierten Implementierung zu reduzieren.

Optimieren des Netzwerkdurchlaufs: Verschiedene Azure-Dienste unterstützen Hochgeschwindigkeitsnetzwerkprotokolle wie HTTP/2 und QUIC für eine effiziente Kommunikation zwischen Diensten und Anwendungen.

Azure-Dienste, z. B. Azure Database for PostgreSQL – Flexibler Server, unterstützen Verbindungspooling.

Azure unterstützt die Batchverarbeitung in verschiedenen Diensten, sodass Sie mehrere Vorgänge gruppieren und in einer einzelnen Anforderung ausführen können. Die Batchverarbeitung kann die Effizienz erheblich verbessern und den Netzwerkaufwand reduzieren.

In Bezug auf die Datenserialisierung unterstützt Azure verschiedene Serialisierungsformate, einschließlich JSON und XML. Wählen Sie das geeignete Serialisierungsformat basierend auf Datengröße, Leistungsanforderungen und Interoperabilitätsanforderungen aus.

Optimieren des Datenzugriffs: Azure bietet Zwischenspeicherdienste wie Azure Cache for Redis. Sie können die Zwischenspeicherung verwenden, um häufig verwendete Daten näher bei der Anwendung zu speichern, was zu einem schnelleren Abruf und einer geringeren Back-End-Last führt.

  • Indizierung und Abfrageoptimierung: Azure-Dienste wie Azure SQL Database und Azure Cosmos DB bieten Indizierungsfunktionen zur Optimierung der Abfrageleistung. Indem Sie die richtige Indizierungsstrategie auswählen und Abfragen optimieren, können Sie die Gesamteffizienz des Datenabrufs verbessern.

  • Objektrelationale Zuordnung (ORM): Azure unterstützt ORM-Frameworks wie Entity Framework. Diese Frameworks vereinfachen den Datenzugriff und die Zuordnung zwischen objektorientiertem Code und relationalen oder NoSQL-Datenbanken.

  • Optimieren gespeicherter Prozeduren: Sie können Azure-Dienste wie Azure SQL Database verwenden, um gespeicherte Prozeduren zu erstellen und zu optimieren. Gespeicherte Prozeduren können die Leistung verbessern, indem sie Netzwerk roundtrips reduzieren und SQL-Anweisungen vorkompilieren.

  • Partitionierung und Sharding: Azure bietet Partitionierungs- und Shardfunktionen in Diensten wie Azure Cosmos DB und Azure SQL Database. Mithilfe der Partitionierung können Sie Daten zur Skalierbarkeits- und Leistungsoptimierung auf mehrere Knoten verteilen.

  • Komprimieren von Daten: Azure-Dienste unterstützen Datenkomprimierungstechniken wie GZIP und DEFLATE.

Optimieren der Architektur: Azure bietet Architekturleitfäden und Entwurfsmuster zum Entwerfen skalierbarer, resilienter und leistungsstarker Anwendungen. Weitere Informationen finden Sie unter Entwerfen von Mustern.

Prüfliste zur Kostenoptimierung

Weitere Informationen finden Sie im vollständigen Satz von Empfehlungen.