Leistungseffizienz
Leistungseffizienz stellt sicher, dass die Software die verfügbaren Ressourcen optimal nutzt und unter Lastbedingungen gut funktioniert. Sie besteht aus verschiedenen Untermerkmalen:
Zeitverhalten beschreibt, wie schnell die Software auf Eingaben reagiert und Aufgaben erledigt. Dies umfasst Ladezeiten und Antwortzeiten, die entscheidend für eine positive Benutzererfahrung sind.
Ressourcennutzung stellt sicher, dass die Software die vorhandenen Systemressourcen, wie CPU, Speicher und Netzwerkbandbreite, effizient nutzt. Dies reduziert den Ressourcenverbrauch und erhöht die Leistungsfähigkeit.
Kapazität garantiert, dass die Software in der Lage ist, eine bestimmte Menge an Daten oder Benutzern zu verarbeiten, ohne an Leistung zu verlieren. Dies ist wichtig für die Skalierbarkeit und Zukunftssicherheit der Anwendung.
Folgende Qualitätstaktiken können Anforderungen bezüglich der Leistungseffizienz erfüllen:
Caching
Häufig benötigte Daten zwischenspeichern
Caching hält Daten, die oft gelesen, aber selten geändert werden, nach dem ersten Abruf in einem schnellen Zwischenspeicher. Dies kann im Arbeitsspeicher, auf schnellen SSDs oder speziellen Cache-Servern wie Redis oder Memcached erfolgen. Bei erneuten Zugriffen liest das System die Daten direkt aus dem Cache, ohne langsamere Festplatten oder Datenbanken zu belasten. Strategien wie Time-to-Live (TTL), Cache-Aside oder Write-Through steuern, wann Einträge aktualisiert oder invalidiert werden. Caching reduziert die Antwortzeiten und erhöht den Durchsatz, erfordert aber eine durchdachte Invalidierungsstrategie, um veraltete Daten zu vermeiden.
Fördert: Zeitverhalten, Ressourcennutzung
Konsequenzen: Erhöhter Speicherverbrauch, Gefahr veralteter Daten bei unzureichender Cache-Invalidierung.
#Caching #Zwischenspeicherung #Performanceoptimierung
Lastverteilung
Last auf mehrere parallel arbeitende Verarbeitungseinheiten aufteilen
Lastverteilung verteilt Anfragen und Aufgaben auf mehrere Server, Prozessoren oder Threads, damit keine einzelne Einheit zum Engpass wird. Algorithmen wie Round-Robin, Least-Connections oder gewichtete Verteilung wählen das Ziel anhand aktueller Kapazität und Verfügbarkeit. Hardware-Load-Balancer, Reverse Proxies wie NGINX oder anwendungsseitiges Routing decken unterschiedliche Skalierungsanforderungen ab. Health Checks prüfen laufend die Backend-Knoten und entfernen nicht reagierende Instanzen aus dem Pool, sodass der Verkehr nur gesunde Ziele erreicht. Antwortzeiten sinken, weil parallele Verarbeitungseinheiten die Arbeitslast teilen, während die gleichmäßige Ressourcennutzung aller Knoten Verschwendung unter Spitzenlast reduziert.
Fördert: Zeitverhalten, Ressourcennutzung
Fördert auch: Kapazität
Konsequenzen: Erhöhte Komplexität, Notwendigkeit der Synchronisation und Zustandsverwaltung.
#Lastverteilung #LoadBalancing #Skalierung
Asynchrone Verarbeitung
Aufrufe und Ausführungen durch Asynchronität voneinander entkoppeln
Asynchrone Verarbeitung reiht Anfragen und Aufträge in eine Warteschlange ein, statt sie direkt zu bearbeiten. Message Broker wie RabbitMQ, Apache Kafka oder Amazon SQS entkoppeln Sender und Empfänger zuverlässig. Die aufrufende Komponente erhält sofort eine Bestätigung und kann weitere Anfragen stellen. Separate Verarbeitungseinheiten (Worker) arbeiten die Warteschlange unabhängig ab, was die Nebenläufigkeit erhöht und blockierende Aufrufe vermeidet. Asynchrone Verarbeitung verkürzt die Reaktionszeiten für Aufrufer und ermöglicht eine unabhängige Skalierung von Produzenten und Konsumenten nach ihrem jeweiligen Bedarf.
Fördert: Zeitverhalten, Ressourcennutzung
Fördert auch: Kapazität
Konsequenzen: Erhöhte Komplexität bei Fehlerbehandlung und Überwachung der Verarbeitung.
#AsynchroneVerarbeitung #Entkopplung #Nebenläufigkeit