Ein Binary, ein Bucket: Wann Sie Services auf Objektspeicher bauen sollten

Von Diogo Hudson Dias
Senior engineer drawing an architecture with a single service backed by cloud object storage on a glass wall in a modern office.

Sie können heute ganze Services mit einem einzigen zustandslosen Binary und einem Bucket ausliefern. Keine Datenbank. Keine Queue. Keine Block-Volumes. Nur Objektspeicher. In den letzten Wochen trendeten Show-HN-Posts wie leichtgewichtige Git-Server auf S3-ähnlichen Stores, langlebige Streams über HTTP auf Basis von Objektspeicher und selbstgehostete Bibliotheken, die vollständig auf Buckets laufen. Das ist kein Gimmick-Hack. Es ist ein Architekturpattern, das inzwischen die nötigen Primitiven hat, um produktionsreif zu sein—wenn Sie es dort einsetzen, wo es passt.

Wenn Sie als CTO den Infrastruktur-Blast-Radius und das Vendor-Risiko reduzieren wollen, lohnt sich ein ernsthafter Blick auf dieses Pattern. Aber es ist keine Religion. Es ist ein bewusster Trade-off: Sie tauschen Sub‑10‑ms‑Latenzen und ACID-Transaktionen gegen extreme Haltbarkeit, Portabilität und operative Einfachheit. Unten finden Sie einen Entscheidungsrahmen und belastbare Zahlen, damit Sie entscheiden können, wo „one binary, one bucket“ in Ihren Stack gehört.

Warum das jetzt tragfähig ist

  • Starke Konsistenz ist da. Seit 2020 bieten große Objektspeicher wie Amazon S3 starke Read-after-Write-Konsistenz für PUT, DELETE und LIST. Sie müssen für grundlegendes CRUD nicht mehr um Eventual Consistency herum programmieren.
  • Kosten und Portabilität haben sich verbessert. S3-Requests sind pro Million günstig, Cloudflare R2 hat Egress-Mauten abgeschafft, und S3‑kompatible APIs (MinIO, R2, Wasabi) machen „lift your bucket somewhere else“ zu einer realen Absicherung.
  • Edge und Serverless sind gereift. VPC Endpoints, regionale Edge-Caches und per-Request Compute bedeuten, dass Sie die Latenz ohne eine Farm zustandsbehafteter Server im Rahmen halten können.

Was „one binary, one bucket“ tatsächlich bedeutet

Typische Muster:

  • Append-only-Logs. Events werden als unveränderliche Objekte geschrieben, partitioniert nach Zeit oder Shard. Consumer listen und lesen Bereiche; periodische Kompaktierung führt kleine Dateien zusammen.
  • Inhaltsadressierte Blobs. Artefakte, Images, Model-Gewichte oder Packfiles, adressiert per Hash; Indizes sind kleine Manifeste.
  • Snapshot-Pointer. Ein winziges „latest“-Manifest zeigt auf unveränderliche Objekte für den aktuellen Zustand; Updates werden über einen Single Writer oder ein Lease serialisiert.
  • Bereichslesbare Formate. Speichern Sie Parquet, Packfiles oder tar‑ähnliche Bundles, sodass Sie kleine Slices via HTTP Range bedienen können, statt Millionen winziger Objekte anzulegen.

Der gemeinsame Nenner ist: zuerst Unveränderlichkeit, Kompaktierung danach, Pointer zuletzt.

Wo es glänzt

  • Regulierte Audit-Trails und WORM-Anforderungen. Object Lock und Versionierung liefern Write‑Once‑, Aufbewahren‑für‑N‑Jahre‑Semantik out of the box. Wenn Sie unter Aufbewahrungsregeln wie SEC 17a-4 leben oder nachweisbare Unveränderlichkeit brauchen, ist das Ihr Freund.
  • Artifact-Registries und Medienbibliotheken. Große, unveränderliche Blobs mit gelegentlichen Metadaten-Updates sind genau das, wofür Buckets gedacht sind.
  • Niedrige bis moderate Schreibraten mit burstigen Reads. 5–50 Writes/Sek. pro Service mit 10–100x Read-Fan‑out sind komfortabel, insbesondere wenn Sie Writes bündeln und Reads cachen.
  • Cross-Cloud-Absicherung. Sie wollen denselben Service auf AWS, GCP oder on‑prem betreiben? S3‑kompatible APIs plus ein zustandsloses Binary machen Portabilität real.

