2. Oktober 2023 von Yelle Lieder
Nachhaltige Softwarearchitektur – Guidelines für ökologisch nachhaltige Softwarearchitekturen
„Über die Nachhaltigkeit von Software wird im Programmcode entschieden.“ Diesem Narrativ folgen viele Handlungsempfehlungen und Manifeste für nachhaltige Software oder Programmierung. Dabei ist das Coding nur eine von vielen Aktivitäten im Software Engineering. Tatsächlich ist der Wirkungsgrad der auf Quellcode-Ebene getroffenen Entscheidung für die Nachhaltigkeit häufig eher gering, verglichen mit anderen Handlungsfeldern des Software Engineering. In diesem Blog-Beitrag mache ich deshalb einen Vorschlag, wie Nachhaltigkeit bereits auf der strukturellen und konzeptionellen Ebene von Software verankert werden kann.
Was macht eine nachhaltige Softwarearchitektur aus?
Nachhaltige Softwarearchitekturen minimieren negative Umweltauswirkungen, indem sie Ressourcenverbräuche reduzieren. Effekte zweiter Ordnung sind die Reduktion der Emissionen durch den Stromverbrauch sowie des Hardware-Bedarfs. Neben der Vermeidung von Treibhausgasemissionen trägt eine nachhaltige Softwarearchitektur also dazu bei, den Wasserfußabdruck der IT zu reduzieren und weniger Elektroschrott zu verursachen. Es wird insgesamt weniger Strom verbraucht und der, der nicht vermieden werden kann, stammt zu einem möglichst großen Anteil aus erneuerbaren Energien. Zudem wird weniger Hardware verwendet und die verbleibende Hardware wird möglichst stark ausgelastet. Maßnahmen, die auf diese Ziele einzahlen, führen zu positiven Kosteneffekten – die jedoch nicht überstrapaziert werden dürfen – sowie einer Steigerung der Leistungsfähigkeit und Resilienz der Software. Die Architektur eines Systems beschreibt seine Struktur, seine Komponenten und deren Schnittstellen, also die eher abstrakte Funktionsweise. Eine nachhaltige Architektur stellt sicher, dass diese abstrakte Sicht auf ein System von Beginn an die Umweltverträglichkeit mitdenkt.
Monitoring und Benchmarking der Nachhaltigkeit von Software
Nachhaltige Softwarearchitekturen setzen von Anfang an ein routinemäßiges Monitoring der Umweltauswirkungen um. Die kontinuierliche Messung ist inhärenter Teil der Architektur, um belastbar und reproduzierbar zu sein. Die Messungen werden verwendet, um die Entwicklung der Umweltauswirkungen – etwa über mehrere Releases hinweg – zu beobachten und zu steuern. Nur wenn von Beginn an die Umweltauswirkungen eines Systems überwacht und dokumentiert werden, können belastbare Aussagen über ökologische Lebenszykluskosten gemacht und kann Greenwashing vermieden werden. Teil jeder nachhaltigen Softwarearchitektur ist daher das kontinuierliche Monitoring der Umweltauswirkungen. Einige Tools für diesen Zweck findet ihr in meinem Blog-Beitrag zum Thema „Nachhaltigkeit von Software testen – wie testet man Nachhaltigkeit als Qualitätseigenschaft von Software?“.
Asynchrone Prozesse für Carbon Aware Software
Nachhaltige Softwarearchitekturen separieren alle Prozesse, die nicht zeitkritisch sind, um sie asynchron ausführbar zu machen. Die Separierung nicht zeitkritischer Prozesse – wie das Training von Modellen, das Laden von E-Autos oder die Generierung von Berichten – ist Grundvoraussetzung dafür, die Ausführung von Workloads nach der Verfügbarkeit von erneuerbaren Energien auszurichten.
Separierung meint hier die Herauslösung des Triggers, sodass die Ausführung nicht nur vom System selbst orchestriert werden kann, sondern auch durch eine Library oder externe API. Indem Strom dann verbraucht wird, wenn er zu Großteilen aus erneuerbaren Energieträgern bezogen wird, kann nicht nur der Footprint von Anwendungen im zweistelligen Prozentbereich reduziert werden. Es können auch Lastspitzen in der digitalen Infrastruktur und damit der Gesamtbedarf an Hardware reduziert werden. Zudem werden zusätzliche wirtschaftliche Anreize für den Ausbau erneuerbarer Energien geschaffen. Oft bleiben Überkapazitäten an erneuerbaren Energien an besonders sonnigen oder windigen Tagen einfach ungenutzt. Wenn diese Kapazitäten zukünftig stärker durch nicht zeitkritische Prozesse softwaregesteuert verbraucht werden, entstehen den Erzeugern mehr Umsätze. Gut separiert ist ein Workload, wenn er auch geographisch unabhängig vom Rest des Systems ausführbar ist. Nachhaltige Architekturen ermöglichen dies, indem von Beginn an nicht zeitkritische Prozesse identifiziert und separiert werden.
Managed Services für höhere Effizienz und Auslastung
Nachhaltige Softwarearchitekturen nutzen Managed Services wie etwa Cloud-Native-Lösungen, die auf besonders effizienter und hochausgelasteter Infrastruktur betrieben werden. Der Betrieb einer hochspezialisierten Anwendung, die optimal auf die darunterliegende Hardware zugeschnitten ist, verspricht Effizienzgewinne. Aufgrund des Auslastungsprofils gängiger IT-Hardware sollte Hardware immer stark ausgelastet werden, da sie bei geringer Auslastung eine unverhältnismäßig hohe elektrische Leistungsaufnahme hat. Werden viele Workloads in wenigen zentralisierten Rechenzentren gebündelt, besteht die Chance auf eine insgesamt deutlich bessere Auslastung. Nachhaltige Softwarearchitekturen berücksichtigen deshalb, dass nicht ausgelastete On-Premises-Infrastrukturen im Gegensatz zu Managed-Services-Infrastrukturen von niemand anderem ausgelastet werden.
Elastizität und Modularität für nachhaltige Skalierung
Nachhaltige Softwarearchitekturen sind modular und ermöglichen Elastizität im Hinblick auf ihre Laufzeit. Durch optimiertes Skalierungsverhalten bis hin zur Abschaltung einzelner Dienste kann so die Leerlauflast einzelner Software-Komponenten reduziert und können ungenutzte Ressourcen freigegeben werden. So lässt sich nicht nur die Auslastung der Infrastruktur passgenau an die Ansprüche der Software anpassen, auch der Gesamtbedarf an Hardware kann dadurch reduziert werden. Ungenutzte Dienste können so beispielsweise außerhalb der Kerngeschäftszeiten oder an Wochenenden abgeschaltet werden. Nachhaltige Architekturen unterstützen durch diese Modularität zudem das Plugin-Paradigma und erlauben es Nutzenden, selbst nachhaltige Entscheidungen zu treffen und für sie nicht relevante Funktionen zu deaktivieren.
Netzwerk-Effizienz für nachhaltige Balance zwischen Bandbreite und Rechenleistung
Nachhaltige Softwarearchitekturen halten die Balance zwischen Übertragungslast und der Effizienz von Berechnungen. Bei der Entscheidung, wo Berechnungen ausgeführt werden, wird daher nicht nur die Effizienz der Ziel-Hardware berücksichtigt, sondern auch die Übertragungslast, um die Daten an den Punkt der Berechnung zu bekommen. Häufig bietet sich ein Offloading von Berechnungen, etwa von Client-Geräten wie Smartphones, an Server in Cloud-Rechenzentren an, da die Server aufgrund höherer Energieeffizienz für dieselbe Berechnung nur einen Bruchteil des Energieverbrauchs erzeugen. Wenn der erzeugte Stromverbrauch für die Übertragung der Daten jedoch höher ist als das Einsparungspotenzial während der Berechnung, kann es sinnvoll sein, die Berechnungen möglichst nah an dem Ort auszuführen, wo die Daten gespeichert sind – selbst wenn die vorhandene Hardware weniger effizient ist. Dies ist etwa häufig bei der Übertragung und Verarbeitung von Videos der Fall. Gute und nachhaltige Architekturen berücksichtigen derartige Zielkonflikte.
Batch I/O für reduzierten Overhead der Datenübertragung
Nachhaltige Softwarearchitekturen bündeln Input- und Output-Operationen, um den Overhead je Operation zu reduzieren. Der Aufbau von Verbindungen für die Datenübertragung kostet in den meisten Anwendungsfällen eine relevante Menge an Ressourcen. Sowohl der TCP-Slow-Start-Algorithmus als auch die Datenlast von http-Headern sorgen dafür, dass die Bündelung von Daten vor der Übertragung nachhaltiger ist. Denn Overhead bedeutet in dem Kontext immer die Verschwendung von Datenlast und einen unnötigen Energieverbrauch, ohne dass diesem ein funktionaler oder qualitativer Mehrwert gegenübersteht. Dies gilt nicht nur für die Übertragung zwischen unterschiedlichen physisch getrennten Systemen oder für Zugriffe auf Datenbanken. Auch lokale Speicheroperationen haben einen relevanten Overhead, der je geschriebenes oder gelesenes Bit reduziert wird, das in einem größeren Batch bewegt wird. Nachhaltige Architekturen berücksichtigen dies in der Definition von Schnittstellen und Interaktionen zwischen Komponenten.
Speicherauslastung reduzieren durch nachhaltige Speicherregeln
Nachhaltige Softwarearchitekturen speichern nur, was essenziell für den Anwendungsfall ist, sind nicht zustandsbehaftet und komprimieren Daten. Dazu muss bereits in der Definition der Architektur festgelegt werden, welche Daten unter welchen Umständen wo gespeichert und wie lange sie höchstens vorgehalten werden. Dies schließt die Unterscheidung zwischen Hot und Cold Storage ein, je nachdem, wie häufig die Daten abgerufen werden. Zudem müssen Mechanismen geplant werden, mit denen Daten vor der Übertragung oder der Speicherung komprimiert werden. Hierbei ist jedoch ein möglicher Zielkonflikt zu berücksichtigen. Einerseits ist die Übertragungs- und Speicherlast durch die Kompression geringer, andererseits kostet auch die Kompression und Dekompression Rechenleistung. Bei der Nutzung von Kompression ist daher zu berücksichtigen, dass die Einsparungen in der Übertragung oder Speicherung nicht bereits durch Kompression und Dekompression ausgeglichen werden. Bezogen auf das Datenverhalten spielt zudem die Zustandsbehaftung von Komponenten eine wichtige Rolle. Wenn Komponenten zur Laufzeit den Zustand speichern, erfolgt dies üblicherweise im Arbeitsspeicher. Da der der Arbeitsspeicher jedoch viel Energie verbraucht, sehen nachhaltige Architekturen zustandslose Komponenten vor. Nachhaltige Architekturen reduzieren durch diese Maßnahmen den mengenmäßigen Bedarf an physischen Speichergeräten, minimieren die übertragene Datenlast und sparen Rechenoperationen für die Bereinigung und Aufbereitung von Daten.
Guidelines für nachhaltige Softwarearchitektur bei adesso
Nachhaltige Softwarearchitekturen beinhalten also Monitoring und Benchmarking, asynchrone Prozesse, Managed Services, Elastizität und Modularität, Netzwerk-Effizienz, Batch I/O und reduzierte Speicherauslastung. Darüber hinaus gibt es noch einige hier nicht explizit genannte weichere Kriterien, etwa zur Kommunikation der Relevanz von Nachhaltigkeit gegenüber Kunden und Partnern sowie zur Technologieauswahl. Ansätze zur nachhaltigen Technologieauswahl finden sich bereits in diesem Blog-Beitrag. Ziel dieser Guidelines ist, Orientierung dabei zu geben, was Softwarearchitekturen nachhaltiger macht. Sie sind in enger Zusammenarbeit mit der adesso Softwarearchitektur-Community entstanden, werden zukünftig in der adesso Softwarearchitektur-Ausbildung vermittelt und spiegeln unsere Einstellung und unsere Selbstverpflichtung zu nachhaltiger Software wider. Vielen Dank an die zahlreichen Kolleginnen und Kollegen für die Mitgestaltung. Analog arbeiten wir übrigens bereits an weiteren Handlungsempfehlungen zur Nachhaltigkeit im Softwareentwicklungsprozess für andere beteiligte Rollen.