← Atlassian Interview Insights

Atlassian·Software Engineer·Onsite - System Design / Architecture·Senior

SeniorPrefer not to say
May 2026

Summary

Atlassian system design round for a software engineer role, focused entirely on building an image crawler from scratch. Pretty open-ended, which sounds fun until you realize they want you to cover everything from queue design to failure handling to DB schema in one session.

Questions Asked (5)

Q1

Design a web crawler that starts from a set of root URLs, discovers links, and downloads images, supporting unlimited scale and crawl depth.

System DesignTechnical Trade-offs
Author's notes

This is the kind of question that feels straightforward for about 90 seconds.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scale (e.g., number of URLs, images, depth, politeness). Then design a distributed, fault-tolerant architecture with a URL frontier, fetcher, parser, and storage, addressing key challenges like deduplication, rate limiting, and prioritization. Finally, discuss trade-offs and optimizations for unlimited scale and depth.

Pro tip: Emphasize politeness and legal considerations (robots.txt, rate limiting) early, as this shows production awareness and often impresses interviewers at companies like Atlassian.

1. Clarify Requirements and Scope

Ask questions to understand scale (e.g., number of pages, images, depth), politeness constraints, freshness, and storage needs. Define functional and non-functional requirements.

2. High-Level Architecture

Outline components: URL frontier (priority queue), fetcher (distributed workers), parser (extract links and images), deduplication (Bloom filter or hash), storage (blob store for images, metadata DB), and scheduler.

3. Deep Dive into Key Components

Detail the URL frontier (prioritization, politeness), deduplication (exact and near-duplicate), distributed fetching (load balancing, fault tolerance), and image storage (CDN, compression).

4. Address Scalability and Depth

Explain how to handle unlimited scale (horizontal scaling, sharding, async I/O) and depth (BFS with depth tracking, avoiding infinite loops). Discuss back-pressure and monitoring.

5. Discuss Trade-offs and Optimizations

Cover trade-offs: consistency vs. availability, push vs. pull, batch vs. stream processing. Mention optimizations like caching, compression, and using existing frameworks (e.g., Scrapy, Heritrix).

Key Points to Mention

  • Politeness: robots.txt, crawl-delay, rate limiting per domain
  • Deduplication: URL normalization, Bloom filters, checksums for content
  • Distributed architecture: sharding, consistent hashing, fault tolerance
  • Storage: efficient image storage (blob store, CDN), metadata indexing
  • Scalability: horizontal scaling, async I/O, back-pressure, monitoring
  • Depth management: BFS with depth limits, cycle detection, prioritization

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How would you handle deduplication to avoid re-crawling the same URLs?

System DesignAlgorithms & Data Structures
Author's notes

Went with a bloom filter for fast in-memory checks plus a backing store for confirmed visited URLs.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scale and requirements (e.g., number of URLs, freshness needs), then propose a layered deduplication strategy using a combination of in-memory sets, Bloom filters, and persistent storage. Discuss trade-offs between accuracy, memory usage, and performance, and mention how you would handle updates and distributed crawling.

Pro tip: Mention that deduplication should happen at multiple stages: before fetching (URL normalization and Bloom filter), during fetching (checking a distributed cache), and after fetching (content hashing to avoid duplicate content). This shows a holistic approach and awareness of real-world complexities.

1. Clarify requirements and constraints

Ask about scale (number of URLs, crawl rate), freshness (how often to re-crawl), and whether exact or approximate deduplication is acceptable. This sets the context for your solution.

2. Normalize URLs

Explain that URLs must be canonicalized (e.g., lowercasing scheme/host, removing fragments, sorting query parameters) to treat equivalent URLs as the same.

3. Use a multi-tiered storage approach

Propose an in-memory set for recently seen URLs, a Bloom filter for probabilistic membership, and a persistent database (e.g., Redis, Cassandra) for exact storage. Discuss trade-offs between memory and accuracy.

4. Handle distributed crawling and concurrency

Describe how to shard the URL space across crawlers (e.g., consistent hashing) and use atomic operations to avoid race conditions when checking/adding URLs.

5. Consider content-based deduplication

Mention that even with URL deduplication, different URLs may serve identical content; use content hashing (e.g., SimHash) to detect and skip duplicates.

Key Points to Mention

  • URL normalization techniques (RFC 3986, removing session IDs, etc.)
  • Bloom filters and their false positive trade-offs
  • Distributed storage solutions (Redis, Cassandra, etc.) for scalability
  • Consistent hashing for sharding URLs across crawlers
  • Content hashing (e.g., MD5, SimHash) for near-duplicate detection
  • Handling updates: TTLs, re-crawl scheduling, and freshness policies

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

Walk through your queue and scheduler design, including how you'd enforce per-host rate limiting (politeness).

System DesignTechnical Trade-offs
Author's notes

Per-host rate limiting is one of those things I knew conceptually but hadn't thought through the mechanics of.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scale, then present a high-level architecture of the queue and scheduler, emphasizing decoupling and fault tolerance. Dive into per-host rate limiting using a token bucket or leaky bucket algorithm, and discuss trade-offs like distributed coordination and backpressure. Conclude with how you'd monitor and adapt the system.