Wo es schmerzt

  • Heiße Zähler und stark umkämpfter Zustand. Es gibt keine atomaren Inkremente oder Multi‑Row‑Transaktionen. Wenn Sie ACID brauchen, brauchen Sie weiterhin eine Datenbank.
  • Tail-Latenz unter 20 ms. Typische p50‑Object‑GETs liegen im zweistelligen Millisekundenbereich; p99 kann zwischen 100–400 ms liegen. Mit Caching lässt sich einiges verstecken, aber nicht alles.
  • Sehr hohe Schreibraten winziger Objekte. Pro‑Request‑Kosten und Metadaten-Overhead können die Speicherkosten übersteigen, wenn Sie den Bucket mit Tausenden Objekten pro Sekunde befeuern.

Die Kostenrechnung, die die meisten Teams überspringen

Modellieren wir die naive und die vernünftige Variante eines bucket‑gestützten, queue‑ähnlichen Services.

Naiv: Ein Objekt pro Nachricht

  • Schreibrate: 200 Nachrichten/Sek. (moderat).
  • Leserate: 1.000 Reads/Sek. (5x Fan‑out).
  • Monatliche Operationen: ~518 Millionen Writes, ~2,6 Milliarden Reads.
  • Typische S3‑Request‑Preise: $0.005 pro 1.000 PUT; $0.0004 pro 1.000 GET.

Kosten: writes ≈ 518,400k / 1k × $0.005 = $2,592/Monat; reads ≈ 2,592,000k / 1k × $0.0004 = $1,037/Monat. Gesamt ≈ $3,629/Monat nur für Requests, exklusive Storage. Das ist nicht katastrophal, aber verschwenderisch—weil Sie pro winzigem Objekt zahlen.

Vernünftig: Batching und Bündeln

  • Batched Writes: 100 Nachrichten pro Objekt → 2 Writes/Sek. statt 200.
  • Range‑Reads: Bestimmte Nachrichten über Offsets in einem 8–64‑MB‑Bundle lesen; Bundles am Edge cachen.
  • Monatliche Operationen: ~5,18 Millionen Writes, Reads sinken mit Caching um den Faktor 10–100.

Kosten: writes ≈ 5,184k / 1k × $0.005 = ~$26/Monat; reads vielleicht ~$100–$300/Monat je nach Hit‑Ratio. Unterm Strich: 10–50x günstiger bei den Request‑Gebühren. Speicherkosten ändern sich kaum.

Die Lektion: Bei Objektspeicher bestimmt die Granularität Ihr Budget. Wenn Sie nicht batchen können, zahlen Sie drauf.

Latenz – Klartext

Angenommen, Zugriff in der warmen Region über einen VPC Endpoint:

  • GET p50: 10–30 ms sind typisch.
  • GET p95–p99: 100–400‑ms‑Spikes passieren. Designen Sie dafür.
  • PUT p50: 10–50 ms; p99 kann an ein paar hundert Millisekunden kratzen.

Wenn Sie für Hot Paths Tail-Latenzen im einstelligen Millisekundenbereich brauchen, ist das das falsche Tool. Wenn Sie Tails hinter Caches und asynchroner Arbeit verstecken können, passt es.

Konsistenz- und Nebenläufigkeitsmodell

