Kapazitaetsplanung: 1 Million Buecher / 100.000 Nutzer (und das Zehnfache)

Zielgruppe: Architektur/DevOps/Management. Beantwortet eine Frage, die alle bisherigen DevOps-Dokus bewusst offenlassen: docker-compose-guide.md, kind-cluster.md und kubernetes-guide.md beschreiben ausschliesslich Lern-/Test-Umgebungen auf einem einzelnen Laptop. Dieses Dokument nimmt die Rolle "was waere noetig, wenn dieses System echt 1 Mio. Buecher und 100.000 Nutzer bedienen muesste" bewusst als eigenstaendige Kapazitaets- und Lizenzplanung ein - kein Deployment-Ergebnis, sondern eine begruendete Rechnung und Empfehlung. Alle Annahmen sind explizit markiert, weil eine Kapazitaetsplanung ohne offengelegte Annahmen wertlos ist. Abschnitt 10-11 wiederholt dieselbe Rechnung fuer das Zehnfache (10 Mio. Buecher, 1 Mio. Nutzer) inkl. Kostenvergleich beider Groessenordnungen. Abschnitt 12 uebersetzt beide Groessenordnungen in konkrete Stuecklisten (Kerne/RAM/Speicher) fuer drei Betriebsmodelle - On-Premise/Bare-Metal, VM (eigener Hypervisor) und AWS Cloud - und rechnet in 12.5 jede Inventar-Zeile einzeln mit realen, recherchierten Listenpreisen durch (Stand August 2026). Abschnitt 13 ergaenzt das um Betriebs-/Personalkosten, die bei diesem System-Umfang die reinen Infrastrukturkosten deutlich uebersteigen.

1. Warum Annahmen zuerst, nicht Server-Groessen zuerst

Ein haeufiger Anfaengerfehler bei Kapazitaetsplanung: sofort mit Serverzahlen anfangen, bevor klar ist, WAS die beiden Zahlen "1 Mio. Buecher" und "100.000 Nutzer" ueberhaupt fuer Last bedeuten. Beide Zahlen allein sagen fast nichts - ein System mit 100.000 registrierten, aber inaktiven Nutzern ist trivial; eines mit 100.000 gleichzeitig aktiven Nutzern waere ein komplett anderes Projekt. Deshalb zuerst die Umrechnung von "Nutzerzahlen" in "Last", danach erst Infrastruktur-Dimensionierung.

1.1 Datenmenge: 1 Million Buecher

Tabelle (welcher Service) Herleitung Geschaetzte Zeilenzahl Geschaetzte Groesse
books (catalog-service) Vorgabe 1.000.000 Zeile 0,8-1,5 KB (Titel, ISBN, Verlag, Beschreibung via TOAST) → **1-1,5 GB** Rohdaten
book_authors (catalog-service) Annahme: ⌀ 2 Autoren/Buch ~2.000.000 100 Byte/Zeile → **200 MB**
copies (catalog-service) Annahme: ⌀ 2,5 Exemplare/Titel (Mehrfachexemplare bei Nachfrage-Titeln) ~2.500.000 150 Byte/Zeile → **400 MB**
Indizes (alle drei zusammen) Faustregel 30-50 % der Tabellengroesse - ~1-1,2 GB
catalog-service DB gesamt ~3-4 GB
members (member-service) Vorgabe 100.000 0,5-1 KB/Zeile → **100 MB**
loans (lending-service) Annahme: ⌀ 15 Ausleihen/Nutzer/Jahr, 5 Jahre Historie behalten ~7.500.000 300-500 Byte/Zeile → **3 GB**
fines, reservations Anteil der Loans (⌀ 5-10 % je Ausleihe) ~500.000-1.500.000 ~0,5-1 GB je Service
Alles zusammen (5 Datenbanken) grob 10-20 GB, ohne WAL/Replikation

Die wichtigste Erkenntnis dieser Rechnung: 1 Million Buecher sind fuer eine relationale Datenbank kein Big-Data-Problem. 10-20 GB laeuft bequem auf einer einzelnen, nicht einmal besonders grossen Postgres-Instanz (siehe Abschnitt 3) - das ist um Groessenordnungen kleiner als z. B. ein durchschnittliches E-Commerce-Produktkatalog-System mit Bildvarianten, Preishistorie und Lagerbestand in Echtzeit. Ein haeufiger Anfaengerfehler ist, bei "1 Million" reflexhaft an Sharding, NoSQL oder Suchcluster als ZWINGENDE Voraussetzung zu denken - hier ist das eine bewusste, spaeter begruendete Ergaenzung (Abschnitt 3.3), kein struktureller Zwang.

1.2 Traffic: 100.000 Nutzer

Registrierte Nutzer sind NICHT gleich gleichzeitige Last - das ist die zentrale Umrechnung, die fehlt, wenn man nur die rohe Nutzerzahl nennt.

Groesse Annahme (Bibliotheks-Nutzungsmuster, nicht E-Commerce) Wert
Registrierte Nutzer Vorgabe 100.000
Woechentlich aktiv Annahme 8-12 % (Bibliothekssysteme haben deutlich niedrigere Nutzungsfrequenz als z. B. Social Media) ~8.000-12.000
Taeglich aktiv (DAU) Annahme ~1/3 der woechentlich Aktiven ~3.000-4.000
API-Aufrufe pro Session Annahme: Suche, Trefferliste, 2-3 Detailansichten, ggf. Ausleihe/Reservierung, "Meine Ausleihen" ~15-25
Requests/Tag gesamt 3.500 DAU × 20 ~70.000/Tag
Anteil in der verkehrsreichsten Stunde Annahme 20-25 % (Bibliotheken haben ausgepraegte Stosszeiten, z. B. Semesterbeginn/Klausurenphase, Vormittag) ~15.000-17.500
Peak-Requests/Sekunde (⌀ ueber die Spitzenstunde) 17.500 / 3.600 ~5 RPS
Peak-RPS mit Burst-Faktor Innerhalb der Spitzenstunde ist Traffic nicht gleichverteilt; Faktor 4-6× auf Minutenbasis ueblich ~20-30 RPS

Zweite wichtige Erkenntnis: 20-30 Requests/Sekunde Spitzenlast ist fuer moderne Microservices-Infrastruktur eine kleine bis mittlere Last - jeder der neun Services aus diesem Projekt schafft das bereits auf einer einzigen, bescheiden dimensionierten Pod-Instanz (siehe die real gemessenen Boot-/Antwortzeiten in kind-cluster.md). Ein Bibliothekssystem fuer 100.000 Nutzer ist rechnerisch kein Hyperscale-Problem wie eine grosse E-Commerce-Plattform (die bei vergleichbarer Nutzerzahl oft 100-1000× mehr Requests/Sekunde sieht, weil Kaufabschluesse, Preisvergleiche und Werbe-Tracking viel haeufiger Requests ausloesen als Bibliotheksnutzung). Die eigentliche "Enterprise"-Komplexitaet bei dieser Groessenordnung entsteht NICHT aus rohem Durchsatz, sondern aus:

1.3 Sonderfall: Initialer Massenimport

1 Million Buecher entstehen nicht organisch durch Nutzereingaben, sondern vermutlich durch einen einmaligen Import (Altsystem-Migration, Verbundkatalog-Abzug wie GVK/K10plus). Das ist ein separates Lastprofil: keine interaktive Latenzanforderung, aber hoher, anhaltender Schreibdurchsatz auf catalog-service. Empfehlung: Bulk-Import ueber einen eigenen Batch-Pfad (z. B. COPY-basiertes Postgres-Bulk-Loading statt 1 Million einzelner REST-Aufrufe), zeitlich ausserhalb der Kernnutzungszeiten, mit vorher testweise deaktiviertem oder gedrosseltem Kafka-Event-Versand (sonst erzeugt ein 1-Millionen-Zeilen-Import 1 Million BookRegistered-Events auf einmal - siehe ADR-0003 zur Event-getriebenen Architektur dieses Projekts).

2. Kubernetes-Cluster

