Empfehlungen für die Optimierung von Codekosten

Gilt für diese Checkliste für azure Well-Architected Framework Cost Optimization:

CO:11 Optimieren Sie Die Codekosten. Bewerten und ändern Sie Code, um funktionale und nicht funktionsbezogene Anforderungen mit weniger oder günstigeren Ressourcen zu erfüllen.

In diesem Leitfaden werden die Empfehlungen zur Optimierung der Codekosten beschrieben. Die Codeoptimierung ist der Prozess zur Verbesserung der Effizienz, Leistung und Kosteneffizienz von Anwendungscode. Eine effektive Codeoptimierung umfasst Änderungen am Code, 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 Speicherauslastung und den Netzwerkaufwand reduzieren, was zu Anwendungen führen kann, die schneller und reaktionsfähiger sind. Verbesserte Leistung verbessert die Benutzererfahrung und ermöglicht es Ihrem System, größere Workloads effizient zu verarbeiten.

Definitionen

Begriff Definition
Codeinstrumentation Die Vorgehensweise zum Hinzufügen von Codeausschnitten oder Bibliotheken zu Code, die Daten sammeln und die Codeleistung während der Laufzeit überwachen.
Parallelität Die Gleichzeitige Ausführung mehrerer Prozesse.
Serialisierung von Daten Der Prozess der Konvertierung von Datenobjekten in ein Format, das gespeichert oder übertragen werden kann, und anschließend bei Bedarf wieder in ihre ursprüngliche Form zurückkonstruieren.
Heiße Pfade Kritische oder häufig ausgeführte Abschnitte eines Programms, die eine hohe Leistung und geringe Latenz erfordern.

Wichtige Entwurfsstrategien

Die Kostenoptimierung von Code bedeutet, den Code zu verbessern, um die gleiche Funktionalität mit weniger Ressourcen pro Instanz zu erzielen, z. B. CPU-Zyklen, Arbeitsspeicher und Speicher. Durch die Reduzierung des Ressourcenverbrauchs können Sie Geld sparen, wenn Anwendungen große Datenmengen verarbeiten oder eine hohe Datenverkehrslast aufweisen.

Codeverbesserungen sind am effektivsten, wenn Sie anderen Kostenoptimierungsbemühungen hinsichtlich Skalierung, Rechteanpassung, Redundanz und Drosselung folgen. Nachdem Sie sich um diese grundlegenden Elemente kümmern, können Sie die Codeoptimierung in Betracht ziehen.

Möglicherweise wissen Sie nicht, ob Sie ineffizienten Code haben. Serverless-, Autoscale- und Zuverlässigkeitsfeatures können Codeineffizienzen maskieren. Die folgenden Strategien können Ihnen helfen, Anwendungscode zu identifizieren und zu beheben, der mehr kostet, als es sollte.

Instrumentieren des Codes

Instrumentierungscode ist die Methode zum Hinzufügen von Codeausschnitten oder Bibliotheken, die Daten sammeln und die Codeleistung während der Laufzeit überwachen. Es ermöglicht Entwicklern, Informationen zu wichtigen Metriken zu sammeln, z. B. Ressourcenverbrauch (CPU oder Arbeitsspeicherauslastung) und Ausführungszeit. Durch die Instrumentierung von Code können Entwickler Einblicke in Code-Hot-Pfade erhalten, Leistungsengpässe identifizieren und den Code für eine bessere Effizienz und Kosteneffizienz optimieren.

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

Automatisieren Sie so viel dieser Codeanalyse wie möglich. Verwenden Sie dynamische und statische Tools für die Codeanalyse, um den manuellen Aufwand zu reduzieren. Denken Sie jedoch daran, dass diese Tests immer noch eine Simulation der Produktion sind. Die Produktion bietet das klare Verständnis der Codeoptimierung.

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

Optimieren von heißen Pfaden

