title: Supporting architecture evolution in microservice-based systems and infrastructure-as-code based deployments
Creators: name: Ntentos, Evangelos
Publisher: name: :none
Year: 2023

description: Microservice-Systeme sind ein moderner Ansatz für die Softwarearchitektur, bei dem eine große, monolithische Anwendung in kleinere, unabhängig einsetzbare Dienste zerlegt wird. Diese Dienste kommunizieren über genau definierte APIs miteinander und ermöglichen so eine höhere Skalierbarkeit, Flexibilität und Belastbarkeit. Der traditionelle Ansatz der Softwareentwicklung bestand darin, große, monolithische Anwendungen zu erstellen, die alle für das System benötigten Funktionen enthielten. Dieser Ansatz erleichterte zwar die Entwicklung und Bereitstellung von Anwendungen, führte aber auch zu einer Reihe von Problemen, wie z. B. erhöhter Komplexität, geringerer Skalierbarkeit und Schwierigkeiten bei der Wartung und Aktualisierung der Anwendung. Im Gegensatz dazu bieten Microservice-Systeme eine Reihe von Vorteilen gegenüber monolithischen Anwendungen. So kann beispielsweise jeder Microservice unabhängig entwickelt, getestet und bereitgestellt werden, was schnellere und effizientere Entwicklungszyklen ermöglicht. Dies ermöglicht auch eine einfachere Skalierung einzelner Dienste, da nur die Dienste, die zusätzliche Ressourcen benötigen, skaliert werden müssen, und nicht die gesamte Anwendung. Ein weiterer entscheidender Vorteil von Microservice-Systemen ist die erhöhte Ausfallsicherheit. Da jeder Dienst unabhängig eingesetzt wird, können bei einem Ausfall eines Dienstes die anderen Dienste im System normal weiterarbeiten. Dies ermöglicht robustere Systeme, die auch bei einem Ausfall einzelner Dienste weiterarbeiten können. Zusätzlich zu diesen Vorteilen bieten Microservice-Systeme auch eine bessere Skalierbarkeit, da die Dienste über mehrere Knoten oder Standorte verteilt werden können, um wechselnden Anforderungen gerecht zu werden. Auf diese Weise kann das System eine höhere Last und einen größeren Datenverkehr bewältigen und gleichzeitig ein hohes Leistungsniveau beibehalten. Eine der größten Herausforderungen von Microservice-Systemen ist die Verwaltung der Kommunikation und Integration zwischen den Diensten. Um diese Herausforderung zu bewältigen, verwenden Microservice-Systeme genau definierte APIs, damit die Dienste auf konsistente und vorhersehbare Weise miteinander kommunizieren können. Dies ermöglicht die Entwicklung komplexerer Systeme, die sich leichter verwalten und aktualisieren lassen. Eine weitere Herausforderung bei Microservice-Systemen besteht darin, sicherzustellen, dass die Dienste systemweit einheitlich bereitgestellt und verwaltet werden. Um diese Herausforderung zu bewältigen, setzen viele Unternehmen DevOps-Verfahren ein, z. B. kontinuierliche Integration und Bereitstellung, um die Bereitstellung und Verwaltung von Diensten zu automatisieren. Auf diese Weise wird sichergestellt, dass die Dienste im gesamten System einheitlich bereitgestellt und verwaltet werden, während gleichzeitig das Risiko manueller Fehler verringert und die Geschwindigkeit und Effizienz des Bereitstellungsprozesses verbessert wird. Obwohl es etablierte Muster und dokumentierte Best Practices gibt, weichen die tatsächlichen Implementierungen oft davon ab, und es ist schwierig, dies bei großen Systemen manuell zu beurteilen. Eine der größten Herausforderungen in der Software-Architektur ist die Vermeidung von Drift und Erosion des Architekturmodells, was sich bei Microservice-basierten Systemen aufgrund häufiger Änderungen und der Verwendung mehrerer Technologien noch verschärft. Bestehende Lösungen zur Rekonstruktion von Architekturmodellen können diese Herausforderungen nicht bewältigen, da sie mit der kontinuierlichen Entwicklung, der Genauigkeit und den polyglotten Einstellungen zu kämpfen haben. Das Aufspüren von Verstößen in komplexen oder großen Systemen kann schwierig und mühsam sein. Die Komplexität der Entwicklung und des Einsatzes von Microservice-basierten Systemen hat zugenommen und ist zu einer Herausforderung geworden, da häufige Releases erforderlich sind und eine beträchtliche Anzahl von Infrastrukturknoten für den Systembetrieb notwendig ist. Infrastructure as Code (IaC) ist eine Praxis, die die Verwendung von Konfigurationsdateien, Skripten und anderen Code-Artefakten zur Verwaltung und Bereitstellung der zugrunde liegenden Infrastruktur für ein Softwaresystem beinhaltet. Dies ermöglicht eine automatisierte und wiederholbare Bereitstellung und Verwaltung der Infrastruktur, was für die Gewährleistung der Stabilität und Zuverlässigkeit von Microservice-Systemen entscheidend ist. Bei der Bereitstellung von Microservices in einer Produktionsumgebung ist es wichtig, eine gut konzipierte Infrastruktur zu haben, die die Anforderungen der Services unterstützt. Dazu gehören ausreichende Rechenressourcen, Netzwerkkonnektivität, Speicherplatz und andere Ressourcen, die für die effektive Ausführung der Dienste erforderlich sind. IaC automatisiert und standardisiert die Verwaltung der Infrastruktur und ermöglicht die effiziente Bereitstellung neuer Dienste, die Skalierung bestehender Dienste und Updates. Die Definition der Infrastruktur als Code ermöglicht die Versionierung, das Testen und die Zusammenarbeit und verbessert die Zuverlässigkeit und Wiederholbarkeit des Bereitstellungsprozesses. IaC kann auf verschiedene Arten von Infrastruktur angewendet werden, darunter virtuelle Maschinen, Container und Cloud-Ressourcen. Im Kontext von Microservice-Systemen kann IaC besonders wertvoll sein, da es die Bereitstellung und Verwaltung der Infrastruktur auf eine Weise ermöglicht, die auf die Anforderungen der Microservices zugeschnitten ist. Trotz der weiten Verbreitung von IaC fehlt es an Methoden zur Bewertung der Architekturkonformität und zur Behandlung von Architekturproblemen, wie z. B. der losen Kopplung, in IaC-basierten Implementierungen. Zusammenfassend lässt sich sagen, dass IaC und Microservices komplementäre Technologien sind, die zusammen verwendet werden können, um Softwaresysteme auf skalierbare, flexible und zuverlässige Weise bereitzustellen und zu verwalten. Durch die Automatisierung der Bereitstellung und Verwaltung der Infrastruktur hilft IaC, das Risiko manueller Fehler zu verringern und die Geschwindigkeit und Effizienz des Bereitstellungsprozesses insgesamt zu verbessern. In dieser Arbeit haben wir eine gründliche und qualitative Untersuchung von Best Practices und Mustern in der Microservice-Datenmanagement-Architektur anhand von Beschreibungen von Praktiker*innen durchgeführt. Mit Hilfe eines modellbasierten qualitativen Forschungsansatzes haben wir ein formales Architekturentscheidungsmodell entwickelt. Beim Vergleich der Vollständigkeit unseres Modells mit einem bestehenden Musterkatalog stellten wir fest, dass es den Aufwand und die Ungewissheit, die mit dem Verstehen von Microservice-Datenmanagement-Entscheidungen verbunden sind, erheblich reduziert. Wir haben einen Ansatz zur Abstraktion von Architekturmodellen entwickelt, der ein besseres Verständnis der Architekturmodelle komplexer Systeme, die sich im Laufe der Zeit weiterentwickeln, ermöglichen würde. Wir haben zwei mögliche Ansätze identifiziert und anhand einer empirischen Fallstudie evaluiert: einen opportunistischen Ansatz und einen wiederverwendbaren halbautomatischen detektorbasierten Ansatz. Darüber hinaus haben wir eine automatisierte Methode entwickelt, um die Konformität von Microservice-Architekturen mit etablierten Mustern und Praktiken sowie IaC-basierte Implementierungen anhand des Komponentenmodells eines Microservice-Systems zu bewerten. Dies beinhaltete die Erstellung einer Basiswahrheit für alle möglichen Microservice-Architekturen und die Bestimmung relevanter Metriken zur Bewertung von Microservice- und IaC-Prinzipien, unabhängig von der verwendeten Technologie. Darüber hinaus haben wir einen automatisierten Assistenzansatz entwickelt, um Architekt*innen bei der Entwicklung von Microservice-Systemen und IaC-Implementierungen zu unterstützen. Insbesondere haben wir uns darauf konzentriert, eine Grundlage für die automatische Rekonstruktion der Architektur zu schaffen, die Konformität mit Microservice-spezifischen Mustern und Praktiken zu bewerten und potenzielle Verstöße zu identifizieren. Als Ergebnis können Architekt*innen unseren Ansatz nutzen, um die Konformität der Architektur durch einen kontinuierlichen Feedback-Prozess zu verbessern und praktische Lösungen zur Verbesserung der Gesamtqualität von Microservice-Systemen und IaC-Implementierungen anzubieten. Diese Arbeit zielt darauf ab, ein systematisches und wiederverwendbares Architekturentscheidungsmodell für Microservices zu entwickeln und einen genauen Ansatz für die Rekonstruktion von Komponentenarchitekturmodellen zu schaffen. Ein weiterer Schwerpunkt ist die Entwicklung einer Methode zur automatischen Bewertung der Konformität der Architektur mit Microservice-Mustern und -Praktiken sowie die Bestimmung geeigneter Metriken für die Bewertung. Die Kombination dieser Techniken mit Laufzeit- und dynamischen Merkmalen von Softwaresystemen kann die Problemerkennung und -bewertung verbessern und den Entscheidungsraum auf eine überschaubare Menge von Handlungsoptionen reduzieren.
description: Microservice systems are a modern approach to software architecture that involves the decomposition of a large, monolithic application into smaller, independently deployable services. The traditional approach to software development involved building large, monolithic applications that included all the functionality needed for the system. While this approach made it easier to develop and deploy applications, it also led to several challenges, such as increased complexity, reduced scalability, and difficulty in maintaining and updating the application. In contrast, microservice systems offer a number of benefits over monolithic applications. For example, each microservice can be developed, tested, and deployed independently, allowing for faster and more efficient development cycles. This also allows for easier scaling of individual services, as only the services that require additional resources need to be scaled, rather than the entire application. Another key advantage of microservice systems is increased resilience. Because each service is deployed independently, if one service experiences a failure, the other services in the system can continue to operate normally. This creates more robust systems that can continue to operate even in the face of individual service failures. In addition to these benefits, microservice systems also offer improved scalability, as services can be deployed across multiple nodes or locations to meet changing demands. This allows the system to handle increased load and traffic, while maintaining high levels of performance. One of the key challenges of microservice systems is managing the communication and integration between services. To address this challenge, microservice systems use well-defined APIs to enable services to communicate with each other in a consistent and predictable manner. This facilitates the development of more complex systems that can be managed and updated more easily. Another challenge in microservice systems is ensuring that services are deployed and managed consistently across the system. To address this challenge, many organizations use DevOps practices, such as continuous integration and delivery, to automate the deployment and management of services. This helps to ensure that services are deployed and managed consistently across the system, while also reducing the risk of manual errors and improving the speed and efficiency of the deployment process. Although there are established patterns and best practices documented, actual implementations often deviate from them and it is difficult to assess this manually for large-scale systems. One of the main challenges in software architecture is avoiding architecture model drift and erosion, which is exacerbated in microservice-based systems due to frequent changes and the use of multiple technologies. Existing solutions for reconstructing architecture models fall short in addressing these challenges as they struggle with continuous evolution, accuracy, and polyglot settings. Spotting violations in complex or large systems can be hard and tedious. The complexity of developing and deploying microservice-based systems has increased and become a challenge due to the requirement of frequent releases and the substantial number of infrastructure nodes necessary for system operation. Infrastructure as code (IaC) is a practice that involves the use of configuration files, scripts, and other code artifacts to manage and provision the underlying infrastructure for a software system. This allows for the deployment and management of infrastructure to be automated and repeatable, which is crucial for ensuring the stability and reliability of microservice systems. When deploying microservices in a production environment, it is important to have a well-designed infrastructure that supports the requirements of the services. This includes having sufficient computing resources, network connectivity, storage, and other resources needed to run the services effectively. IaC automates and standardizes infrastructure management, enabling efficient deployment of new services, scaling of existing services, and updates. Defining infrastructure as code allows for versioning, testing, and collaboration, improving reliability and repeatability of the deployment process. IaC can be applied to various types of infrastructure, including virtual machines, containers, and cloud resources. In the context of microservice systems, IaC can be particularly valuable, as it allows for the deployment and management of the infrastructure in a way that is tailored to the requirements of the microservices. Despite its widespread use, there is a lack of methods for evaluating architectural conformance and addressing architectural issues, such as loose coupling, in IaC-based deployments. In summary, IaC and microservices are complementary technologies that can be used together to deploy and manage software systems in a scalable, flexible, and reliable way. By automating the deployment and management of infrastructure, IaC helps to reduce the risk of manual errors and improve the overall speed and efficiency of the deployment process. In this thesis, we conducted a thorough and qualitative examination of best practices and patterns in microservice data management architecture through practitioner descriptions. By following a model-based qualitative research approach, we arrived at a formal architecture decision model. Upon comparing the completeness of our model to an existing pattern catalog, we found that it greatly reduces the effort and uncertainty involved in comprehending microservice data management decisions. We designed an architecture model abstraction approach that would allow for a better understanding of the architecture models of complex systems that evolve over time. We have identified two possible approaches and have evaluated them through an empirical case study: an opportunistic approach and a reusable semi-automatic detector-based approach. Furthermore, we developed an automated method for evaluating microservice architecture conformance to established patterns and practices, and IaC-based deployments, by using a microservice system's component model. This involved establishing a ground truth for all possible microservice architectures and determining relevant metrics to assess microservice and IaC principles, regardless of the technology used. Additionally, we have created an automated assistance approach to aid architects during the development of microservice systems and IaC deployments. Specifically, our focus was on providing a foundation for automated architecture reconstruction, assessing conformance to microservice-specific patterns and practices, and identifying potential violations. As a result, architects can use our approach to enhance architecture compliance through a continuous feedback process, offering practical solutions for improving the overall quality of microservice systems and IaC deployments. This thesis aims to develop a systematic and reusable architectural design decision model for microservices and create an accurate approach for reconstructing component architecture models. It also focuses on devising a method for automatically assessing architecture conformance to microservice patterns and practices, along with determining suitable metrics for the assessment. The combination of these techniques with runtime and dynamic features of software systems can improve problem detection and assessment, reducing the decision space to a manageable set of actionable options.