← Atlassian Interview Insights

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

SeniorPrefer not to say
Jun 2026

Summary

System design round at Atlassian where the prompt was a direct continuation of a prior coding round, so they expected me to already have context on the rate limiter I'd built. Felt like a deep dive more than a fresh problem, which was both helpful and a little disorienting.

Questions Asked (4)

Q1

Should a rate limiter be deployed as a library embedded in the API Gateway, or as a separate standalone service? What are the tradeoffs?

System DesignTechnical Trade-offs
Author's notes

I started with the library approach because it felt simpler and lower latency, no network hop.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and constraints (scale, latency, consistency, operational overhead) before comparing the two options. Then systematically evaluate tradeoffs across dimensions like performance, scalability, fault tolerance, and maintainability, and conclude with a recommendation that fits the context.

Pro tip: Mention that the choice often depends on the specific use case—e.g., a library is simpler for single-service rate limiting, while a standalone service is better for distributed, multi-service environments. Also, highlight that a hybrid approach (e.g., a library backed by a centralized data store) can balance tradeoffs.

1. Clarify Requirements and Constraints

Ask about scale (requests per second, number of services), latency requirements, consistency needs, and operational constraints (team size, existing infrastructure).

2. Define Evaluation Criteria

List dimensions for comparison: performance, scalability, fault tolerance, consistency, ease of deployment, maintenance, and cost.

3. Analyze Library Approach

Discuss pros (low latency, no network hop, simple for single service) and cons (limited to per-instance limits, harder to coordinate across instances, redeployment for updates).

4. Analyze Standalone Service Approach

Discuss pros (centralized control, consistent global limits, independent scaling, easier updates) and cons (network latency, single point of failure, added operational complexity).

5. Recommend and Justify

Based on the criteria, recommend one approach or a hybrid, and explain why it best fits the given context, acknowledging tradeoffs.

Key Points to Mention

  • Latency: Library avoids network overhead; standalone service adds a hop but can be optimized with caching.
  • Scalability: Standalone service can scale independently and handle distributed rate limiting; library may require sticky sessions or shared state.
  • Consistency: Standalone service provides global consistency; library may only enforce per-instance limits unless backed by a shared store.
  • Fault tolerance: Library failure affects only the host; standalone service failure can impact all services, requiring high availability.
  • Operational overhead: Library is simpler to deploy but harder to update; standalone service requires monitoring, deployment, and maintenance.
  • Hybrid approach: Use a library with a centralized data store (e.g., Redis) to get low latency and global consistency.

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

Q2

When multiple API Gateways or services share rate limiting state, how do you handle consistency? What are the failure modes?

System DesignTechnical Trade-offs
Author's notes

This is where I got a bit tangled.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements: what consistency level is needed (strict vs eventual), what's the acceptable latency overhead, and what's the scale. Then discuss trade-offs between centralized (e.g., Redis) and distributed (e.g., gossip) approaches, and enumerate failure modes like network partitions, stale reads, and race conditions.

Pro tip: Emphasize that rate limiting is often a best-effort mechanism; strict consistency may not be worth the latency cost. Mention that you'd use a hybrid approach: local token buckets with periodic sync to a central store, and fallback to local limits during outages.

1. Clarify requirements and constraints

Ask about consistency needs (strict vs eventual), latency budget, scale (requests per second, number of gateways), and tolerance for over-limiting or under-limiting.

2. Choose a consistency model

Decide between strong consistency (e.g., centralized Redis with atomic operations) and eventual consistency (e.g., gossip protocol or local buckets with periodic sync). Discuss trade-offs.

3. Design the shared state mechanism

Describe how state is stored and accessed: e.g., Redis with Lua scripts for atomicity, or a distributed cache with CRDTs. Consider sharding by client ID to reduce contention.

4. Identify failure modes and mitigations

Enumerate failures: network partitions, Redis downtime, clock skew, race conditions, and hot keys. For each, propose mitigations like fallback to local limits, circuit breakers, and idempotent operations.

5. Summarize trade-offs and recommendation

Conclude with a recommended approach based on the clarified requirements, highlighting the balance between accuracy and availability.

Key Points to Mention

  • CAP theorem trade-offs: consistency vs availability in distributed rate limiting
  • Use of atomic operations (e.g., Redis INCR with expiry) to avoid race conditions
  • Eventual consistency via gossip or local token buckets with periodic reconciliation
  • Failure modes: network partitions, central store outage, clock skew, and thundering herd
  • Fallback strategies: local rate limiting, circuit breakers, and graceful degradation
  • Sharding by client ID to distribute load and reduce contention

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