Heutige große Buckets bieten starke Read-after-Write für neue Objekte und Überschreibungen. Sie können einem LIST nach einem PUT vertrauen. Den Bucket als Lock‑Manager zu benutzen, können Sie jedoch nicht. Zuverlässige Muster, die wir gesehen haben:

  • Single‑Writer pro Shard mit einem Lease in einem schnellen KV (DynamoDB/etcd). Der Bucket speichert unveränderliche Objekte; der KV schützt den kleinen, veränderlichen Pointer.
  • Manifest‑Commits. Schreiben Sie Ihre Daten in ein neues inhaltsadressiertes Objekt, dann aktualisieren Sie ein kleines Manifest, das darauf zeigt. Serialisieren Sie Manifest‑Updates über einen Single Writer oder ein Lease.
  • Idempotente Writes via Hashing. Verwenden Sie den SHA‑256 des Payloads als Key, um Duplikate über Retries hinweg zu vermeiden.

Könnten Sie Compare‑and‑Swap auf einem Pointer‑Objekt im Bucket versuchen? Nicht portabel. Halten Sie Ihr Locking in einem KV, der dafür gemacht ist, und Ihre Daten unveränderlich im Bucket.

Design-Patterns, die in Produktion bestehen

1) Layout für Batching und Kompaktierung

  • Partitionieren nach Zeit und Shard: z. B. topic=orders/partition=03/dt=2026-08-25/0001.parquet.
  • Klein schreiben, später kompaktieren: Während des Ingests 1–8‑MB‑Objekte für Latenz erzeugen, dann stündlich zu 64–256‑MB‑Objekten kompaktieren, um Request‑ und Listing‑Overhead zu senken.
  • Range‑freundliche Formate verwenden: Parquet, Packfiles, tar‑ähnliche Bundles mit einem Index‑Footer, damit Reads nur die benötigten Ranges holen können.

2) Ein kleiner KV für die Control Plane

  • Pointer, Leases und Sequenznummern speichern in einem KV‑Store mit konditionalen Writes. Halten Sie es bei ein paar Hundert Writes/Sek.
  • Alles andere ist unveränderlich und liegt im Bucket. Wenn es sich bewegt oder mutiert, machen Sie etwas falsch.

3) Aggressives Caching

  • Edge‑CDN für Reads mit langen TTLs und Cache‑Busting über versionierte Keys.
  • Lokaler NVMe‑Cache im Binary für heiße Bundles und Kompaktierungseingaben.
  • Presigned URLs damit Clients große Blobs direkt aus dem Bucket herunterladen können, ohne über Ihr Binary zu proxyen.

4) Kostenwächter

  • Budget‑Alarme auf Request‑Zahlen, nicht nur Transfer und Storage.
  • Unvollständige Multipart‑Uploads abbrechen lassen; andernfalls leaken Sie Storage und Geld.
  • Prefixe rotieren um Objekt‑Listing‑Kosten in riesigen Verzeichnissen zu begrenzen; vermeiden Sie es, bei jeder Anfrage die Welt zu listen.

5) Sicherheit und Compliance

  • Private Buckets mit VPC Endpoints um öffentliche Egress zu vermeiden und die Angriffsfläche zu reduzieren.
  • SSE-KMS für Verschlüsselung mit mandantenbezogenen Schlüsseln, wenn Sie multi‑tenant sind.
  • Object Lock (Governance- oder Compliance-Modus) für aufbewahrungskritische Datensätze.
  • Access Logs und CloudTrail aktivieren; diese Logs in einem separaten, gesperrten Bucket aufbewahren.

Use Cases, die tatsächlich funktionieren

  • Git‑ähnliche Content Stores. Packfiles und Refs in den Bucket legen; Ref‑Updates in einem KV serialisieren. Ein kleines Binary übersetzt das Git‑Wire‑Protokoll in Bucket‑Operationen. Genau das machen mehrere neue leichtgewichtige Git‑Server auf HN.
  • Dauerhafte Event‑Streams über HTTP. Nachrichten werden in zeitpartitionierten Bundles gespeichert; Consumer paginieren via Range‑Requests durch Bundles. Die Latenz liegt im zwei- bis dreistelligen Millisekundenbereich, aber die Haltbarkeit ist extrem und der Betrieb simpel.
  • Medien, Modelle und Artefakte. Hoch lebe die Unveränderlichkeit. Verwenden Sie Inhaltsadressen; überschreiben Sie niemals echte Daten, nur Manifeste.
  • Feature‑Flag‑Snapshots und Config. Ein einziger Pointer auf die aktive Config, ausgeliefert via CDN; Config‑Bundles im Bucket; ein KV koordiniert den Pointer‑Tausch.

