Software Architecture Flashcards
Software-architectuur
De structuur of structuren van een systeem, inclusief de componenten, hun relaties, en de richtlijnen en principes die het ontwerp en de evolutie van het systeem sturen.
Component
Een zelfstandig functioneel onderdeel van een softwaretoepassing, zoals een module, service of microservice. Componenten hebben duidelijke verantwoordelijkheden en communiceren via goed gedefinieerde interfaces.
Interface
Een punt waar twee systemen, componenten of modules met elkaar communiceren. Interfaces definiëren hoe de interactie plaatsvindt, zoals via een API of een message queue.
Layered Architecture
Een architectuurpatroon waarbij het systeem is georganiseerd in lagen (bijvoorbeeld presentatie, logica en data). Elke laag heeft een specifieke rol en communiceert alleen met aangrenzende lagen.
Microservices
Een architectuurstijl waarbij een applicatie wordt opgebouwd uit kleine, zelfstandige services die onafhankelijk kunnen worden ontwikkeld, ingezet en geschaald.
Design Patterns
Herbruikbare oplossingen voor veelvoorkomende ontwerpproblemen in softwareontwikkeling. Voorbeelden zijn het Singleton-, Factory-, en Observer-patroon.
Service-Oriented Architecture (SOA)
Een architectuurstijl waarbij applicaties worden opgebouwd uit herbruikbare en loosely coupled services. Deze services kunnen verschillende technologieën gebruiken en communiceren via een gestandaardiseerd protocol.
Scalability
Het vermogen van een systeem om te groeien en prestaties te behouden naarmate de belasting toeneemt. Dit kan horizontaal (extra servers toevoegen) of verticaal (meer resources toevoegen aan een server).
Coupling en Cohesion
Coupling: De mate waarin componenten afhankelijk zijn van elkaar. Lage coupling is wenselijk voor flexibiliteit.
Cohesion: Hoe goed de verantwoordelijkheden binnen een component samenhangen. Hoge cohesie is wenselijk voor eenvoud en onderhoudbaarheid.
Architectural Styles
Verschillende manieren om een systeem te organiseren, zoals:
Client-Server: Een centrale server biedt diensten aan meerdere clients.
Event-Driven: Componenten communiceren via events (asynchroon).
REST: Een stijl voor webservices die gebruikmaakt van HTTP-methoden.
Domain-Driven Design (DDD)
Een aanpak waarbij het ontwerp van software wordt geleid door de behoeften van de business. Het focust op het modelleren van de domeinlogica en het gebruik van een gedeeld vocabulaire.
Non-Functionele Eisen (NFRs)
Kwaliteitseisen van een systeem, zoals performance, beveiliging, betrouwbaarheid en schaalbaarheid. Ze beïnvloeden de keuzes in de architectuur sterk.
Deployment Architecture
De configuratie van softwarecomponenten op hardware en infrastructuur. Het bepaalt hoe een systeem wordt geïmplementeerd en uitgevoerd in productieomgevingen.
Monolith
Een monolithische architectuur is een systeem waarin alle onderdelen (zoals gebruikersinterface, logica en data) geïntegreerd zijn in één enkele applicatie of codebase.
Kenmerken:
Eén codebase en deployment-eenheid.
Componenten zijn sterk gekoppeld.
Eenvoudige ontwikkeling en testing bij kleinere projecten.
Voordelen:
Minder complexe infrastructuur.
Eenvoudig te implementeren en debuggen.
Nadelen:
Schaalbaarheid is moeilijker, vaak alleen verticaal.
Moeilijker onderhoudbaar naarmate het systeem groeit.
Distributed Systems
Een gedistribueerd systeem bestaat uit meerdere zelfstandige componenten (services of nodes) die samen functioneren om een applicatie te draaien. Deze componenten draaien op verschillende machines of locaties en communiceren via netwerken.
Kenmerken:
Componenten zijn losjes gekoppeld.
Kan fysiek verspreid zijn over meerdere servers of zelfs datacenters.
Vaak gebaseerd op communicatieprotocollen zoals REST, gRPC, of message queues.
Voordelen:
Horizontale schaalbaarheid: meer servers toevoegen om de belasting te verdelen.
Fouttolerantie: bij falen van een component blijft de rest functioneren.
Geschikt voor grote, complexe systemen.
Nadelen:
Hogere complexiteit door gedistribueerde infrastructuur.
Communicatie tussen componenten kan leiden tot vertragingen of fouten.
Moeilijker te debuggen en testen.