Diagrammatic

URL Shortener (like bit.ly) — System Design Interview Practice

Design a URL shortening service that can handle millions of URLs and redirect requests efficiently. Work through the requirements, architecture trade-offs, and an interactive design review.

Concepts and architecture decisions to consider

  • web servicesConcept to explore
  • scalabilityConcept to explore
  • cachingConcept to explore
  • databasesConcept to explore
  • load balancingConcept to explore

Interview prompt

Design Design a URL shortening service that can handle millions of URLs and redirect requests efficiently. so users can Shorten long URLs to short URLs reliably at scale.

  • Define the source of truth for Shorten long URLs to short URLs; Redirect short URLs to original URLs and make retries idempotent.
  • Use bounded, partitioned state to meet 99.9% availability and Short URLs should be as short as possible.
  • Separate the critical request path from Consider using base62 encoding for short URLs, Think about database partitioning strategies, Cache frequently accessed URLs.
  • Explain consistency, failure recovery, authorization, observability, and a degraded mode.

Requirements and scale assumptions

  • Support the core workflow to Shorten long URLs to short URLs.
  • Expose status, results, and freshness appropriate to Design a URL shortening service that can handle millions of URLs and redirect requests efficiently..
  • Support authorization, validation, updates, deletion, and recovery semantics.
  • Meet Short URLs should be as short as possible under normal load.
  • Scale to 99.9% availability without a single hot key or unbounded synchronous work.
  • Do not lose committed state; make retries and duplicate events safe.
  • Degrade safely when downstream workers, caches, or external dependencies fail.
  • 99.9% availability
  • Partition by the primary tenant, user, item, or geographic key and isolate hot partitions.
  • Keep serving state bounded; retain raw events or durable records for replay and auditing.
  • Peak scale: 99.9% availability — Capacity assumption that drives partitioning and backpressure.
  • Latency target: Short URLs should be as short as possible — User-facing budget for the primary request or read path.
  • Durable boundary: Committed before async — The source of truth is Shorten long URLs to short URLs; Redirect short URLs to original URLs.
  • Async boundary: At-least-once workers — Keep Consider using base62 encoding for short URLs, Think about database partitioning strategies, Cache frequently accessed URLs off the synchronous path.

Key entities

  • InteractioninteractionId, actorId, objectId, type, version, occurredAt

    Canonical url shortener interaction with an idempotency key and ordering version.

  • ConnectionSessionsessionId, userId, deviceId, roomKey, lastHeartbeat, status

    Ephemeral but observable url shortener connection registration used for routing and presence.

  • FanoutCursorstreamKey, shard, offset, consumerGroup, updatedAt

    Durable progress marker for url shortener fan-out and replay.

  • DeliveryReceiptinteractionId, recipientId, channel, attempt, status, deliveredAt

    Deduplicated url shortener delivery state for reconnects, retries, or acknowledgements.

Data flow

  1. 1. Accept and commit the interactionThe url shortener gateway authenticates the actor, validates room or object membership, applies rate limits, and conditionally commits the interaction.
  2. 2. Publish an ordered eventAn outbox emits the committed url shortener transition with an event ID, partition key, sequence, and replay retention.
  3. 3. Fan out by partitionConsumers route url shortener events to connected recipients, durable inboxes, or notification channels without making the origin write wait for every recipient.
  4. 4. Resume and reconcile connectionsClients reconnect with a cursor; the url shortener service replays missed events, deduplicates delivery, and exposes stale or degraded state.
  5. 5. Measure latency and recoverOperations tracks url shortener publish-to-deliver latency, hot partitions, reconnect storms, dropped events, and consumer lag for replay or repair.

Deep dives and trade-offs

  • Ordering, idempotency, and hot keysChoose a url shortener partition key that preserves required order while distributing high-volume rooms, users, or objects. Use event IDs, inboxes, consumer offsets, and conditional state transitions for at-least-once delivery. Split or isolate hot partitions without changing the client-visible sequence contract.
  • Reconnect and replay semanticsIssue resumable url shortener cursors with an expiry and a clear snapshot-plus-delta fallback. Bound replay windows and rebuild from durable state when a cursor is too old. Expose version and freshness so a client can distinguish current, catching up, and degraded state.
  • Backpressure and presenceKeep connection heartbeats and ephemeral presence separate from durable url shortener interactions. Coalesce safe updates, shed low-value work, and protect critical events during reconnect storms. Measure end-to-end delivery, not only broker publish latency.
  • Direct fan-out versus pull-based readsUse push for latency-sensitive url shortener deltas and pull or replay for reconnect, history, and recovery. A push-only design loses state when clients disconnect and a pull-only design wastes latency and bandwidth.
  • Per-recipient queues versus shared streamsUse shared partitioned streams with per-recipient cursors where fan-out is large, and isolate exceptional high-fanout objects. A queue per recipient becomes expensive and hard to inspect at large scale.
  • Strong ordering versus availabilityGuarantee ordering only within the scope the product needs, such as a room, object, or conversation. Global ordering introduces a bottleneck and still does not solve duplicate delivery or reconnect recovery.
Diagrammatic — system design practice and architecture review.