Chapter 19 · Storage

Object Storage


Object storage exposes durable blobs through a bucket/key namespace rather than filesystem blocks or relational rows. It is a foundation for media, backups, data lakes, user uploads, artifacts, and archives. Senior interview answers separate the object data plane from metadata and authorization, design multipart and resumable transfers, define consistency and immutability, quantify bandwidth and recovery, and handle lifecycle, integrity, privacy deletion, and event delivery.

Level: foundation → senior/staff Primary skill: designing durable large-object workflows, metadata, and lifecycle at scale Companions: CDNs · HTTP · Replication and Sharding · Message Queues

How to use this chapter

  1. Read the mental model and mechanics without taking notes.
  2. Close the page and explain the topic aloud in five minutes.
  3. Work the quantitative example on paper.
  4. Answer the question ladder without revealing the answer signals.
  5. Complete one design drill and score yourself with the senior checklist.

Learning objectives

  • Explain object, block, and file storage semantics and choose among them by workload.
  • Design keys, metadata, upload/download paths, multipart transfers, checksums, and range reads.
  • Use presigned/delegated access without turning object keys into authorization boundaries.
  • Reason about consistency, versioning, replication, durability, availability, and disaster recovery separately.
  • Plan lifecycle tiers, retention, legal hold, deletion, encryption, and audit.
  • Integrate object storage with databases, CDNs, queues, and data-processing systems safely.

Mental model

Think of object storage as a massive key-to-immutable-byte-sequence map with metadata and lifecycle operations. The service internally partitions metadata, stores encoded/replicated chunks, verifies integrity, and serves whole-object or byte-range requests. The client-facing abstraction hides disks but does not remove bandwidth, request-rate, namespace, consistency, or cost limits.

Core mechanics

Object versus file and block storage

Block storage exposes addressable blocks to a filesystem or database and supports low-level random reads/writes. File storage exposes hierarchical paths, directory/rename semantics, and often shared POSIX-like access. Object storage exposes API operations for named objects and generally replaces an object rather than modifying arbitrary bytes in place. It scales namespace and durability by relaxing filesystem semantics.

Use object storage for large immutable/semi-immutable blobs, distribution, archives, and analytical files. Use block storage for database volumes and latency-sensitive random updates. Use file storage where shared directory/file semantics and existing tools dominate. Hybrid systems commonly keep metadata/indexes in a database and bulk bytes in objects.

Namespaces, keys, and metadata

Buckets/containers provide administrative and policy boundaries; keys identify objects and may look hierarchical even when the namespace is logically flat. Design opaque stable object IDs rather than exposing user filenames as primary identity. Store original filename and content metadata separately. Avoid sensitive information in keys because they appear in logs, URLs, analytics, and audit trails.

Key prefixes can influence listing, lifecycle, and—in some systems or historical designs—partition behavior. Do not rely on undocumented partition assumptions; load test expected request rates. Application metadata such as owner, object ID, state, size, checksum, media type, storage key/version, retention, and scan status belongs in a queryable transactional store when it drives workflows.

Upload workflow

A common flow is: client asks the application for an upload session; application authenticates, checks quota/type, creates a pending metadata row, and returns narrowly scoped temporary upload credentials or a presigned URL; client uploads directly; object storage or client supplies checksum/size; a completion call/event validates the expected object; asynchronous scanning/transcoding runs; metadata transitions to ready; abandoned uploads expire.

The completion operation must be idempotent. Do not trust client-declared MIME type, filename, or checksum alone. Enforce maximum size in policy where possible and verify server-side metadata. Quarantine untrusted uploads; prevent active content from being served under a trusted application origin.

Multipart and resumable transfer

Large objects should be split into parts so uploads can run in parallel, resume after failure, and retry only failed pieces. Track an upload ID, permitted part numbers/sizes, checksums, and completion manifest. Incomplete multipart sessions consume storage and should expire through lifecycle rules.

More parallelism can improve throughput until client uplink, server request rate, or congestion becomes limiting. Small parts create request overhead; very large parts increase retry cost and memory. Bound parallelism, use exponential backoff, and persist resumable state. Completion is a distinct atomic operation that assembles/commits the object version.