Durch die Instrumentierung Ihres Codes können Sie den Ressourcenverbrauch von Codepfaden messen. Diese Messungen helfen Ihnen, heiße Pfade zu identifizieren. Hot paths have a significant effect on performance and resource usage. Sie sind kritische oder häufig ausgeführte Abschnitte eines Programms, die hohe Leistung und niedrige Latenz erfordern.

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

  • Analysieren Sie Laufzeitdaten: Sammeln und analysieren Sie 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 Codeabschnitten, die häufig ausgeführt werden oder lange dauern, bis sie abgeschlossen sind.

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

  • Berücksichtigen Sie Geschäftslogik und Benutzereffekt: Bewerten Sie die Bedeutung von Codepfaden basierend auf ihrer Relevanz für die Funktionalität oder kritische Geschäftsvorgänge der Anwendung. Bestimmen Sie, welche Codepfade für die Bereitstellung von Werten für Benutzer oder erfüllen die Leistungsanforderungen von entscheidender Bedeutung sind.

    Überprüfen Sie leistungsspezifische Empfehlungen für die Programmiersprache, mit der Sie arbeiten. Bewerten Sie Ihren Code anhand dieser Empfehlungen, um Verbesserungsbereiche zu identifizieren. Entfernen Sie unnötige Vorgänge innerhalb des Codepfads, die sich auf die Leistung auswirken können.

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

  • Minimieren Sie Protokollierungsvorgänge: Die Protokollierung kann für das Debuggen und die Analyse hilfreich sein, aber ü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 Sie Schleifen und Bedingungen: Analysieren Sie Schleifen und Bedingungen in Ihrem Code. Identifizieren Sie unnötige Iterationen oder Bedingungen, die Sie beseitigen können. Die Vereinfachung und Optimierung dieser Strukturen kann die Leistung Ihres Codes verbessern.

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

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

  • Minimieren Sie Zuordnungen: Identifizieren Sie Bereiche, in denen übermäßige Speicherzuweisung 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.

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

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

Kompromiss: Das Optimieren von Code und hot paths erfordert Entwicklerkenntnisse bei der Identifizierung von Codeineffizienzen. Diese hochqualifizierten Personen müssen möglicherweise Zeit mit anderen Aufgaben verbringen.

Auswerten 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 reduzieren können. Durch den Einsatz von asynchroner Verarbeitung, Multithreading oder Multiprocessing können Sie mehr Aufgaben mit denselben Ressourcen erledigen. Es ist jedoch wichtig, eine ordnungsgemäße Implementierung sicherzustellen, um mehr Aufwand zu vermeiden und die Kosteneffizienz aufrechtzuerhalten.

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

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

    Ermitteln 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 sie unterstützt, z async/await . B. in .NET oder Zusagen in JavaScript.

    Strukturieren Sie Ihren Code so, dass asynchrone Programmierkonstrukte verwendet werden, indem sie die Ausführung von Aufgaben ohne Blockierung ermöglichen. Entkoppeln Sie lang ausgeführte oder E/A-intensive Vorgänge aus dem Hauptausführungsthread mithilfe asynchroner Methoden oder Rückrufe. Verwenden Sie asynchrone APIs oder Bibliotheken, die von Ihrer Programmiersprache oder Ihrem Framework bereitgestellt werden, um asynchrone Workflows zu verarbeiten.

  • Multithreading: Bei 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 die Dokumentation oder Richtlinien, die speziell für die Programmiersprache oder das Framework gelten, 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 Semaphoren, um die Threadsicherheit sicherzustellen 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ätskontrolle zu vereinfachen.

  • Multiprocessing: Multiprocessing kann Prozesse parallel ausführen lassen. Sie kann eine bessere Auslastung mehrerer CPU-Kerne als Multithreading bieten.

    Bestimmen 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 seine Multiprocessing-Funktionen. Betrachten Sie z. B. das Multiprocessing-Modul in Python oder parallelen Streams in Java. Entwerfen Sie Ihren Code, um die Workload in mehrere unabhängige Aufgaben aufzuteilen, die gleichzeitig verarbeitet werden können.

    Verwenden Sie Multiprocessing-APIs oder -Bibliotheken, um parallele Prozesse zu erstellen und zu verwalten. Verteilen Sie die Arbeitsauslastung zwischen diesen APIs oder Bibliotheken. Um die Koordination und datenfreigabe zwischen mehreren Prozessen zu ermöglichen, implementieren Sie Kommunikationsmechanismen wie Interprocess Communication (IPC), gemeinsam genutzten Speicher oder Nachrichtenübergaben, je nach Programmiersprache oder Framework.

Verwenden sie die richtigen SDKs