Die Lernumgebungen dieses Projekts (kind fuer CI-Tests, der gescheiterte CRC/OKD-Versuch fuer "produktionsnah") laufen bewusst auf einem einzelnen Laptop. Fuer echte 100.000 Nutzer ist ein verwalteter Cloud-Kubernetes-Dienst (EKS/AKS/GKE) oder eine dedizierte OpenShift-Installation die richtige Wahl - kein Laptop-Cluster mehr, siehe Abschnitt 8 zur Lizenzfrage OpenShift vs. vanilla Kubernetes.

Aspekt Empfehlung Begruendung
Node-Pools mind. 3 Nodes ueber mind. 2 Verfuegbarkeitszonen Kein Single Point of Failure; Kubernetes kann einen ausgefallenen Node kompensieren, wenn Pods bereits redundant ueber Zonen verteilt sind
Replikate je Fachservice mind. 3 (statt 1 wie in der Lernumgebung) Rolling Updates ohne Downtime, Toleranz gegen einzelne Pod-Abstuerze
Ressourcen je Pod Ausgangspunkt: die in kind-cluster.md real gemessenen Werte (500m/1500m CPU) als PRODUKTIONS-requests/limits, nicht die Lern-Standardwerte (50m/300m) Die dort gemessene 25×-Verlangsamung bei zu knappem CPU-Limit gilt in einem echten Cluster genauso - nur, dass ein CrashLoopBackOff dort echte Nutzer betrifft
Horizontal Pod Autoscaler ab 2, max 6-10 Replikate je Service, Trigger auf CPU + http_server_requests_seconds_count (bereits ueber Micrometer exponiert, siehe observability.md) Bei ~25 RPS Spitzenlast (Abschnitt 1.2) reicht das bequem; HPA faengt unvorhergesehene Lastspitzen ab, ohne dauerhaft ueberdimensioniert zu sein
Ingress/API-Gateway api-gateway (bereits im Projekt vorhanden, Spring Cloud Gateway) bleibt zentraler Eintrittspunkt; davor ein Cloud-Loadbalancer + WAF TLS-Termination, Rate-Limiting, DDoS-Grundschutz gehoeren vor die Anwendung, nicht in sie
PodDisruptionBudgets minAvailable: 2 je Service Verhindert, dass Node-Wartung/Autoscaling-Down-Scaling alle Replikate eines Services gleichzeitig entfernt

3. PostgreSQL

3.1 Instanzgroesse

Aus 1.1: ~10-20 GB Gesamtdatenvolumen ueber alle fuenf Datenbanken. Das ist mit einer einzelnen, moderaten verwalteten Postgres-Instanz je Service komfortabel zu betreiben (z. B. AWS RDS db.r6g.large/Azure GP_Standard_D2s Groessenordnung: 2-4 vCPU, 8-16 GB RAM) - der Flaschenhals ist auch hier nicht die Datenmenge, sondern gleichzeitige Verbindungen und Verfuegbarkeit:

Aspekt Empfehlung Begruendung
Hochverfuegbarkeit Managed-Service mit Multi-AZ-Failover (RDS Multi-AZ, Cloud SQL HA) statt selbstverwaltetem Patroni-Cluster Fuer ein Team, das (wie dieses Projekt zeigt) bereits an Container-/Kubernetes-Eigenheiten arbeitet, ist selbstverwaltetes Postgres-HA ein zusaetzliches, vermeidbares Betriebsrisiko
Lesereplikate 1-2 Read-Replicas fuer catalog-service (das lesehaeufigste Modul - Suche dominiert laut 1.2) Trennt Lesespitzen (Katalogsuche) von Schreiblast (Ausleihen), ohne die Architektur zu aendern
Connection Pooling PgBouncer (oder RDS Proxy) vor jeder Datenbank Bei 3-10 Pod-Replikaten je Service × HikariCP-Pools pro Pod entstehen schnell mehr Postgres-Verbindungen als eine Instanz ohne Pooling sauber verwaltet
Backups Point-in-Time-Recovery (PITR), taeglich vollstaendig + kontinuierliches WAL-Archiving Bei 100.000 echten Nutzerdatensaetzen ist Datenverlust kein akzeptables Risiko mehr (anders als in der Lernumgebung)
Migration-Disziplin Flyway bleibt unveraendert zentral (bereits etabliertes Muster, siehe ADR-0002) Kein Grund, ein bewaehrtes Muster bei Scale zu aendern

3.2 Bulk-Import (siehe 1.3)

Fuer den initialen 1-Mio.-Buecher-Import: COPY-Kommando (Postgres-natives Bulk-Loading, um Groessenordnungen schneller als 1 Million einzelne INSERTs ueber JPA/Hibernate), Indizes waehrend des Imports temporaer entfernen und danach neu aufbauen (schneller als fortlaufend zu pflegen).

3.3 Katalogsuche: wann Postgres nicht mehr reicht

Postgres' eingebaute Volltextsuche (tsvector/GIN-Index) skaliert fuer 1 Mio. Buecher bei ~5-30 RPS Suchlast weiterhin gut. Ein dediziertes Suchsystem (OpenSearch/Elasticsearch) wird erst dann sinnvoll, wenn zusaetzlich Facettensuche (Filterung nach Verfuegbarkeit, Autor, Jahr, Standort gleichzeitig, mit Trefferzahlen je Facette), Relevanz-Ranking (Tippfehler-Toleranz, Gewichtung) oder deutlich hoehere Suchlast gefordert ist. Das ist eine bewusste Vertiefungsaufgabe fuer dieses Projekt (CQRS-Lesemodell: catalog-service bleibt Source of Truth, publiziert bereits Domain Events ueber Kafka - siehe ADR-0003 - die exakt die Grundlage waeren, um einen OpenSearch-Index nebenlaeufig zu befuellen), kein Umbau, der fuer die reine Zielgroesse "1 Mio. Buecher" bereits zwingend noetig waere.

4. Caching: Redis

Redis-Cluster-Modus (mind. 3 Master-/3 Replica-Knoten) fuer den bereits bestehenden Read-Through-Cache der Katalogsuche (siehe tech-stack.md). Datenvolumen im Cache ist klein (Suchergebnis-Seiten, keine vollstaendigen Buchdaten) - hier ist RAM-Groesse unkritisch (wenige GB reichen); der Grund fuer Cluster-Modus ist Verfuegbarkeit, nicht Kapazitaet: faellt der einzige Redis-Knoten der Lernumgebung aus, faengt common-observability/der Cache-Aspekt das nur dann sauber ab, wenn der Code bereits Cache-Ausfaelle toleriert (Fallback auf Postgres) - das im Produktivbetrieb bewusst zu pruefen, nicht als gegeben anzunehmen, ist Teil dieser Planung. Zur Lizenzfrage von Redis: siehe Abschnitt 8.2 - ein eigener Abschnitt, weil die Redis-Lizenzaenderung 2024 fuer viele Teams eine echte Ueberraschung war.

5. Messaging: Kafka und RabbitMQ

Aspekt Kafka (Domain Events) RabbitMQ (Task-/Command-Queues)
Broker-Anzahl 3 (Replikationsfaktor 3, KRaft-Modus wie bereits im Projekt, siehe tech-stack.md) 3-Knoten-Cluster mit Quorum Queues (moderner Ersatz fuer klassisches Mirroring)
Ereignisvolumen (Abschaetzung) ⌀ 1-2 Domain Events je Ausleihe/Rueckgabe/Reservierung; bei ~70.000 Requests/Tag (1.2) und einem Bruchteil davon als schreibende Aktionen: Groessenordnung 10.000-30.000 Events/Tag im Normalbetrieb Deutlich niedriger - Benachrichtigungen (Faelligkeits-/Mahn-E-Mails), keine Echtzeitanforderung
Partitionen (Kafka) 6-12 je Topic (mehr als Verbraucher-Instanzen, damit horizontale Skalierung der Consumer moeglich bleibt) -
Storage/Retention Bei diesem Ereignisvolumen genuegen Tage bis wenige Wochen Retention auf SSD-Standardgroessen (< 50 GB) - kein High-Volume-Streaming-Fall (Clickstream, IoT) DLQ (bereits im Projekt etabliertes Muster) mit begrenzter Groesse + Alarmierung bei wachsender DLQ
Lizenz Apache Kafka: Apache 2.0, vollstaendig frei - dieses Projekt nutzt bereits vanilla Kafka, keine Confluent-Erweiterungen (siehe Abschnitt 8.3 zur Abgrenzung) Mozilla Public License 2.0, vollstaendig frei; siehe Abschnitt 8.4 zur Traegerschaftsaenderung nach der Broadcom/VMware-Uebernahme

