Design an image crawler for unlimited URLs

Read the full interview experience this question came from →

Quick Overview

This question evaluates a candidate's ability to design scalable, fault-tolerant distributed systems for web crawling, covering competencies in concurrency, queueing and scheduling, deduplication, storage architecture, and observability.

Design an image crawler for unlimited URLs

Company: Atlassian

Role: Software Engineer

Category: System Design

Difficulty: medium

Interview Round: Onsite

Design a service that crawls images starting from a set of root URLs. Requirements: - Input: one or more root URLs. - Crawl pages, discover links, and download image resources. - Support **unlimited number of root URLs** and **unlimited crawl depth**. - Must handle failures (network errors, timeouts, crashes) and avoid re-crawling the same URL excessively. - Discuss storage for downloaded images and metadata. Deliverables: - High-level architecture (components, data flow). - Queue/scheduler design and politeness (per-host rate limiting). - Deduplication strategy. - DB schema for crawl state and results. - Failure/retry model and monitoring.

Overview: This question evaluates a candidate's ability to design scalable, fault-tolerant distributed systems for web crawling, covering competencies in concurrency, queueing and scheduling, deduplication, storage architecture, and observability.

Read the full Atlassian Software Engineer interview experience this question came from

Community answers

Answer by freny07pethelis1996

title: Image crawler overview: "Crawl from any number of root URLs, at any depth. Durable frontier, per-host politeness, one copy of each image." status: draft review: reliability: status: pending security: status: pending architecture: status: pending product: status: pending Image crawler What is already decided Thesis. A URL is a row in a durable frontier. Fetchers lease rows. They do not keep the queue in memory. Image bytes are stored once, under the hash of the bytes. Politeness is the next time a host may be fetched, not a sleep buried in a worker. | Topic | Decision | | --- | --- | | How big is a crawl? | No cap on seed count. No cap on depth. The fetch rate per host is capped | | What is stored? | Image bytes in S3. Crawl state and image metadata in Aurora Postgres. HTML is parsed and dropped | | Same URL again? | One row per canonical URL. The same handler skips a refetch for 7 days when its artifact is already stored | | Same bytes, two URLs? | One object. Both URL rows point at that hash | | Politeness | Per host. Default 1 request per second, 2 in flight. robots.txt can raise the delay | | Crash | A lease expires. The row returns to the frontier. Five failures and the URL is dead | | Where is the queue? | The queued row in urls. The lease is the dequeue. §4 | | What is the scheduler? | 64 ECS tasks, one per hash(host_id) partition. Each task leases, then a fetch worker in that same task opens the socket. §2 | | How we see it, and what we do | §7. Metrics say the
Atlassian logo
Atlassian
Jan 5, 2026
mediumSoftware EngineerOnsiteSystem Design
23
0

Design a service that crawls images starting from a set of root URLs.

Requirements:

  • Input: one or more root URLs.
  • Crawl pages, discover links, and download image resources.
  • Support unlimited number of root URLs and unlimited crawl depth .
  • Must handle failures (network errors, timeouts, crashes) and avoid re-crawling the same URL excessively.
  • Discuss storage for downloaded images and metadata.

Deliverables:

  • High-level architecture (components, data flow).
  • Queue/scheduler design and politeness (per-host rate limiting).
  • Deduplication strategy.
  • DB schema for crawl state and results.
  • Failure/retry model and monitoring.