Q3

What backing store would you choose for the rate limiter, SQL vs DynamoDB vs Redis, and how do you handle concurrent updates safely?

System DesignData ModelingTechnical Trade-offs
Author's notes

Redis felt obvious to me and I said so immediately, which maybe came across as dismissive.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the rate limiting requirements (e.g., scale, latency, consistency) and then compare SQL, DynamoDB, and Redis against those needs. Recommend Redis as the primary choice for its speed and atomic operations, but discuss trade-offs and how to handle concurrency safely using atomic commands or Lua scripts.

Pro tip: Mention that you'd use Redis with a Lua script to ensure atomicity, and discuss how to handle Redis failures gracefully with a fallback to a local in-memory limiter to avoid cascading failures.

1. Clarify Requirements

Ask about expected throughput, latency requirements, consistency needs, and whether the rate limiter is distributed. This shows you don't jump to solutions without understanding the problem.

2. Evaluate Backing Stores

Compare SQL, DynamoDB, and Redis on latency, scalability, atomicity support, and operational complexity. Highlight that Redis is optimized for high-throughput, low-latency operations, while SQL and DynamoDB offer stronger durability but may introduce higher latency.

3. Recommend a Store

Choose Redis as the primary backing store for its performance and atomic primitives (e.g., INCR, EXPIRE, Lua scripting). Acknowledge that DynamoDB can work with conditional writes but may have higher latency, and SQL is generally too slow for high-scale rate limiting.

4. Address Concurrency

Explain how to handle concurrent updates safely: use Redis atomic operations (INCR, DECR), Lua scripts for complex logic, or optimistic locking with WATCH/MULTI/EXEC. For DynamoDB, mention conditional writes and atomic counters.

5. Discuss Trade-offs and Failure Modes

Talk about trade-offs: Redis is fast but can lose data on failure; DynamoDB is durable but slower; SQL is familiar but not scalable. Mention fallback strategies (e.g., local rate limiting) and monitoring.

Key Points to Mention

  • Redis atomic operations (INCR, EXPIRE) and Lua scripting for atomicity
  • DynamoDB conditional writes and atomic counters for concurrency
  • SQL transactions and row-level locking, but scalability concerns
  • Latency vs durability trade-offs between the stores
  • Handling Redis failures with fallback to local rate limiting
  • Using sliding window or token bucket algorithms with the chosen store

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

Q4

How would you scale this rate limiter to handle Atlassian-scale traffic? Think about sharding, autoscaling, and caching layers.

System DesignTechnical Trade-offsAPI & Integrations
Author's notes

Sharding by user ID or tenant ID felt natural, I sketched consistent hashing to avoid hot spots.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scale and requirements, then propose a distributed architecture using consistent hashing for sharding, autoscaling groups for elasticity, and a multi-tier caching strategy. Emphasize trade-offs between accuracy, latency, and cost, and how you would monitor and adjust the system.

Pro tip: Mention that you would use a sliding window or token bucket algorithm with local caching and periodic sync to reduce latency, and that you'd shard by a composite key (e.g., user ID + API endpoint) to avoid hotspots.

1. Clarify Requirements and Constraints

Ask about expected QPS, latency SLAs, consistency requirements, and existing infrastructure to tailor the solution.

2. Design Sharding Strategy

Propose sharding the rate limiter state across multiple nodes using consistent hashing, with a composite key to distribute load evenly and avoid hotspots.

3. Implement Autoscaling

Use autoscaling groups based on metrics like CPU, request rate, or queue depth to dynamically adjust capacity, ensuring cost-efficiency and handling spikes.

4. Leverage Caching Layers

Introduce local in-memory caches (e.g., using a token bucket) with periodic synchronization to a distributed store (e.g., Redis) to reduce latency and backend load.

5. Address Trade-offs and Monitoring

Discuss trade-offs between accuracy and performance, and outline monitoring (e.g., Prometheus) and alerting to detect and mitigate issues.

Key Points to Mention

  • Consistent hashing for sharding to minimize rebalancing when scaling
  • Autoscaling based on custom metrics (e.g., request rate) and using Kubernetes HPA
  • Multi-tier caching: local cache with TTL and distributed cache like Redis
  • Sliding window or token bucket algorithms for rate limiting
  • Trade-offs: eventual consistency vs. strict accuracy, latency vs. cost
  • Monitoring and observability: metrics, logging, and tracing for rate limiter performance

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