6. Identity: Keycloak

Keycloak selbst ist voll Open Source (Apache 2.0, CNCF-Projekt) - keine Lizenzkosten bei jeder Groesse. Bei 100.000 Nutzern wird die Betriebsarchitektur relevant, nicht die Lizenz:

7. CDN und Objektspeicher

Aktuell nicht Teil dieses Projekts (Buchcover o. Ae. sind kein modelliertes Feature), aber bei echtem Betrieb relevant: Buchcover-Bilder und das gebaute Angular-Frontend (statische JS/CSS-Bundles) gehoeren nicht in Postgres oder in die Fachservices, sondern in einen S3-kompatiblen Objektspeicher (AWS S3, Azure Blob, oder selbstgehostet MinIO - Apache 2.0, frei) hinter einem CDN (CloudFront, Cloudflare, Azure CDN). Bei 1 Mio. Buechern mit angenommen ⌀ 50 KB je Cover ergaeben sich ~50 GB Objektspeicher - trivial im Vergleich zu den Datenbankgroessen aus Abschnitt 1.1, aber der Zugriffsmuster-Grund fuer ein CDN bleibt: Bild-Ausliefern skaliert am guenstigsten und schnellsten ueber Edge-Caching, nicht ueber die Fachservices.

8. Lizenzierung: was wirklich kostenlos ist und wo die Fallstricke liegen

Diese Sektion ist bewusst der detaillierteste Teil des Dokuments - Kapazitaetsplanung ohne Lizenzpruefung fuehrt regelmaessig zu boesen Ueberraschungen erst NACH dem Going-Live, wenn ein Anbieter eine rueckwirkende Nutzungspruefung ansetzt oder eine Lizenzaenderung greift, die beim urspruenglichen Technologie-Entscheid noch nicht galt.

8.1 Java/JDK: Oracle JDK vs. OpenJDK-Distributionen

Dieses Projekt nutzt bereits Eclipse Temurin (siehe library-platform/Dockerfile, FROM eclipse-temurin:21-jre-alpine) - eine reine OpenJDK-Distribution unter der GPLv2 mit Classpath-Exception, vollstaendig frei, ohne Zeitbeschraenkung. Das ist bereits die richtige Wahl fuer Produktivbetrieb und sollte bei Scale unveraendert bleiben. Der Fallstrick, den dieses Projekt damit bereits vermeidet, betrifft Oracle JDK:

Zur Groessenordnung des vermiedenen Kostenrisikos (Stand August 2026, oeffentliche Oracle-Listenpreise): Oracles "Java SE Universal Subscription" wird nach GESAMT-Mitarbeiterzahl der Organisation abgerechnet, gestaffelt von 15,00 USD/Mitarbeiter/Monat (1-999 Mitarbeitende) bis 5,25 USD/Mitarbeiter/Monat (40.000-49.999 Mitarbeitende) - NICHT nach Anzahl der JDK-Installationen. Eine Beispielrechnung zur Einordnung (Annahme: Traegerorganisation mit ca. 500 Mitarbeitenden gesamt, nicht nur das Plattform-Team - typische Bandstufe ~13-15 USD/Monat): 500 × ~14 USD × 12 Monate ≈ 84.000 USD/Jahr - ein Betrag, der anfiele, wuerde irgendwo im Unternehmen (nicht zwingend nur in diesem Projekt) unlizenziertes Oracle JDK jenseits des NFTC-Zeitfensters weiterlaufen. Durch die bereits getroffene Temurin-Entscheidung: 0 USD. Realer Marktkontext, nicht Panikmache: Verhandlungsspielraum von 20-40 % unter Listenpreis ist bei Mehrjahresvertraegen ueblich - der Punkt ist die Groessenordnung, nicht die exakte Zahl.

8.2 Redis: die Lizenzaenderung 2024 und Valkey

Redis (das Unternehmen, vormals Redis Labs) hat im Maerz 2024 die Lizenz ab Redis 7.4 von der BSD-3-Clause (klassisches Open Source) auf eine Doppellizenz aus RSALv2 (Redis Source Available License) und SSPLv1 geaendert - beide sind KEINE von der OSI anerkannten Open-Source-Lizenzen.

8.3 Apache Kafka vs. Confluent Platform

Dieses Projekt nutzt laut tech-stack.md bewusst vanilla Apache Kafka (Apache 2.0, vollstaendig frei, keine Nutzungsbeschraenkung) im KRaft-Modus, OHNE Confluent-Erweiterungen. Das bleibt bei Scale die richtige, lizenzkostenfreie Wahl. Zur Abgrenzung, falls spaeter Confluent-Komponenten erwogen werden: Confluent Platform buendelt um Apache Kafka herum zusaetzliche, teils NICHT frei lizenzierte Komponenten (Schema Registry, ksqlDB, manche Connectoren stehen unter der "Confluent Community License" - kostenlos nutzbar, aber mit denselben "kein konkurrierender Managed Service"-Einschraenkungen wie RSALv2 oben, keine OSI-Lizenz). Confluent Cloud (vollstaendig verwaltetes Kafka-as-a-Service) ist ein separates, nutzungsbasiert kostenpflichtiges Angebot. Da dieses Projekt bereits das eigene, selbstgehostete Schema-Handling ueber ein manuelles schemaVersion-Feld loest (bewusste Entscheidung GEGEN Confluent Schema Registry, siehe ADR-0003 und tech-stack.md), entsteht hier auch bei Scale keine Lizenzkosten-Abhaengigkeit von Confluent.

8.4 RabbitMQ: Broadcom/VMware-Uebernahme

Die Lizenz selbst (Mozilla Public License 2.0) ist unveraendert vollstaendig frei. Relevant ist eine organisatorische, keine lizenzrechtliche Entwicklung: RabbitMQ wurde ueber Pivotal/VMware an Broadcom weitergereicht (Broadcoms VMware-Uebernahme 2023) - Broadcom ist bekannt fuer aggressive Kommerzialisierung uebernommener Produkte (siehe die parallele, vielzitierte Entwicklung bei VMware selbst). Bislang bleibt RabbitMQ Community Edition frei und aktiv weiterentwickelt (ein Teil des urspruenglichen Kernteams hat 2024 eine eigene Firma, "Cloud AMQP"/"CloudAMQP"-unabhaengig, sowie das RabbitMQ-Team ist teils zu einer neuen "Broadcom-unabhaengigen" Struktur gewechselt) - kein akuter Lizenz-Fallstrick, aber ein Beobachtungspunkt fuer eine langfristig geplante Produktivumgebung: bei kritischer Abhaengigkeit lohnt sich eine regelmaessige Neubewertung (Alternativen mit vergleichbarem Reifegrad: Amazon MQ als verwalteter Dienst, oder ein Wechsel auf ausschliesslich Kafka fuer beide bisherigen Einsatzzwecke - siehe die in ADR-0003 bereits diskutierte Abwaegung Kafka vs. RabbitMQ).

8.5 Kubernetes-Distribution: OpenShift-Subscription vs. OKD vs. verwaltetes Kubernetes

Direkt anschliessend an den in kubernetes-guide.md dokumentierten CRC/OKD-Versuch dieses Projekts - hier die Lizenzseite dieser Entscheidung:

Option Lizenzkosten Was man dafuer bekommt
Red Hat OpenShift Container Platform Kostenpflichtig, lizenziert pro "Core-Pair" (2 Kerne). Oeffentliche Listenpreise (Stand August 2026) streuen stark: grob 1.000-2.500+ USD pro Core-Pair/Jahr im kleineren/Standard-Segment, bis 10.000-13.000 USD pro Core-Pair/Jahr in manchen Enterprise-Support-Konfigurationen; bei Grossabnahme (100+ Core-Pairs) werden 6.000-9.000 USD/Core-Pair ueber Rahmenvertraege berichtet. Fuer das ~64-Kern-Cluster aus Abschnitt 12.2 (4 Worker à 16 Kerne) waeren das grob 32 Core-Pairs → 32.000-80.000+ USD/Jahr, je nach Segment/Verhandlung Enterprise-Support, integrierte CI/CD, Service Mesh, erweiterte Security-Policies (SCC), Red-Hat-zertifizierte Operatoren, garantierte Patch-SLAs
OKD (Community-Upstream von OpenShift) Kostenlos Fast identische Funktionalitaet wie OpenShift, aber ohne Red-Hat-Support/-SLA - genau das, was in diesem Projekt per CRC (einer lokalen OKD-Distribution) versucht wurde
Verwaltetes vanilla Kubernetes (EKS/AKS/GKE) Keine separate Kubernetes-Lizenzgebuehr - nur die ueblichen Compute-/Cluster-Management-Kosten des jeweiligen Cloud-Anbieters (EKS-Control-Plane z. B. ~73 USD/Monat pauschal bei AWS) Kein OpenShift-spezifisches Tooling (Operators, integrierte Security-Policies), dafuer die groesste Cloud-Anbieter-Auswahl und meist die guenstigste Gesamtbetriebskostenoption

Die grosse Preisspanne bei OpenShift ist bewusst so stehen gelassen, nicht auf eine Zahl verengt - reale Angebote haengen stark von Support-Tier (Standard/Premium), Vertragslaenge und Verhandlungsposition ab; 32.000-80.000+ USD/Jahr on top der reinen Compute-Kosten ist die richtige Groessenordnung fuer eine erste Abwaegung, kein Angebot.

Empfehlung fuer dieses Projekt bei echtem Scale: sofern keine bereits bestehende Red-Hat-Supportbeziehung/Enterprise-Anforderung vorliegt, ist verwaltetes vanilla Kubernetes (EKS/AKS/GKE) die kosteneffizienteste Wahl - das bereits vorhandene Helm-Chart (infra/helm/library-service) ist absichtlich plain-Kubernetes-kompatibel gehalten und laeuft dort unveraendert. OpenShift/OKD lohnt sich vor allem, wenn eine Organisation ohnehin schon Red-Hat-Infrastruktur betreibt oder regulatorisch striktere Standard-Security-Policies (SCC) braucht.

8.6 Container-Runtime auf Entwicklerarbeitsplaetzen: die Lizenzfrage

Dieses Projekt nutzt Podman (Red Hat, Apache 2.0) - rootless, daemonless, ohne Lizenzschwelle. podman compose und podman build lesen die vorhandenen docker-compose.yml/Dockerfile-Dateien unveraendert. Damit ist die unten beschriebene Docker-Desktop-Kostenfrage fuer dieses Projekt gegenstandslos - der Abschnitt bleibt als Kontext fuer Teams, die die Wahl noch vor sich haben.

Wichtig: Die Lizenzbedingungen betreffen ausschliesslich Docker Desktop auf Entwickler-Laptops, NICHT den Produktivbetrieb - Kubernetes-Cluster/CI-Runner nutzen containerd/buildkit bzw. Podman/Buildah direkt (Apache 2.0, immer frei).

8.7 Grafana: OSS vs. Enterprise, und die AGPLv3-Lizenz

Grafana selbst wechselte 2021 von Apache 2.0 auf AGPLv3 (Affero GPL, "Netzwerk-Copyleft"). Fuer die in diesem Projekt bereits etablierte Nutzungsart (Grafana intern betreiben, eigene Dashboards bauen, siehe observability.md) hat das keine praktische Auswirkung - AGPLv3 verlangt Quelloffenlegung nur, wenn man eine MODIFIZIERTE Version von Grafana selbst als Netzwerkdienst an Dritte anbietet, nicht beim reinen internen Betrieb. Grafana OSS deckt bei dieser Projektgroesse alles Benoetigte ab (Dashboards, Alerting, Datasources fuer Prometheus/Loki/Zipkin - alle bereits im Projekt verdrahtet). Grafana Enterprise (separates, kostenpflichtiges Lizenzmodell) wird erst relevant fuer Features, die dieses Projekt nicht braucht: Enterprise-SSO-Connectoren (SAML/LDAP jenseits der Basisvariante), erweiterte Reporting-/PDF-Export-Funktionen, oder vertraglicher Herstellersupport mit SLA.

8.8 Zusammenfassung: Lizenz-Ampel

Komponente Lizenz Bei dieser Scale kostenlos? Grobe Lizenzkosten Fallstrick
Eclipse Temurin (OpenJDK) GPLv2+CE Ja, uneingeschraenkt 0 (Oracle JDK waere ~84.000 USD/Jahr, siehe 8.1) Keiner (bereits richtige Wahl im Projekt)
Spring Boot/Spring Cloud Apache 2.0 Ja 0 Keiner
PostgreSQL PostgreSQL-Lizenz (BSD-aehnlich) Ja 0 Keiner
Apache Kafka (vanilla) Apache 2.0 Ja 0 Nur bei Zusatz von Confluent-Komponenten (8.3)
RabbitMQ MPL 2.0 Ja 0 Beobachten: Broadcom-Traegerschaft (8.4)
Redis (aktuelle Version) RSALv2/SSPLv1 Ja fuer internen Einsatz 0 Nicht als eigenes Redis-as-a-Service weiterverkaufen; bei verwalteten Cloud-Angeboten ggf. automatisch Valkey (8.2)
Keycloak Apache 2.0 Ja 0 Keiner
Angular MIT Ja 0 Keiner
Kubernetes (vanilla, verwaltet) Apache 2.0 Ja, nur Cloud-Compute-Kosten 0 (EKS-Control-Plane-Pauschale separat, ~73 USD/Monat, siehe 8.5) Keiner
OpenShift Container Platform Kommerziell Nein grob 32.000-80.000+ USD/Jahr fuer das ~64-Kern-Cluster aus 12.2 (siehe 8.5) Subscription noetig - Alternative OKD (8.5)
Podman (Entwicklerlaptops - hier gewaehlt) Apache 2.0 Ja 0 Keiner. (Docker Desktop waere ab > 250 MA/> 10 Mio. USD Umsatz kommerziell: grob 2.000-2.300 USD/Jahr fuer 8 Entwickler, siehe 8.6 - durch Podman vermieden)
Grafana OSS AGPLv3 Ja fuer internen Betrieb 0 Nur bei Weiterverbreitung modifizierter Versionen als Dienst
Prometheus, Zipkin, Loki, Promtail Apache 2.0 Ja 0 Keiner
MinIO (falls als Objektspeicher gewaehlt) AGPLv3 Ja fuer internen Betrieb 0 Wie Grafana - nur bei Weitervertrieb als eigener Dienst relevant

Alle "0"-Eintraege sind reine Lizenzkosten - die zugehoerigen INFRASTRUKTUR-Kosten (Compute, Storage, verwaltete Dienste) fuer genau dieselben Komponenten stehen in Abschnitt 12.5, nicht hier. Beide Tabellen bewusst getrennt: Lizenz- und Infrastrukturkosten sind unabhaengige Entscheidungsachsen (man kann z. B. Apache Kafka - Lizenz 0 - trotzdem auf teurer verwalteter MSK-Infrastruktur betreiben).

9. Kurz angesprochen, bewusst nicht vertieft: DSGVO

Bei 100.000 echten Personendatensaetzen (Name, Adresse, Ausleihhistorie) greift die DSGVO real, nicht nur theoretisch - Auskunftsrecht, Recht auf Loeschung/"Vergessenwerden", Datenschutz- Folgenabschaetzung bei einem derart grossen, sensiblen Datenbestand. Das ist ein eigenstaendiges, rechtlich gepraegtes Thema und bewusst nicht Teil dieser rein technischen Kapazitaets-/Lizenzplanung - erwaehnt, damit es bei einem echten Vorhaben dieser Groessenordnung nicht uebersehen wird.

10. Skalierung auf das Zehnfache: 10 Millionen Buecher, 1 Million Nutzer

Dieselbe Rechnung wie Abschnitt 1, diesmal fuer die zehnfache Zielgroesse - mit derselben Annahmen-Methodik (keine neuen Verhaltensannahmen, nur die Basiszahlen skaliert), damit beide Groessenordnungen tatsaechlich vergleichbar sind.