Wählen Sie für die Kostenoptimierung SDKs aus, die für die Optimierung der Ressourcennutzung und zur Verbesserung der Leistung konzipiert sind. 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 Anleitungen zum Auswählen der besten SDKs für Ihre Workload:

  • Durchführen von Leistungstests: Vergleichen Der Ressourceneinsatz und die Leistung von SDKs durch Leistungstests. Wählen Sie das SDK aus, das Ihre Anforderungen in Bezug auf Ressourcenoptimierung und Leistungsverbesserung am besten erfüllt. Integrieren Sie das ausgewählte SDK in Ihre Codebasis, indem Sie die bereitgestellten Dokumentationen und Richtlinien befolgen.

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

Auswählen des richtigen Betriebssystems

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

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

  • Bewerten Sie Ihre Anforderungen: Verstehen Sie die spezifischen Anforderungen Ihrer Workload, einschließlich der Codierungssprachen und Frameworks, die Sie verwenden. Berücksichtigen Sie Abhängigkeiten oder Integrationen mit anderen Systemen.

  • Erwägen Sie die Kompatibilität: Stellen Sie sicher, dass das von Ihnen ausgewählte Betriebssystem mit Ihren Codierungssprachen, Frameworks und allen von Ihnen verwendeten Bibliotheken oder Tools von Drittanbietern kompatibel ist. Überprüfen Sie die Dokumentation und community-Unterstützung für das Betriebssystem, um sicherzustellen, dass sie über eine gute Kompatibilität mit Ihrem Technologiestapel verfügt.

  • Bewerten der Funktionalität: Ermitteln Sie, ob das alternative Betriebssystem die gleiche oder ähnliche Funktionalität wie Ihr aktuelles Betriebssystem unterstützt. Bewerten Sie, ob sie die erforderlichen Features und Funktionen bereitstellt, die Ihre Workload erfordert.

  • Kosten vergleichen: Vergleichen Sie die Kosten, die mit Betriebssystemen verbunden sind. Berücksichtigen Sie Faktoren wie Lizenzgebü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 Sie Leistung und Optimierung: Bewerten Sie die Leistung und Optimierungsfunktionen des alternativen Betriebssystems. Suchen Sie nach Benchmarks, Fallstudien oder Leistungsvergleichen, um zu verstehen, wie sie in realen Szenarien funktioniert.

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

  • Erwägen Sie den Anbietersupport: Bewerten Sie den Anbietersupport, der für das alternative Betriebssystem verfügbar ist. Überprüfen Sie, ob es offizielle Supportkanäle, Dokumentationen und eine Community von Benutzern gibt, die Unterstützung bei Bedarf bereitstellen können.

Optimieren des Netzwerkdatenverkehrs

Das Optimieren der Netzwerkdurchquerung geht es darum, den Netzwerkdatenverkehr zwischen Workloadkomponenten zu minimieren. Die Datenübertragung hat häufig kostenaufwend. Durch die Minimierung des Netzwerkdatenverkehrs können Sie die Datenmenge reduzieren, die übertragen werden muss, während die Kosten gesenkt werden.

Analysieren Sie Ihre Arbeitsauslastung, 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 aus einer anderen Komponente anfordert, ist es ein Kandidat für die Optimierung. Sie können Ihren Code umgestalten, um unnötige Aufrufe oder Batchanforderungen zu reduzieren, wodurch die übertragenen Daten minimiert werden. Anwendungen senden möglicherweise ganze Objekte oder Datenstrukturen, 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 jeder Datenübertragung.

Optimieren von Netzwerkprotokollen

Netzwerkprotokolle spielen eine entscheidende Rolle bei der 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 hinsichtlich der Geschwindigkeit der Datenübertragung bekannt sind und den Aufwand minimieren. 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 Latenz reduziert und die Datenübertragung optimiert wird. 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 verringern. Die Komprimierung kann die über das Netzwerk übertragene Datenmenge erheblich reduzieren, was zu einer verbesserten Leistung und einer geringeren Bandbreitennutzung führt. Die serverseitige Komprimierung ist in der Regel in der Anwendungscode- oder Serverkonfiguration aktiviert.

  • Nutzen von Verbindungspooling: Die Verbindungspooling ermöglicht die Wiederverwendung von etablierten Netzwerkverbindungen, um den Aufwand für die Einrichtung neuer Verbindungen für jede Anforderung zu verringern. Das Verbindungspooling kann die Effizienz der Netzwerkkommunikation verbessern, indem der Aufwand für die Verbindungseinrichtung und -abbruch vermieden wird. Wählen Sie eine Verbindungspoolbibliothek oder ein Framework aus, und konfigurieren Sie sie so, dass sie den Workloadanforderungen entspricht.

  • Implementieren Sie andere Optimierungen: Erkunden Sie andere Optimierungen, die für Ihre Workload und Netzwerkumgebung spezifisch sind. Sie können z. B. Inhaltszwischenspeicherung, Lastenausgleich und Datenverkehrsgestaltung verwenden, um die Netzwerkweiterleitung weiter zu optimieren.