Wo das draußen schiefgeht

  • Buckets wie POSIX behandeln. Keine atomaren Rename‑Semantiken, keine Verzeichnis‑Locks und langsames Listing, wenn Sie 100 Millionen Objekte in ein einziges Prefix kippen.
  • Kleinobjekt‑Stürme. Wenn Sie im Schnitt unter ~1 MB pro Objekt liegen und Hunderte Writes/Sek. pushen, fressen Sie die Request‑Kosten auf.
  • Unbegrenzte LISTs in Hot Paths. Immer Continuation Tokens mitführen; nie mehr listen als nötig; noch besser, aus einem Manifest oder Index lesen.
  • Cross‑Region‑Illusionen. Replikations‑Lag ist real. Bauen Sie niemals regionsübergreifende Koordination darauf, dass die Replikation schon aufholt.

Portabilität und Anbieterrealitäten

Die S3‑API ist de‑facto‑Standard, aber an den Rändern unterscheiden sich die Semantiken:

  • Konsistenz: S3 hat starke Read-after-Write; einige Provider hatten historisch kein starkes LIST. In Staging verifizieren.
  • Egress- und Request-Pricing: Cloudflare R2 hat Egress-Mauten entfernt, aber Request‑Klassen sind anders bepreist als bei S3. Rechnen Sie nach, bevor Sie „no egress“ hinterherlaufen.
  • On-prem: MinIO ist hervorragend für S3‑Semantik in Ihrem eigenen DC oder In‑Country‑Regionen, wenn LGPD oder Kundenverträge Datenresidenz in Brazil erfordern.

Ein Entscheidungsrahmen, den Sie diese Woche anwenden können

Bewerten Sie Ihr Kandidaten-Workload auf jeder Achse von 1 (schlechte Passung) bis 5 (sehr gute Passung):

  1. Schreibrate und Granularität. Unter 10 Writes/Sek. im Schnitt und auf 1–8‑MB‑Objekte batchbar? 5 Punkte. Hunderte winzige Writes/Sek., die Sie nicht batchen können? 1 Punkt.
  2. Latenztoleranz. OK mit 50–150 ms Reads und gelegentlichen 200–400 ms Tails? 5 Punkte. Brauchen Sie p99 unter 20 ms? 1 Punkt.
  3. Immutability first. Sind 95% Ihrer Daten Append‑only? 5 Punkte. Ist der Großteil heiß, veränderliche Zeilen mit Transaktionen? 1 Punkt.
  4. Regulatorische Aufbewahrung. Brauchen Sie WORM oder nachweisbare Aufbewahrung? 5 Punkte. Kein Compliance‑Druck? 3 Punkte. Brauchen Sie häufige Deletes/Updates? 1 Punkt.
  5. Wert der Portabilität. Zählt Cross‑Cloud oder On‑prem‑Hedge? 5 Punkte. Sie sind ohnehin all‑in auf einen Managed Service? 2 Punkte.

Wenn Sie 18–25 Punkte erreichen: Starker Kandidat für einen bucket‑gestützten Service. 12–17: Hybrid erwägen: unveränderliche Daten in Buckets, Pointer/Locks in einem KV/DB. Unter 12: Bei Datenbanken und Queues bleiben.

Ein 30–60–90‑Tage‑Pilotplan

30 Tage: Den Kern beweisen

  • Wählen Sie ein Workload: Artifact Store, Audit Log oder einen überwiegend lesenden Config‑Service.
  • Bauen Sie ein einziges zustandsloses Binary in Go oder Rust mit einer minimalen API: PUT Bundle, GET nach Key oder Range, LIST nach Manifest.
  • Hinterlegen Sie es in Staging mit einem S3‑kompatiblen Store (AWS S3 oder MinIO), plus einem kleinen KV (DynamoDB/etcd) für Leases und Pointer.
  • Instrumentieren Sie Request‑Zahlen, p50/p95/p99‑Latenzen und Bundle‑Größen.