10.1 Datenmenge im Vergleich

Tabelle 1 Mio. Buecher / 100.000 Nutzer (Abschnitt 1.1) 10 Mio. Buecher / 1 Mio. Nutzer
books ~1-1,5 GB ~10-15 GB
book_authors ~200 MB ~2 GB
copies ~400 MB ~4 GB
Indizes (catalog-service) ~1-1,2 GB ~8-10 GB
catalog-service DB gesamt ~3-4 GB ~30-40 GB
members ~100 MB ~1 GB
loans (5 Jahre Historie) ~7,5 Mio. Zeilen, ~3 GB ~75 Mio. Zeilen, ~30 GB
fines, reservations ~0,5-1 GB je Service ~5-10 GB je Service
Alles zusammen grob 10-20 GB grob 100-150 GB

Storage bleibt weiterhin linear und unauffaellig - 150 GB ist immer noch kein Big-Data-Problem fuer Postgres. Die 75 Millionen Zeilen in loans sind aber ein echter Schwellenwert: nicht wegen der Groesse, sondern weil Wartungsoperationen (Index-Neuaufbau, VACUUM, Backups) auf einer derart grossen, ungepartitionierten Tabelle spuerbar langsamer werden und laenger blockieren koennen. Das ist der erste Punkt in diesem Dokument, an dem "einfach eine groessere Instanz buchen" nicht mehr die vollstaendige Antwort ist - siehe 10.3.

10.2 Traffic im Vergleich

Groesse 100.000 Nutzer (Abschnitt 1.2) 1 Million Nutzer
Taeglich aktiv (DAU) ~3.000-4.000 ~30.000-40.000
Requests/Tag gesamt ~70.000 ~700.000
Peak-RPS (⌀ Spitzenstunde) ~5 RPS ~40-50 RPS
Peak-RPS mit Burst-Faktor ~20-30 RPS ~160-250 RPS

Wichtiger Vorbehalt zur linearen Hochrechnung: diese Tabelle skaliert bewusst mit denselben Verhaltens-Verhaeltnissen wie Abschnitt 1 (gleiche Aktivitaetsquote, gleiche Session-Groesse) - das ist als Planungs-Baseline sinnvoll, aber real haeufig NICHT exakt linear. Groessere Nutzerbasen zeigen manchmal ueberproportional mehr Engagement (Netzwerkeffekte, mehr Bestand = mehr Grund zur Rueckkehr), manchmal unterproportional (ein grosser Anteil neuer Nutzer ist anfangs weniger aktiv als der urspruengliche Kernbestand). Die reale Zahl liegt vermutlich irgendwo um diese Baseline, nicht exakt darauf - fuer eine erste Kapazitaetsplanung ist die lineare Annahme trotzdem der richtige Ausgangspunkt (siehe 1. zur selben Begruendung).

~160-250 RPS Spitzenlast ist eine spuerbar andere Groessenordnung als die ~20-30 RPS aus Abschnitt 1 - das ist "mittlere" Web-Last, bei der einzelne Architekturentscheidungen (siehe 10.3) beginnen, tatsaechlich load-bearing statt nur "nice to have" zu sein.

10.3 Was sich NICHT nur durch groessere Server loesen laesst

Im Unterschied zu Abschnitt 1-9 (wo bei 1 Mio./100.000 fast alles mit "etwas grosszuegiger dimensionieren" erledigt ist) werden bei 10 Mio./1 Mio. einige der bisherigen "Vertiefungsaufgaben" faktisch zu Pflichtbestandteilen:

Thema Bei 1 Mio./100.000 (Abschnitt 1-7) Bei 10 Mio./1 Mio.
Katalogsuche Postgres-Volltextsuche reicht (Abschnitt 3.3) Facettensuche/Relevanz-Ranking bei 10 Mio. Titeln und 160-250 RPS Suchlast wird real spuerbar - ein dedizierter Suchcluster (OpenSearch/Elasticsearch, CQRS-Lesemodell ueber die bereits vorhandenen Kafka-Events) wird vom "koennte man" zum "sollte man"
loans-Tabelle Eine Tabelle, keine Partitionierung noetig Native deklarative Postgres-Partitionierung (z. B. nach Jahr) noetig, damit Wartung/Backups auf 75 Mio. Zeilen handhabbar bleiben; alte Partitionen koennen zusaetzlich in guenstigeren Kaltspeicher wandern
Kafka-Partitionen 6-12 je Topic 24-48 je Topic (mehr Consumer-Parallelitaet fuer das ~10-fache Ereignisvolumen)
HPA-Obergrenze je Service 6-10 Replikate 15-25 Replikate
CDN/Objektspeicher ~50 GB Cover, geringe Kritikalitaet ~500 GB Cover, 10× mehr Auslieferungen - ein CDN ist hier kein "spaeter nachruesten", sondern von Anfang an Pflicht
Observability-Datenvolumen Prometheus/Loki auf Standard-Retention Kardinalitaet und Log-Volumen wachsen mit der Pod-/Request-Zahl - Langzeit-Speicherung ueber ein skalierbares Backend (Thanos/Mimir statt reinem lokalem Prometheus-Storage) wird sinnvoll

11. Kostenordnung im Vergleich (Cloud, monatlich)

Bewusst als GROESSENORDNUNG angegeben, nicht als Angebot - reale Preise haengen stark von Cloud-Anbieter, Region, Reserved-Instance-/Commitment-Rabatten und tatsaechlich verhandelten Konditionen ab. Beide Groessenordnungen nebeneinander, damit sichtbar wird, WAS ueberproportional waechst und was nicht.

Posten 1 Mio. Buecher / 100.000 Nutzer 10 Mio. Buecher / 1 Mio. Nutzer
Kubernetes-Cluster (Compute) 500-1.500 1.500-4.000
PostgreSQL (Multi-AZ, Replicas, ab hier + Partitionierungsaufwand) 800-2.000 2.500-6.000
Redis-Cluster 150-400 400-900
Kafka + RabbitMQ 400-1.000 1.200-3.000
Keycloak-Infrastruktur 150-300 300-600
Observability (inkl. Langzeit-Storage) 200-600 800-2.000
CDN + Objektspeicher 50-150 300-800
Suchcluster (OpenSearch) 0 (optionale Vertiefung, Abschnitt 3.3) 500-1.500 (siehe 10.3, hier faktisch Pflicht)
Zwischensumme (Infrastruktur, ohne Lizenz-Sonderfaelle) grob 2.250-6.000 USD/Monat grob 7.500-19.000 USD/Monat
OpenShift-Subscription (nur falls statt vanilla K8s gewaehlt, Abschnitt 8.5) +1.000-5.000+ +2.000-10.000+ (mehr Cores im groesseren Cluster)
Container-Runtime auf Entwicklerlaptops (Podman, hier gewaehlt) 0 0 - entfaellt; mit Docker Desktop stattdessen ~/Entwickler, teamgroessenabhaengig (siehe 8.6)

Zwei Beobachtungen aus dem Vergleich:

  1. Infrastrukturkosten wachsen bei diesem Sprung ungefaehr um den Faktor 3-3,5×, nicht 10× - trotz zehnfacher Buecher-/Nutzerzahl. Der Grund: ein guter Teil der Kosten bei 1 Mio./100.000 ist bereits Fixkosten fuer Verfuegbarkeit (Multi-AZ, mind. 3 Replikate/Broker/Nodes - siehe Abschnitt 2-6), die nicht linear mit der Nutzerzahl mitwachsen, sondern nur mit dem tatsaechlichen Durchsatz. Das bestaetigt die Kernaussage aus Abschnitt 1: die Nutzerzahl allein ist der falsche alleinige Massstab fuer Infrastrukturkosten.
  2. Lizenzkosten wachsen NICHT gleichmaessig mit den Infrastrukturkosten: eine Container-Runtime-Lizenz auf Entwicklerlaptops (mit Podman = 0, mit Docker Desktop teamgroessenabhaengig) haengt gar nicht an Buch-/Nutzerzahl oder Infrastruktur, waehrend die OpenShift-Subscription (falls gewaehlt) ueberproportional mitwaechst, weil sie an der Cluster-Groesse/Core-Zahl haengt - der Rahmen aus Abschnitt 8 (welche Komponente ueberhaupt Lizenzkosten verursacht) bleibt bei beiden Groessenordnungen identisch, nur die konkreten Euro-Betraege einiger weniger Posten skalieren mit.