Pro tip: Show awareness of real-world constraints by mentioning how you'd handle rate limit state in a distributed system (e.g., using Redis with atomic operations) and the importance of graceful degradation when hosts are unresponsive.

1. Clarify Requirements and Scale

Ask about expected throughput, number of hosts, latency requirements, and whether the system is distributed. This ensures your design meets actual needs.

2. High-Level Architecture

Describe the queue (e.g., Kafka, RabbitMQ, or custom) and scheduler components, explaining how tasks are enqueued, prioritized, and dispatched to workers.

3. Per-Host Rate Limiting Mechanism

Explain the algorithm (e.g., token bucket) and how you'd track state per host, including distributed coordination if needed.

4. Trade-offs and Failure Handling

Discuss trade-offs between accuracy and performance, and how to handle failures like host downtime or rate limit state loss.

5. Monitoring and Adaptation

Mention metrics to track (e.g., queue depth, rate limit hits) and how the system could adapt dynamically to changing conditions.

Key Points to Mention

  • Token bucket or leaky bucket algorithm for rate limiting
  • Distributed rate limiting using Redis or similar with atomic operations
  • Queue implementation choices (e.g., Kafka, RabbitMQ) and their trade-offs
  • Backpressure and graceful degradation strategies
  • Idempotency and retry mechanisms for failed tasks
  • Monitoring and alerting for queue depth and rate limit violations

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

What would your database schema look like for storing crawl state and downloaded image metadata?

Data ModelingSystem Design
Author's notes

Talked through two main tables: one for URL frontier/crawl state (URL, status, last crawled, retry count, source URL) and one for image records (image URL, content hash, storage path, discovered from, timestamp).

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements: what kind of crawler, scale, and access patterns. Then propose a normalized schema with separate tables for crawl state (e.g., URLs, status, timestamps) and image metadata (e.g., URL, dimensions, format, storage location), and discuss indexing and partitioning for performance.

Pro tip: Mention that crawl state often requires frequent updates and may benefit from a NoSQL store or a write-optimized relational design, while image metadata is more read-heavy and can be denormalized for query speed. Also, consider using a job queue or state machine for crawl state to handle retries and failures.

1. Clarify Requirements

Ask about scale (number of URLs, images), access patterns (e.g., query by domain, status, image type), and consistency needs. This shows you don't jump to solutions.

2. Design Crawl State Table

Propose a table with columns like url, status (queued, fetching, done, failed), last_crawled_at, next_crawl_at, retry_count, and error_message. Discuss indexing on status and next_crawl_at for efficient scheduling.

3. Design Image Metadata Table

Propose a table with columns like image_url, page_url, format, width, height, size_bytes, storage_path, and hash. Consider indexing on page_url and hash for deduplication.

4. Address Relationships and Scalability

Explain how the tables relate (e.g., foreign key from image to crawl state) and discuss partitioning (e.g., by domain or date) and potential use of NoSQL for crawl state if write-heavy.

5. Discuss Trade-offs and Alternatives

Mention trade-offs between SQL and NoSQL, normalization vs. denormalization, and how you might evolve the schema as scale grows.

Key Points to Mention

  • Use of a state machine for crawl status (e.g., queued, fetching, done, failed) to handle retries and failures.
  • Indexing strategy: composite indexes on (status, next_crawl_at) for efficient job picking, and on image hash for deduplication.
  • Partitioning or sharding by domain or crawl date to manage large datasets.
  • Consideration of storage for actual images (e.g., S3) with metadata in the database.
  • Handling of URL uniqueness and normalization to avoid duplicate crawls.
  • Potential use of a separate table for crawl errors or logs for debugging.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

How would you design the failure and retry model, and what would you monitor?

System DesignRoot Cause Analysis
Author's notes

Said I'd use exponential backoff with a max retry cap, and move URLs to a dead-letter queue after hitting the limit.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the system's requirements and failure modes, then propose a layered retry strategy with backoff and jitter, and finally outline monitoring metrics and alerts. Emphasize idempotency and graceful degradation to show you understand distributed systems trade-offs.

Pro tip: Tie your answer to Atlassian's scale and reliability needs by mentioning how you'd use tools like exponential backoff with jitter to avoid thundering herds, and how you'd monitor retry rates and error budgets to balance resilience with user experience.

1. Clarify requirements and failure modes

Ask about the system's criticality, expected load, and types of failures (transient vs. permanent). Identify which operations are idempotent and which are not.

2. Design the retry strategy

Propose a retry policy with exponential backoff and jitter, limited retries, and circuit breakers. Discuss when to retry (e.g., only on transient errors) and how to handle non-idempotent operations.

3. Define monitoring and alerting

List key metrics: retry count, success/failure rates, latency, error types, and circuit breaker state. Explain how to set thresholds and alerts based on SLOs.

4. Address root cause analysis and feedback loops

Describe how you'd use logs, traces, and dashboards to diagnose recurring failures. Mention the importance of post-mortems and iterating on the retry policy.

Key Points to Mention

  • Idempotency and how to ensure it (e.g., idempotency keys, deduplication)
  • Exponential backoff with jitter to prevent thundering herd
  • Circuit breaker pattern to avoid cascading failures
  • Monitoring metrics: retry rate, error rate, latency, and saturation
  • Alerting based on SLOs and error budgets
  • Distinguishing between transient and permanent failures

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.