Minimieren des Netzwerkaufwands

Minimieren Sie die Menge des Netzwerkdatenverkehrs und die Datenübertragung zwischen Komponenten Ihrer Workload. Durch die Verringerung des Netzwerkaufwands können Sie die Kosten für den Datenausgang und -ausgang senken und die Gesamtleistung des Netzwerks verbessern.

Berücksichtigen Sie die folgenden Techniken:

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

  • Optimieren Sie die Datengröße: Überprüfen Sie die zwischen Komponenten oder Systemen übertragenen Daten, und suchen Sie nach Möglichkeiten, ihre Größe zu minimieren. Berücksichtigen Sie Techniken wie das Komprimieren der Daten vor der Übertragung oder die Verwendung effizienterer Datenformate. Indem Sie die Datengröße verringern, können Sie die Netzwerkbandbreite verringern und die Gesamteffizienz verbessern.

  • Batchanforderungen: Ziehen Sie ggf. in Betracht, mehrere kleinere Anforderungen in einer einzigen größeren Anforderung zu stapeln. Die Batchverarbeitung reduziert den Aufwand für das Einrichten mehrerer Verbindungen und verringert die gesamte Datenübertragung.

  • Verwenden Sie die Daten serialisierung: Die Daten serialisierung ist der Prozess der Konvertierung komplexer Datenstrukturen oder Objekte in ein Format, 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 typierte Definitionsdateien, um Nachrichtenstrukturen zu definieren.
    MessagePack Ein binäres Serialisierungsformat für die kompakte Übertragung über den Draht. Es unterstützt verschiedene Datentypen und bietet schnelle Serialisierungs- und Deserialisierungsleistung.
    JavaScript Object Notation (JSON) Ein weit verbreitetes Daten serialisierungsformat, mit dem menschenlesbar und einfach zu arbeiten 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 entwickelt wurde. BSON enthält zusätzliche Datentypen, die in JSON nicht verfügbar sind.

    Je nach Serialisierungsformat müssen Sie Logik implementieren, um Objekte oder Datenstrukturen in das ausgewählte Format zu serialisieren und sie 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 den Ressourceneinsatz reduzieren, den Datenabruf reduzieren und die Effizienz der Datenverarbeitung verbessern. Berücksichtigen Sie Techniken wie das Zwischenspeichern von Daten, effiziente Datenabfragen und Datenkomprimierung.

Verwenden von Zwischenspeicherungsmechanismen

Zwischenspeichern umfasst das Speichern häufig aufgerufener Daten näher an den Komponenten, die sie erfordern. Diese Technik reduziert die Notwendigkeit der Netzwerk-Traversal, indem die Daten aus dem Cache bereitgestellt werden, anstatt sie über das Netzwerk abzurufen.

Berücksichtigen Sie diese Zwischenspeicherungsmechanismen:

  • Verwenden Sie einen externen Cache: Eine beliebte Cachelösung ist ein Netzwerk für die Inhaltsübermittlung. Sie trägt dazu bei, die Latenz zu minimieren und die Netzwerk-Traversal zu reduzieren, indem statische Inhalte näher an Die Verbraucher zwischengespeichert werden.

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

  • Verwenden Sie die Zwischenspeicherung im Arbeitsspeicher: Zusätzlich zu externen Cachelösungen sollten Sie die In-Memory-Zwischenspeicherung in Ihrer Anwendung implementieren. Die Zwischenspeicherung im Arbeitsspeicher kann dazu beitragen, Leerlauf-Computeressourcen 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 zur Optimierung des Datenbankdatenverkehrs:

  • Erstellen von Indizes: Die Indizierung ist der Prozess der Erstellung von Datenstrukturen, die die Geschwindigkeit des Datenabrufs verbessern. Durch das Erstellen von Indizes für häufig abgefragte Spalten können Sie die Zeit für die Ausführung von Abfragen 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 am häufigsten verwendeten Spalten, 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 der Verwendung geeigneter Verknüpfungstypen (z. B. innerer Verknüpfung und linker Verknüpfung), basierend auf der Beziehung zwischen Tabellen. Verwenden Sie Abfrageoptimierungstechniken wie Abfragehinweise, Abfrageplananalyse und Abfrageumschreibung, um die Leistung zu verbessern.

  • Cacheabfrageergebnisse: Sie können die Ergebnisse von häufig ausgeführten Abfragen im Arbeitsspeicher oder in einem Cache speichern. Nachfolgende Ausführungen derselben Abfrage können dann aus dem Cache bereitgestellt werden, wodurch die Notwendigkeit für teure Datenbankvorgänge beseitigt wird.

  • Verwenden Sie ein objektrelationales Zuordnungsframework (ORM): Verwenden Sie ORM-Features wie faules 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 Ruhezustand für Java.

  • Optimieren gespeicherter Prozeduren: Analysieren und Optimieren der Logik und Leistung gespeicherter Prozeduren. Ziel ist es, 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