12. Inventarliste: konkrete Stueckzahlen je Betriebsmodell

Abschnitt 2-7 und 10 beschreiben Dimensionierung bewusst qualitativ ("HA-Datenbank mit Read-Replicas", "3-Knoten-Cluster"). Diese Sektion macht daraus eine konkrete Stuecklisten mit Kernen (vCPU), RAM und Speicher - je einmal fuer drei unterschiedliche Betriebsmodelle, weil sich die Antwort auf "wie viele Server brauche ich" grundlegend unterscheidet, je nachdem, ob eigene physische Hardware, eine eigene Virtualisierungsschicht oder Cloud-Dienste die Grundlage sind. Wie ueberall in diesem Dokument: Groessenordnung, kein Angebot - reale Beschaffung haengt von konkreten Server-/Instanzmodellen, Verhandlungsrabatten und der genauen Verfuegbarkeitsanforderung ab. Anders als Abschnitt 11 (bewusst anbieterneutral) wird hier AWS konkret benannt, weil explizit danach gefragt wurde - die Groessenordnung ist auf Azure/GCP sinngemaess uebertragbar, aber nicht einzeln durchgerechnet.

12.1 Die drei Betriebsmodelle

Modell Was das konkret heisst Lizenz-/Kostenaspekt
On-Premise / Bare-Metal Eigene physische Server im eigenen (oder gemieteten Colocation-)Rechenzentrum, OHNE Virtualisierungsschicht - jede Rolle (Kubernetes-Node, Postgres, Kafka-Broker, ...) laeuft auf einer eigenen physischen Maschine Keine Hypervisor-Lizenz noetig; dafuer volle Verantwortung fuer Hardware-Beschaffung, Ersatzteile, Rechenzentrumsflaeche, Strom/Kuehlung, Netzwerk (10 GbE-Switches)
VM (eigener Hypervisor) Dieselben Rollen, aber virtualisiert auf einer kleineren Zahl groesserer physischer Hosts (Hypervisor-Cluster) - erlaubt deutlich flexiblere Groessenzuschnitte und bessere Hardware-Auslastung Hypervisor-Lizenz wird zum echten Kostenfaktor: VMware vSphere ist seit der Broadcom-Uebernahme 2023 von Einzel-Perpetual-Lizenzen auf teure, buendelweise Abo-Modelle umgestellt worden (fuer viele Bestandskunden eine spuerbare Kostensteigerung) - Proxmox VE (AGPLv3, kostenlose Community-Nutzung, optionales kostenpflichtiges Support-Abo) ist die im Kontext dieses Projekts naheliegende freie Alternative
AWS Cloud Verwaltete Dienste statt eigener Server (RDS, ElastiCache, MSK, EKS, S3, ...) Keine Hardware-/Hypervisor-Verantwortung; dafuer laufende, nutzungsbasierte Kosten statt Kapitalausgaben - siehe Abschnitt 11 fuer die Kostenordnung

Wichtiger Befund vorab: reines Bare-Metal ohne jede Virtualisierung fuehrt zu auffaellig VIELEN physischen Servern (siehe 12.2) - die meisten Komponenten dieses Systems (Redis, RabbitMQ, Keycloak) nutzen die Kapazitaet eines modernen Servers bei weitem nicht aus, wenn sie ihn exklusiv fuer sich haben. In der Praxis wird das entweder durch eine Virtualisierungsschicht geloest (12.1 "VM") oder dadurch, dass zustandsbehaftete Komponenten wie Kafka ebenfalls ALS Kubernetes-Workload betrieben werden (ueber Operatoren wie Strimzi fuer Kafka statt dedizierter Maschinen) - hier trotzdem als eigene Spalte ausgefuehrt, weil danach gefragt wurde.

12.2 Inventarliste: 1 Million Buecher / 100.000 Nutzer

Komponente On-Premise/Bare-Metal VM (eigener Hypervisor) AWS Cloud
Kubernetes-Worker 4× Server, je 16 Kerne / 64 GB RAM / 500 GB NVMe-SSD 4× VM, je 16 vCPU / 64 GB RAM / 500 GB (auf Hypervisor-Hardware, siehe 12.4) 4× EKS-Node (m6g.4xlarge, Graviton/ARM: 16 vCPU / 64 GB)
Kubernetes-Control-Plane 3× Server, je 4 Kerne / 8 GB RAM / 100 GB SSD 3× VM, je 4 vCPU / 8 GB RAM / 100 GB entfaellt (EKS-Control-Plane vollstaendig verwaltet)
PostgreSQL (5 Datenbanken, ein Cluster mit getrennten DBs - siehe 3.1) 2× Server (Primary + Standby, Streaming Replication), je 8 Kerne / 32 GB RAM / 1 TB SSD (RAID10) 2× VM, gleiche Groesse RDS Multi-AZ db.r6g.xlarge (4 vCPU/32 GB) + 1 Read-Replica db.r6g.large (2 vCPU/16 GB), 500 GB gp3
Redis-Cluster 3× Server, je 4 Kerne / 8 GB RAM / 50 GB SSD 3× VM, gleiche Groesse ElastiCache Valkey (siehe 8.2 zur Lizenzlage) cache.r6g.large × 3 (Cluster-Modus)
Kafka (KRaft, 3 Broker) 3× Server, je 8 Kerne / 16 GB RAM / 500 GB SSD 3× VM, gleiche Groesse Amazon MSK kafka.m5.large × 3, 500 GB EBS je Broker
RabbitMQ (3-Knoten-Cluster) 3× Server, je 4 Kerne / 8 GB RAM / 100 GB SSD 3× VM, gleiche Groesse Amazon MQ (RabbitMQ) mq.m5.large × 3
Keycloak 3× Server, je 4 Kerne / 8 GB RAM / 50 GB SSD 3× VM, gleiche Groesse Kein AWS-Managed-Aequivalent (Cognito ist kein Drop-in-Ersatz, siehe Hinweis unten) - selbstbetrieben auf den EKS-Worker-Nodes oder separaten EC2 m6g.xlarge × 3
Observability (Prometheus/Grafana/Loki/Zipkin) 3× Server, je 8 Kerne / 32 GB RAM / 1-2 TB SSD (Retention) 3× VM, gleiche Groesse Selbstbetrieben auf EKS (wie im Projekt, observability.md) ODER Amazon Managed Prometheus/Grafana + OpenSearch fuer Logs statt Loki
Objektspeicher/CDN 3× Server (MinIO-Cluster, Erasure Coding), je 4 Kerne / 16 GB RAM / 2 TB SSD/HDD 3× VM, gleiche Groesse S3 + CloudFront (vollstaendig verwaltet, kein Server-Line-Item)
Load-Balancer/Ingress 2× Server (HAProxy/Nginx, HA-Paar), je 2 Kerne / 4 GB RAM 2× VM, gleiche Groesse Application Load Balancer (vollstaendig verwaltet)
Physische Server gesamt ~29 Maschinen 29 VMs auf 4 Hypervisor-Hosts (siehe 12.4) 0 eigene Server (4 EKS-Nodes sind ebenfalls verwaltete EC2-Instanzen, kein Colocation/Hardwarekauf)

Hinweis zu Keycloak auf AWS: AWS bietet mit Amazon Cognito einen eigenen Identity-Dienst an, der aber ein ANDERES Produkt mit anderem Funktionsumfang ist (kein OIDC-Server mit Keycloaks Admin-Konsole/Realm-Modell) - ein Wechsel dorthin waere ein Architektur-Umbau, kein reiner Infrastruktur-Wechsel, und bewusst nicht Teil dieser Inventarliste.

12.3 Inventarliste: 10 Millionen Buecher / 1 Million Nutzer

Skaliert gemaess der in Abschnitt 10-11 hergeleiteten ~3-3,5-fachen Infrastruktur-Kostensteigerung (nicht 10-fach) - plus dem in 10.3 begruendeten neuen Suchcluster und der groesseren PostgreSQL-Instanz fuer die partitionierte loans-Tabelle:

Komponente On-Premise/Bare-Metal VM (eigener Hypervisor) AWS Cloud
Kubernetes-Worker 10× Server, je 16 Kerne / 64 GB RAM / 1 TB NVMe-SSD 10× VM, gleiche Groesse 10× EKS-Node m6g.4xlarge
Kubernetes-Control-Plane 3× Server, je 8 Kerne / 16 GB RAM / 200 GB SSD 3× VM, gleiche Groesse entfaellt (verwaltet)
PostgreSQL 2× Server (Primary + Standby) je 16 Kerne / 64 GB RAM / 4 TB SSD (RAID10) + 2× Read-Replica-Server je 8 Kerne/32 GB 4× VM, gleiche Groessen RDS Multi-AZ db.r6g.2xlarge (8 vCPU/64 GB) + 2-3 Read-Replicas db.r6g.xlarge, 2 TB gp3
Redis-Cluster 6× Server, je 4 Kerne / 16 GB RAM / 100 GB SSD 6× VM, gleiche Groesse ElastiCache Valkey cache.r6g.xlarge × 6
Kafka 5× Server, je 8 Kerne / 32 GB RAM / 1 TB SSD 5× VM, gleiche Groesse Amazon MSK kafka.m5.xlarge × 5-6
RabbitMQ 3× Server, je 4 Kerne / 16 GB RAM / 200 GB SSD 3× VM, gleiche Groesse Amazon MQ mq.m5.xlarge × 3-5
Keycloak 3× Server, je 8 Kerne / 16 GB RAM / 50 GB SSD 3× VM, gleiche Groesse Selbstbetrieben (wie oben), m6g.2xlarge × 3
Suchcluster (OpenSearch, neu ab dieser Groessenordnung, siehe 10.3) 5× Server, je 8 Kerne / 32 GB RAM / 1 TB SSD 5× VM, gleiche Groesse Amazon OpenSearch Service, r6g.large.search × 5
Observability 5× Server, je 8 Kerne / 32 GB RAM / 4 TB SSD (mehr Retention-Bedarf) 5× VM, gleiche Groesse Amazon Managed Prometheus/Grafana + OpenSearch fuer Logs
Objektspeicher/CDN 6× Server (MinIO), je 4 Kerne / 16 GB RAM / 4 TB SSD/HDD 6× VM, gleiche Groesse S3 + CloudFront (verwaltet)
Load-Balancer/Ingress 2× Server, je 4 Kerne / 8 GB RAM 2× VM, gleiche Groesse Application Load Balancer (verwaltet)
Physische Server gesamt ~52 Maschinen 52 VMs auf 8-10 Hypervisor-Hosts (analog zur Rechnung in 12.4, groesser dimensioniert) 0 eigene Server

12.4 Zur Nachvollziehbarkeit: Hypervisor-Hardware fuer die VM-Spalte (1 Mio./100.000-Fall)

Die 29 VMs aus 12.2 summieren sich auf ca. 190 vCPU und ~620 GB RAM Gesamtbedarf. Mit einer fuer gemischte Workloads ueblichen CPU-Ueberbuchung von 1,5:1 (RAM wird NICHT ueberbucht - ein haeufiger Fehler, der zu Swapping/OOM unter Last fuehrt) und einer N+1-Reserve (das System muss auch bei EINEM ausgefallenen Hypervisor-Host weiterlaufen):

Das ist der konkrete, quantifizierte Vorteil von Virtualisierung gegenueber Bare-Metal in dieser Inventarliste: 29 logische Maschinen auf 4 statt 29 physischen Servern, mit weiterhin eingebauter Ausfalltoleranz.

12.5 Geschaetzte Kosten je Komponente (Bottom-up, mit realen Listenpreisen)

Abschnitt 11 schaetzt Kosten "top-down" nach Kategorie (grosszuegige Bandbreiten). Diese Sektion rechnet stattdessen "bottom-up" - je Inventar-Zeile aus 12.2/12.3 einzeln bepreist, mit am 08.2026 recherchierten oeffentlichen Listenpreisen (AWS On-Demand-Preise US-Standardregion ohne Reserved-Instance-/Savings-Plan-Rabatt, typischerweise 30-50 % guenstiger bei 1-3 Jahren Bindung; eu-central-1/Frankfurt liegt erfahrungsgemaess ca. 10-20 % darueber). Fuer On-Premise/VM gibt es keine vergleichbare oeffentliche Preisliste fuer Server-Hardware - dort sind es grobe Marktpreis-Annahmen (dual-socket Rack-Server, Standardausstattung), ausdruecklich keine Angebote. Alle Betraege in USD, da die AWS-/Oracle-/Red-Hat-Listenpreise USD-nativ sind.

Rechenweg On-Premise/VM: Kaufpreis linear ueber 5 Jahre abgeschrieben (60 Monate, uebliche Hardware-Nutzungsdauer) plus anteilige Colocation (Miete/Strom/Kuehlung/Anbindung, siehe 12.1 - recherchierter Richtwert 400-800 EUR/Monat pro Rack in einer deutschen Tier-1-Stadt, umgelegt auf die Server pro Rack). Betriebssystem bewusst mit 0 USD angesetzt (Linux-Distributionen wie Ubuntu Server/Rocky Linux sind kostenlos - passend zu den ohnehin containerisierten Workloads dieses Projekts).

1 Million Buecher / 100.000 Nutzer

Komponente On-Premise/Bare-Metal (amortisiert+Colo, USD/Monat) VM (amortisiert+Colo, konsolidiert, USD/Monat) AWS (Listenpreis On-Demand, USD/Monat)
Kubernetes-Worker (4×) ~1.200 (4× ~300) anteilig in Hypervisor-Pauschale unten 1.799 (4× m6g.4xlarge à 449,68)
Kubernetes-Control-Plane (3×) ~900 anteilig in Hypervisor-Pauschale unten 0 (EKS-Control-Plane-Pauschale ~73/Monat, separat, gering)
PostgreSQL (2× + Storage) ~600 anteilig 879 (Multi-AZ db.r6g.xlarge + Read-Replica db.r6g.large + 500 GB gp3)
Redis-Cluster (3×) ~900 anteilig 451 (3× cache.r6g.large)
Kafka (3×) ~900 anteilig 610 (3× kafka.m5.large + Storage)
RabbitMQ (3×) ~900 anteilig 703 (Amazon MQ, 3-Knoten-HA-Cluster + Storage)
Keycloak (3×) ~900 anteilig 337 (3× m6g.xlarge, selbstbetrieben)
Observability (3×) ~900 anteilig 0 (selbstbetrieben auf den bereits gezaehlten EKS-Nodes)
Objektspeicher/CDN (3×) ~900 anteilig 100 (S3 + CloudFront)
Load-Balancer (2×) ~600 anteilig 50 (Application Load Balancer)
Hypervisor-Hardware (4× Hosts, siehe 12.4) entfaellt (kein Hypervisor) ~3.300 (4× ~2.333 amortisiert + ~1.000 Colo/Strom fuer 4 dichte Hosts) entfaellt
Summe Infrastruktur ~8.700 ~3.300 ~4.930

10 Millionen Buecher / 1 Million Nutzer

Komponente On-Premise/Bare-Metal (USD/Monat) VM (USD/Monat) AWS (USD/Monat)
Kubernetes-Worker (10×) ~3.000 anteilig 4.497 (10× m6g.4xlarge)
Kubernetes-Control-Plane (3×) ~1.400 anteilig 0 (verwaltet)
PostgreSQL (4× + Storage) ~1.200 anteilig 2.365 (Multi-AZ db.r6g.2xlarge + 2-3 Read-Replicas + 2 TB gp3)
Redis-Cluster (6×) ~1.800 anteilig 1.800 (6× cache.r6g.xlarge)
Kafka (5×) ~1.500 anteilig 2.236 (5-6× kafka.m5.xlarge + Storage)
RabbitMQ (3×) ~900 anteilig 1.780 (Amazon MQ, mq.m5.xlarge + Storage)
Keycloak (3×) ~900 anteilig 675 (3× m6g.2xlarge, selbstbetrieben)
Suchcluster/OpenSearch (5×) ~1.500 anteilig 760 (5× r6g.large.search + Storage)
Observability (5×) ~1.500 anteilig 0 (selbstbetrieben)
Objektspeicher/CDN (6×) ~1.800 anteilig 400 (S3 + CloudFront)
Load-Balancer (2×) ~600 anteilig 125 (ALB)
Hypervisor-Hardware (8-10× Hosts) entfaellt ~8.500 (9 Hosts ⌀, groesser dimensioniert als 12.4) entfaellt
Summe Infrastruktur ~16.100 ~8.500 ~14.640