Downloads, ranges, and CDN integration

Direct downloads through a CDN/object endpoint keep application servers off the byte path. Authorize via short-lived signed URLs/cookies or an edge authorization mechanism. Use HTTP range requests for media seek and resumable downloads, but account for amplification from many tiny ranges and cache fragmentation. For private objects, ensure cache keys and policies cannot leak one user’s response to another.

Stable versioned object URLs are highly cacheable. Mutating bytes under the same key complicates invalidation and rollback; prefer content-addressed or versioned keys plus a metadata pointer. Configure content type, disposition, and security headers deliberately.

Consistency, versioning, and conditional requests

Object-store consistency is product/operation/region specific; current major services may provide strong read-after-write behavior for many operations, but design against documented guarantees. Listings, replication destinations, notifications, and derived indexes may have distinct timing. Use object version IDs, ETags/checksums, and conditional operations to prevent lost updates where supported.

Versioning protects against accidental overwrite/delete and enables rollback, but increases storage and privacy-deletion complexity. Delete markers may hide rather than erase prior versions. An application should store the exact object version it references when immutability matters.

Integrity, durability, and repair

End-to-end integrity needs checksums at upload, storage, transfer, and download. Multipart checksums/ETags may not equal a simple whole-file hash, so understand provider semantics. Store an application content hash when deduplication or legal evidence needs a stable digest. Periodically audit/scrub long-lived archives and test restores.

Durability is the probability of retaining data; availability is the probability of serving it now. Replication/erasure coding, failure-domain placement, background repair, and versioning contribute to durability, while regional outage, permissions, control planes, and network affect availability. Backups in the same account/policy plane may not protect against operator or credential compromise.

Lifecycle, retention, and archival

Lifecycle policies can transition objects to colder tiers, expire temporary parts, and delete versions. Cold tiers trade storage price for retrieval latency, minimum duration, and request/restore cost. Model access probability and retrieval spikes, not only cents per GiB-month. Keep a catalog so archived objects remain discoverable and their restore state is visible.

Retention locks and legal holds may make versions undeletable for a period. Privacy deletion requires finding every copy: current/prior versions, replicas, derivatives, CDN caches, indexes, and backups according to policy. Separate logical unavailability from physical erasure and document timelines/exceptions.

Events and data-lake patterns

Object-created/deleted notifications are usually an integration trigger, not an exactly-once transaction with your database. Events can duplicate, reorder, or arrive after consumers retry; build idempotency from bucket/key/version and reconcile by listing/inventory. Avoid triggering processors on their own output prefix without loop protection.

For analytics, store immutable partitioned files in open formats, commit them through manifests/table metadata, and compact many small objects. A directory listing is not a safe transaction protocol for a data lake when writers and readers race. Partition by common filters without creating tiny files or high-cardinality directory explosions.

Security and tenant isolation

Deny public access by default, use least-privilege service identities, encrypt in transit and at rest, rotate/manage keys, log data access, and separate administrative control from application credentials. Bucket-level policy is often easier to audit than millions of per-object ACLs. Presigned URLs are bearer capabilities: scope method/key/headers, use short expiry, avoid logging them, and consider one-time application tokens for sensitive downloads.

Validate archive extraction to prevent path traversal and decompression bombs. Scan malware where appropriate, limit media parser resources, and isolate transformation sandboxes. Quotas must cover stored bytes, request rate, egress, and incomplete uploads.

Decision table