Das Organisieren von Daten für effizienten Zugriff und Abruf umfasst das Strukturieren und Speichern von Daten auf eine Weise, die die Leistung maximiert und den Ressourcenverbrauch minimiert. Sie kann die Abfrageantwortzeiten verbessern, die Kosten für die Datenübertragung reduzieren und die Speicherauslastung optimieren.

Hier sind einige Techniken zum effizienten Organisieren von Daten:

  • Partition: Die Partitionierung umfasst das Aufteilen eines großen Datasets in kleinere, verwaltbare Teilmengen, die als Partitionen bezeichnet werden. Sie können jede Partition separat speichern, um die parallele Verarbeitung und verbesserte Abfrageleistung zu ermöglichen. Sie können z. B. Daten auf Der Grundlage eines bestimmten Wertebereichs partitionieren oder Daten auf servernübergreifend verteilen. Diese Technik kann die Skalierbarkeit verbessern, die Kapazitätsauslastung reduzieren und die Ressourcennutzung optimieren.

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

  • Komprimierung: Die Datenkomprimierung reduziert die Größe der Daten, um die Speicheranforderungen zu minimieren und die Effizienz der Datenübertragung zu verbessern. Da komprimierte Daten weniger Speicherplatz belegen, können Sie speicherkosten sparen. Komprimierte Daten können auch schneller über Netzwerke übertragen und die Datenübertragungskosten reduzieren.

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 Arbeitsauslastung auf mehreren Servern 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 des Lösungsdesigns

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 umgestalten, um weniger Ressourcen zu 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 funktionsfreien Anforderungen erfüllen und gleichzeitig weniger Ressourcen pro Instanz verbrauchen.

Verwenden von Entwurfsmustern

Entwurfsmuster sind wiederverwendbare Lösungen, mit denen Entwickler wiederkehrende Designprobleme lösen können. Sie bieten einen strukturierten Ansatz zum Entwerfen von Code, der effizient, verwaltet und skalierbar ist.

Entwurfsmuster helfen bei der Optimierung der Verwendung von Systemressourcen, indem Richtlinien für eine effiziente Ressourcenzuordnung und -verwaltung bereitgestellt werden. Das Schaltkreistrennmuster verhindert beispielsweise den unnötigen Ressourcenverbrauch, indem ein Mechanismus zum Behandeln und Wiederherstellen von Fehlern auf kontrollierte Weise bereitgestellt wird.

Entwurfsmuster können die Kostenoptimierung von Code auf folgende Weise unterstützen:

  • Reduzierte Entwicklungszeit: Entwurfsmuster bieten bewährte Lösungen für häufige Designprobleme, die Entwicklungszeit sparen können. Durch das Folgen etablierter Muster können Entwickler sich wiederholende Arbeit vermeiden und sich auf die Implementierung der spezifischen Anforderungen ihrer Anwendungen konzentrieren.

  • Verbesserte Wartung: Entwurfsmuster fördern modularen und strukturierten Code, der einfacher zu verstehen, zu ändern und zu verwalten ist. Sie können zu Kosteneinsparungen bei reduzierten Debugging- und Wartungsanstrengungen 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 zugegriffene Daten zwischengespeichert werden, um die Notwendigkeit teurer Berechnungen oder externer Aufrufe zu verringern.