Drei Beobachtungen aus der Bottom-up-Rechnung:

  1. Sie bestaetigt die grob geschaetzten Bandbreiten aus Abschnitt 11 (2.250-6.000 USD bzw. 7.500-19.000 USD): 4.930 USD und 14.640 USD liegen beide innerhalb dieser top-down geschaetzten Spannen - zwei unabhaengige Rechenwege (Kategorie-Faustregeln vs. Instanz-fuer- Instanz-Listenpreise) kommen auf dieselbe Groessenordnung.
  2. VM schlaegt sowohl Bare-Metal als auch AWS bei den reinen Infrastrukturkosten - der in 12.4 gezeigte Konsolidierungseffekt (29 bzw. 52 logische Maschinen auf wenige, grosse Hypervisor-Hosts) zahlt sich hier konkret in Dollar aus. Das ist absichtlich NICHT die ganze Geschichte - Punkt 3 relativiert das.
  3. Diese Tabelle zeigt nur Infrastruktur, keine Betriebskosten (Personal) - genau das holt Abschnitt 13 nach. AWS' hoeherer Infrastrukturpreis gegenueber VM ist zu einem grossen Teil bereits eingepreister Betriebsaufwand (Patching, Hochverfuegbarkeits-Engineering, Backup-Automatisierung uebernimmt AWS) - beim On-Premise/VM-Betrieb faellt genau dieser Aufwand stattdessen als zusaetzliche Personalkosten an, siehe dort. Ein fairer Vergleich braucht beide Zahlen zusammen, nicht nur die Infrastruktur-Zeile.

Quellen der Listenpreise (oeffentliche Recherche, Stand 08.2026 - Momentaufnahmen, keine Angebote, Aenderungen durch die Anbieter jederzeit moeglich): AWS EC2/RDS/ElastiCache/MSK/Amazon MQ/OpenSearch On-Demand-Preisseiten und aggregierte Preisuebersichten (u. a. economize.cloud, instances.vantage.sh, cloudprice.net); Red-Hat-OpenShift-Listenpreis-Einordnungen (u. a. vendorbenchmark.com, faddom.com); Oracle "Java SE Universal Subscription Global Price List" (oracle.com); Docker-Business-Preisseite und Marktuebersichten (u. a. costbench.com); Colocation- Richtwerte deutscher Rechenzentren (telehouse-rechenzentrum.de, telemaxx.de); DevOps-Engineer- Gehaltsdaten fuer Deutschland (jobvector.de, stepstone.de, glassdoor.de).

13. Betriebskosten: Personal

Alle bisherigen Abschnitte behandeln Infrastruktur (Server/Dienste) und Lizenzen (Software-Nutzungsrecht) - eine dritte, in Kapazitaetsplanungen haeufig unterschaetzte Kostenachse ist Personal, das dieses System tatsaechlich betreibt: Deployments, Monitoring, Incident-Response, Kapazitaets-Nachsteuerung, Sicherheitsupdates. Bei den in Abschnitt 1 hergeleiteten, eher moderaten Traffic-Zahlen ist das keine akademische Fussnote - fuer ein System mit echten 100.000 (bzw. 1 Mio.) Nutzern reicht "das laeuft nebenbei mit" nicht mehr.

13.1 Teamgroesse (grobe Annahme, begruendet)

Groessenordnung Team (Vollzeitaequivalente) Begruendung
1 Mio. Buecher / 100.000 Nutzer ~2-3 FTE DevOps/SRE (inkl. Bereitschaftsdienst-Rotation), ~0,5 FTE anteilige DBA-Expertise Passt zur in Abschnitt 2-7 beschriebenen Betriebsgroesse (ein Kubernetes-Cluster, fuenf Datenbanken, Messaging, Identity) - genug fuer Rufbereitschaft zu zweit/dritt, ohne Single-Point-of-Failure "die eine Person, die alles kennt"
10 Mio. Buecher / 1 Mio. Nutzer ~4-6 FTE DevOps/SRE, ~1 FTE DBA (Partitionierung/Suchcluster aus 10.3 brauchen mehr dedizierte Datenbank-Expertise) Mehr Komponenten (Suchcluster neu), groesserer Cluster, hoehere Betriebs-Kritikalitaet bei 10× mehr echten Nutzern

13.2 Grobe jaehrliche Personalkosten (Deutschland, Stand August 2026)

Recherchierte Marktdaten fuer DevOps-Engineer-Gehaelter in Deutschland (mehrere Quellen, Stand 08.2026): Median ca. 78.000 EUR brutto/Jahr, Spanne von ca. 45.000 EUR (Junior) bis 120.000+ EUR (Lead/Principal) - je nach Erfahrung und Region (Muenchen/Frankfurt tendenziell 10-15 % ueber dem Bundesdurchschnitt). Zum Bruttogehalt kommen bei einer Festanstellung in Deutschland ueblicherweise weitere ca. 20-25 % Arbeitgeber-Lohnnebenkosten (Sozialversicherung) hinzu - macht grob 95.000-100.000 EUR Arbeitgeber-Gesamtkosten pro FTE/Jahr bei einem mittleren Gehaltsniveau.

Groessenordnung Team Grobe jaehrliche Personalkosten (inkl. Lohnnebenkosten)
1 Mio./100.000 2,5 FTE DevOps/SRE + 0,5 FTE DBA ≈ 3 FTE grob 285.000-300.000 EUR/Jahr (≈ 24.000-25.000 EUR/Monat)
10 Mio./1 Mio. 5 FTE DevOps/SRE + 1 FTE DBA ≈ 6 FTE grob 570.000-600.000 EUR/Jahr (≈ 47.500-50.000 EUR/Monat)

13.3 Die eigentliche Erkenntnis: Personal, nicht Infrastruktur, dominiert die Gesamtkosten

Vergleich mit den Infrastruktur-Summen aus 12.5 (auf EUR/Monat umgerechnet, grob 1 USD ≈ 0,92 EUR Stand 08.2026):

Groessenordnung Infrastruktur/Monat (AWS, aus 12.5) Personal/Monat (aus 13.2) Verhaeltnis
1 Mio./100.000 ≈ 4.540 EUR ≈ 24.000-25.000 EUR Personal ist ~5-5,5× teurer als reine AWS-Infrastruktur
10 Mio./1 Mio. ≈ 13.470 EUR ≈ 47.500-50.000 EUR Personal ist ~3,5-4× teurer als reine AWS-Infrastruktur

Das ist kein Nebeneffekt dieser speziellen Rechnung, sondern ein bekanntes Muster in der Branche: bei Systemen dieser Groessenordnung (nicht Hyperscale wie ein globaler Streaming-Dienst) dominieren ueblicherweise Personalkosten, nicht Infrastrukturkosten, die Gesamt-TCO - einer der Hauptgruende, warum verwaltete Cloud-Dienste (RDS statt Postgres-auf-VM, MSK statt selbstbetriebenem Kafka) trotz hoeherer Infrastruktur-Rechnung oft trotzdem die guenstigere Gesamtoption sind: sie verschieben einen Teil des sonst noetigen Personalaufwands (Patching, Failover-Engineering, Backup-Verifikation) in den bereits eingepreisten Dienst. Diese Rechnung ist bewusst grob (siehe 13.4) - die Groessenordnung des Verhaeltnisses (Personal dominiert) ist der eigentliche Punkt, nicht die exakte Zahl.

13.4 Was diese Personalkostenrechnung NICHT einschliesst

14. Bewusst ausserhalb des Scopes dieses Dokuments

⌂ Cockpit