DecisionPrefer the first option when…Prefer the second option when…Senior caveat
Object vs database blobObjects are large, immutable, streamed, or independently lifecycle-managed.Values are small and must commit atomically with relational state.A metadata row plus object reference needs a state machine for partial success.
Application proxy vs direct transferFine-grained inline transformation/audit or tiny payloads justify the hop.Large uploads/downloads should avoid application bandwidth and connection cost.Direct transfer needs scoped delegated authorization, completion verification, and abuse limits.
Mutable key vs versioned keyConsumers truly need latest-at-key and conditional update is controlled.Caches, rollback, reproducibility, and immutable references matter.Use a pointer/manifest to publish a new immutable version atomically.
Replication vs erasure codingLow-latency repair/read simplicity or small objects dominate.Large cold data needs lower storage overhead with acceptable reconstruction cost.Provider internals vary; application decisions focus on class/region and RPO/RTO.
Hot vs cold tierFrequent/latency-sensitive reads and unpredictable restores dominate.Access is rare and retrieval delay/cost is acceptable.Include minimum retention and mass-recall scenarios in total cost.
Event trigger vs periodic inventoryLow-latency incremental processing is needed.Completeness and repair of missed events dominate.Strong systems use events for speed and inventory/reconciliation for correctness.

Quantitative reasoning

Failure modes and production signals

Failure modeWhat users seeLikely causeMitigation / design responseUseful signals
Orphan objectStorage cost grows; unpublished data persistsUpload succeeds but metadata completion failsPending state, object tags, expiry lifecycle, reconciliation inventoryPending age, unreferenced bytes, incomplete multipart
Dangling metadataDownload returns not found or wrong versionDB commits before upload/delete or key mismatchState machine, verify head/version, repair/re-upload, delayed hard delete404 by object ID, metadata/object mismatch
Presigned URL leakUnauthorized upload/download during validityBearer URL logged/shared or too broadShort scope/expiry, TLS, no logs, revoke pointer/key, auditUnexpected IP/agent, access logs, token age
Corrupt/truncated objectMedia fails or backup restore is invalidTransfer/storage/parser issue, checksum misuseEnd-to-end checksums, version quarantine, retry/repair, auditChecksum mismatch, short reads, restore tests
Event loss/duplicationProcessor misses or repeats workNotification is at-least-once and asynchronousIdempotent version key, durable queue, periodic inventory reconciliationEvent lag, duplicate rate, inventory discrepancies
Mass egress/cache missLatency and bill spikePopular release, invalidation, CDN bypass, attackCDN shielding, rate limits, prewarm selectively, immutable keysOrigin bytes/QPS, hit ratio, egress, top objects
Lifecycle deletion errorNeeded or regulated data disappearsOverbroad prefix/tag policyVersioning/retention, policy review/simulation, canary, restoreLifecycle actions, deletion volume, restore requests
Cold-tier recall bottleneckUsers wait hours/days for archiveRetrieval capacity/cost underestimatedAsync restore state, priority tiers, pre-stage, quotasRestore queue age, bytes/hour, retrieval errors

Senior-level lenses

Metadata and bytes need a state machine

Cross-system atomicity is unavailable in the usual direct-upload flow. Use states such as pending, uploaded, scanning, ready, failed, deleting, and deleted; make transitions conditional/idempotent; expire orphans; reconcile both directions. The state model is often more important than the bucket API.

Immutable names simplify every downstream system

Content/version-addressed keys make CDN caching, retries, analytics reproducibility, rollback, and audit safer. Publish through a small mutable pointer or database row. Deleting/replacing bytes behind a popular key creates stale-cache and race ambiguity.

Durability claims need fault-domain and control-plane analysis

Provider durability numbers do not cover application deletion, compromised credentials, wrong lifecycle policy, key loss, corrupt transformations, or unreadable backups. Use least privilege, version/retention, separate accounts/regions where needed, and restore drills.

The byte path is a cost path

Calculate ingress, egress, inter-region replication, CDN miss, transformation, request count, and cold retrieval. An architecture can be technically scalable and financially unstable. Abuse and hotlinking controls belong in the design.

Events accelerate; reconciliation proves

Notifications deliver low latency, while periodic inventory/checksum comparison proves completeness. This dual pattern generalizes to caches, search indexes, CDC, and queues. Store object version and processing version so replays are safe.

Deletion is a distributed workflow

Removing a user object may involve active version, prior versions, replicas, derivatives, thumbnails, CDN, search, analytics, and backups. Define tombstone/deny behavior immediately, physical erasure timeline, legal holds, and evidence of completion.

Interview question ladder

Q19.1 foundation

How is object storage different from a filesystem?