Um Entwurfsmuster zu implementieren, müssen Entwickler die Prinzipien und Richtlinien der einzelnen Muster verstehen und im Code anwenden. Erwägen Sie, das geeignete Muster für ein Problem zu identifizieren, ihre Struktur und Komponenten zu verstehen und das Muster in das gesamtdesign zu integrieren.

Verschiedene Ressourcen sind verfügbar, z. B. Dokumentation, Lernprogramme 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 Anpassung von Ressourcenanpassungen und Konfigurationseinstellungen basierend auf Workloadanforderungen. Durch die Optimierung von Konfigurationen können Sie Ressourcen effektiv zuordnen und eine Überteilung vermeiden, um Kosten zu sparen.

Umgestaltungsarchitektur

Bewerten Sie Ihre Workloadarchitektur, und identifizieren Sie Möglichkeiten für die Umgestaltung oder Neugestaltung von Komponenten, um den Ressourcenverbrauch zu optimieren. Erwägen Sie Techniken wie die Übernahme einer Microservices-Architektur, die Implementierung des Schaltkreistrennmusters und die Verwendung von serverlosen Computern. Durch die Optimierung Ihrer Architektur können Sie eine bessere Ressourcenauslastung und Kosteneffizienz erzielen.

Ändern von Ressourcengrößen

Überwachen und analysieren Sie kontinuierlich die Ressourcenauslastung Ihrer Arbeitsauslastung. Passen Sie basierend auf den beobachteten Mustern und Trends die Größenanpassung und Die Konfigurationseinstellungen der Ressourcen an, um den Ressourcenverbrauch zu optimieren.

Erwägen Sie die Rechteverwaltung virtueller Computer, das Anpassen der Speicherzuweisung und die Optimierung der Speicherkapazität. Durch die Rechteverwaltung von Ressourcen können Sie unnötige Kosten vermeiden, die mit der Unternutzung oder überlastung verbunden sind.

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

Azure-Erleichterung

Instrumentierungscode: 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 Pfaden: Application Insights und Application Insights Profiler helfen, die heißen Pfade in Ihrem Code zu identifizieren und zu optimieren, indem Sie Ausführungszeiten und Ressourcennutzung analysieren. Sie können unnötige Speicherzuweisungen minimieren und die Speicherauslastung mit Profiler optimieren.

Verwenden sie die richtigen SDKs: Azure bietet SDKs in mehreren Programmiersprachen, optimiert für Leistung und Benutzerfreundlichkeit. Diese SDKs bieten vorgefertigte Funktionen und Bibliotheken, die mit Azure-Diensten interagieren, um den Bedarf an benutzerdefinierter Implementierung zu verringern.

Optimieren der Netzwerkdurchquerung: 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-Datenbank für PostgreSQL – Flexibler Server, Unterstützen des Verbindungspoolings.

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

Bei der Daten serialisierung Azure-Support verschiedene Serialisierungsformate, einschließlich JSON und XML. Wählen Sie das entsprechende Serialisierungsformat basierend auf Datengröße, Leistungsanforderungen und Interoperabilitätsanforderungen aus.

Optimieren des Datenzugriffs: Azure bietet Cachedienste wie Azure Cache für Redis. Sie können zwischenspeichern, um häufig verwendete Daten näher an der Anwendung zu speichern, was zu einem schnelleren Abrufen und reduzierter Back-End-Auslastung führt.

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

  • Objektrelationale Zuordnung (ORM): Azure-Support s 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-Datenbank verwenden, um gespeicherte Prozeduren zu erstellen und zu optimieren. Gespeicherte Prozeduren können die Leistung verbessern, indem Sie Netzwerk-Roundtrips und SQL-Anweisungen vorkompilieren.

  • Partitionierung und Sharding: Azure bietet Partitionierungs- und Sharding-Funktionen in Diensten wie Azure Cosmos DB und Azure SQL-Datenbank. Mithilfe der Partitionierung können Sie Daten über mehrere Knoten verteilen, um Skalierbarkeit und Leistungsoptimierung zu ermöglichen.

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

Optimierung der Architektur: Azure bietet Architekturanleitungen und Entwurfsmuster für das Entwerfen skalierbarer, robuster und performanter Anwendungen. Weitere Informationen finden Sie unter Entwurfsmuster.

Checkliste zur Kostenoptimierung

Lesen Sie den vollständigen Satz von Empfehlungen.