60 Tage: Härten

  • Fügen Sie Kompaktierung und Bundle‑Indizes hinzu, um Request‑Kosten zu deckeln.
  • Stellen Sie ein CDN vor GETs; wechseln Sie für große Downloads auf Presigned URLs.
  • Aktivieren Sie Versionierung und Object Lock im Governance‑Modus für Audit‑Datensätze.
  • Führen Sie Crash‑Konsistenztests durch: Prozess 1.000‑mal mitten im Commit killen; sicherstellen, dass keine Partialzustände nach außen dringen.

90 Tage: Entscheiden

  • Vergleichen Sie beobachtete Kosten/Latenzen mit einem gleichwertigen DB‑gestützten Design.
  • Entscheiden Sie den Scope: auf weitere leseintensive Services ausweiten oder nur für Artefakte und Logs beibehalten.
  • Schreiben Sie das Runbook: Kompaktierungs‑SLOs, Bucket‑Lifecycle‑Policies, Multipart‑Abort‑Zeitpläne und Budget‑Alarme.

Wie wir es mit einem Nearshore‑Pod staffen würden

Für US‑Startups kann ein zwei‑ bis dreiköpfiger Nearshore‑Pod aus Brazil das Ende‑zu‑Ende übernehmen:

  • 1 Senior‑Engineer für Go oder Rust der Binary, Range‑I/O und Kompaktierung implementiert.
  • 1 Platform Engineer der S3‑Policies, VPC Endpoints, KMS und CDN verdrahtet.
  • Optional ein Data Engineer wenn Sie Parquet/Spaltenformate und Downstream‑Analytics brauchen.

Erwarten Sie 6–8 Stunden Überschneidung mit US‑Zeitzonen und ein Gesamtzeitfenster von 8–12 Wochen vom POC bis zum gehärteten Service mit SLOs und Kostenleitplanken.

Das Fazit

„One binary, one bucket“ ist kein Stunt. Es ist ein operativer Keil: Bauen Sie einfachere Systeme, indem Sie auf Unveränderlichkeit, Batching und die Haltbarkeitssemantik setzen, die Ihnen Objektspeicher gratis mitliefert. Setzen Sie es dort ein, wo die Physik Ihres Workloads zur Physik des Buckets passt. Wenn die Passung stimmt, sparen Sie 20–50% an Infra, reduzieren die operative Angriffsfläche und erkaufen sich eine echte Multi‑Cloud‑Absicherung. Wenn sie nicht stimmt, bauen Sie ein langsames, teures Dateisystem‑Cosplay. Wählen Sie weise.

Wichtigste Erkenntnisse

  • Services auf Objektspeicherbasis sind heute produktionsreif – dank starker Konsistenz und gereiftem Edge/Serverless‑Tooling.
  • Gute Passung: unveränderliche Daten, Audit/WORM, Artefakte und niedrige bis moderate Schreibraten, die sich batchen lassen.
  • Schlechte Passung: heißer, transaktionaler Zustand und Tail‑Latenzanforderungen unter 20 ms.
  • Granularität treibt die Kosten—in 1–64‑MB‑Bundles batchen und kompakten, um Request‑Gebührenexplosionen zu vermeiden.
  • Locks und Pointer in einem echten KV halten; Daten im Bucket unveränderlich halten.
  • Versionierung, Object Lock, VPC Endpoints, KMS und CDN einsetzen, um Sicherheit und Performance zu härten.
  • Vor einer Entscheidung einen 30–60–90‑Tage‑Piloten mit harten SLOs und Budget‑Alarmen fahren.

Author: Diogo Hudson Dias

Ready to scale your engineering team?

Tell us about your project and we'll get back to you within 24 hours.

Start a conversation