Show strong-answer signals

API-addressed whole objects and metadata, typically flat key namespace and no general in-place random writes/rename semantics; built for massive scale/durability.

Q19.2 foundation

Why use multipart upload?

Show strong-answer signals

Parallelism, resumability, and retrying only failed parts; completion atomically publishes the assembled object.

Q19.3 foundation

What is a presigned URL?

Show strong-answer signals

A time-limited bearer authorization for a scoped object operation; it must be narrow, protected, and verified by application workflow.

Q19.4 intermediate

Design direct image upload.

Show strong-answer signals

Pending metadata, scoped URL, size/type policy, direct transfer, checksum/head verify, scan/transform, ready state, orphan cleanup and idempotency.

Q19.5 intermediate

How do you update an object safely?

Show strong-answer signals

Prefer new immutable version/key plus conditional pointer update; use ETag/version precondition if mutating at key; handle retries and cache invalidation.

Q19.6 intermediate

How do object notifications affect correctness?

Show strong-answer signals

Treat as at-least-once/out-of-order trigger; dedupe on key+version, persist progress, and reconcile with inventory.

Q19.7 senior

Design a Dropbox-like object layer.

Show strong-answer signals

Chunk/multipart upload, content IDs, metadata tree, versions, dedupe scope/security, sync cursors, range/download CDN, sharing auth, conflicts, lifecycle and recovery.

Q19.8 senior

Design privacy deletion across object derivatives.

Show strong-answer signals

Authoritative deletion request/state, immediate access denial, enumerate versions/replicas/derivatives/caches/indexes, idempotent workers, legal holds, evidence and backup policy.

Q19.9 senior

A viral object melts origin despite a CDN. Diagnose.

Show strong-answer signals

Cache key/headers/auth, range behavior, invalidation, origin shield, signed URL variance, cold miss stampede, egress/connection limits, attack patterns.

Q19.10 senior

Build a data-lake ingestion commit protocol.

Show strong-answer signals

Immutable files, partitioning and file size, staging, checksums, manifest/table metadata atomic commit, idempotent job/event, schema evolution, compaction and vacuum.

Q19.11 staff / stretch

Define a company object-storage platform.

Show strong-answer signals

Tenancy, namespaces, direct-transfer API, policy guardrails, malware pipeline, encryption/KMS, lifecycle classes, cost/quotas, events/inventory, deletion, DR and SLOs.

Q19.12 staff / stretch

Migrate exabytes between providers/regions.

Show strong-answer signals

Inventory and checksums, dual-read/write or log, parallel copy, bandwidth/cost, immutable versions, validation, routing cutover, delta catch-up, rollback, deletion and compliance.

Design drills

Drill 1 Video upload and streaming

Design upload, transcode, publish, global playback, deletion, and creator analytics for large videos.

What the interviewer is testing

Stateful metadata workflow, multipart bytes, CDN/ranges, derived objects, and events.

Drill 2 Backup repository

Store encrypted database backups with point-in-time logs, immutability, cross-account/region recovery, retention, and regular restore tests.

What the interviewer is testing

Durability beyond replication and measurable recovery objectives.

Drill 3 Data lake

Ingest one million small files/hour and make them query-efficient. Cover compaction, manifests, schema, late data, retries, and lifecycle.

What the interviewer is testing

Small-object economics and transactional table metadata.

Common weak answers and how to improve them

“Store files in S3.”

Show the stronger answer

Design metadata, auth, direct transfer, integrity, states, lifecycle, events, and recovery—not only the product name.

“The bucket key is the permission.”

Show the stronger answer

Keys are identifiers, not authorization; use policy and short-lived scoped access.

“Object storage is infinitely scalable.”

Show the stronger answer

Request rate, hot objects, bandwidth, namespace operations, quotas, cost, and dependent metadata systems still bound the design.

“Notifications tell us every object exists.”

Show the stronger answer

Use idempotent events for speed plus inventory reconciliation for completeness.

“Versioning is backup.”

Show the stronger answer

It helps accidental overwrite/delete but may share credentials/policy failure; test independent restore and retention.

Primary sources and standards