← Axon Interview Insights

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

SeniorPrefer not to say
May 2026

Summary

System design round at Axon for a software engineer role. The main problem was designing a distributed log collection system for client devices, and it got into some pretty specific territory around offline buffering and traffic spikes.

Questions Asked (3)

Q1

Design a logging system that collects logs from many client devices, uploads them to a backend, and makes them searchable in a web UI within 3 to 5 minutes of being generated (assuming the device is online).

System DesignTechnical Trade-offsAPI & Integrations
Author's notes

This felt manageable at first but the 3 to 5 minute freshness requirement forced me to actually think about the pipeline end to end.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scale, then propose a high-level architecture that covers log collection, transport, ingestion, storage, and search. Focus on meeting the 3-5 minute freshness SLA by optimizing each stage for low latency and discussing trade-offs between consistency, cost, and complexity.

Pro tip: Emphasize the importance of backpressure and offline buffering on client devices to handle network issues gracefully, and propose a tiered storage strategy to balance cost and query performance for recent vs. older logs.

1. Clarify Requirements and Scale

Ask questions to understand the number of devices, log volume, retention period, query patterns, and any compliance requirements. This will inform technology choices and architecture decisions.

2. Design Log Collection and Transport

Propose a lightweight client-side agent that batches logs and uploads them asynchronously over HTTPS to a scalable ingestion endpoint. Include mechanisms for offline buffering, retries, and compression.

3. Design Ingestion and Processing Pipeline

Use a distributed message queue (e.g., Kafka) to decouple producers and consumers, enabling fault tolerance and backpressure. Process logs in real-time with a stream processor (e.g., Flink) for parsing, enrichment, and indexing.

4. Design Storage and Search

Store logs in a search-optimized datastore like Elasticsearch for fast full-text search and analytics. Consider a tiered approach: hot storage for recent logs (e.g., last 7 days) and cold storage (e.g., S3) for older logs, with the ability to query across both.

5. Design Web UI and Query API

Provide a RESTful API that translates UI queries into searches against the datastore. Ensure the UI supports filtering, sorting, and pagination, and displays results within the 3-5 minute SLA by querying the hot storage.

Key Points to Mention

  • End-to-end latency budget: break down the 3-5 minute SLA across collection, transport, ingestion, indexing, and query to identify bottlenecks.
  • Scalability and fault tolerance: use partitioning, replication, and auto-scaling for each component to handle varying load and failures.
  • Data retention and tiered storage: move older logs to cheaper storage while maintaining queryability, possibly using a federated search layer.
  • Security and privacy: encrypt logs in transit and at rest, implement authentication/authorization, and consider data anonymization for sensitive information.
  • Monitoring and alerting: track ingestion rates, latency, error rates, and storage usage to ensure the system meets SLAs and to detect issues early.
  • Trade-offs: discuss consistency vs. availability, cost vs. performance, and complexity vs. maintainability in your design choices.

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

Q2

How would your design handle devices that are offline for extended periods, and what happens to logs when they reconnect? Think about buffering, reliability, deduplication, and ordering.

System DesignTechnical Trade-offsData Modeling
Author's notes

This is where I felt most comfortable.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing the problem as a distributed data synchronization challenge with offline-first clients. Then walk through the lifecycle: local buffering during offline periods, reliable upload with acknowledgments and retries on reconnect, and server-side deduplication and ordering using sequence numbers and idempotent writes. Conclude by discussing trade-offs between consistency, latency, and storage overhead.

Pro tip: Emphasize that deduplication and ordering must be handled server-side because clients cannot be trusted to maintain global state; use a unique device-generated event ID and a monotonic sequence number per device to achieve both.

1. Clarify requirements and constraints

Ask about expected offline duration, log volume, device capabilities, and whether logs are time-series or event-based. This scopes the design and shows you think before coding.

2. Design local buffering on the device

Propose a durable local store (e.g., SQLite, RocksDB) with a bounded queue and eviction policy. Logs are appended with metadata: device ID, local sequence number, timestamp, and a globally unique event ID.

3. Define the reconnection and upload protocol

On reconnect, the device sends batches with sequence numbers and waits for server acknowledgments. Use exponential backoff with jitter for retries, and support resumable uploads to handle partial failures.

4. Ensure server-side deduplication and ordering

The server uses the unique event ID to deduplicate (e.g., via a bloom filter or key-value store) and orders events per device using the sequence number. Handle gaps by requesting missing ranges or accepting out-of-order with a reordering buffer.

5. Discuss trade-offs and failure modes

Address trade-offs: storage vs. reliability, strict ordering vs. availability, and deduplication cost. Mention handling clock skew, sequence number overflow, and server-side idempotency.

Key Points to Mention

  • Use a durable local buffer with a bounded queue and eviction policy to prevent device storage exhaustion.
  • Assign each log entry a globally unique ID (e.g., UUID) and a per-device monotonic sequence number for deduplication and ordering.
  • Implement at-least-once delivery with server acknowledgments and exponential backoff retries; consider idempotent server writes.
  • Server-side deduplication using the unique ID, and ordering via sequence numbers with gap detection and reordering buffers.
  • Handle clock skew by relying on sequence numbers rather than timestamps for ordering, and use server-side timestamps for global ordering if needed.
  • Discuss trade-offs: consistency vs. availability, storage overhead vs. reliability, and the cost of deduplication at scale.

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

Q3

If a large number of devices all come online and start uploading at the same time, how does your system handle that surge? Consider throttling, autoscaling, load shedding, and prioritization.

System DesignTechnical Trade-offsAdaptability & Ambiguity
Author's notes

Honestly the follow-up I was least prepared for.

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 devices, data volume, latency tolerance) to show you don't jump to solutions. Then walk through a layered defense: ingestion buffering, autoscaling, throttling, load shedding, and prioritization, explaining trade-offs at each layer. Conclude with how you'd monitor and iterate based on real traffic patterns.

Pro tip: Emphasize that load shedding and prioritization are business decisions as much as technical ones—tie them to user impact and SLAs. Mention that you'd validate the design with load testing and chaos experiments before an event like this.

1. Clarify requirements and constraints

Ask about the expected surge size, data criticality, latency requirements, and cost constraints. This shows you avoid over-engineering and tailor the solution.

2. Design for elasticity and buffering

Describe autoscaling of ingestion services and using a durable queue (e.g., Kafka) to absorb bursts. Explain how this decouples producers from consumers and prevents data loss.

3. Implement throttling and rate limiting

Discuss per-device and global rate limits to smooth traffic. Mention token bucket or leaky bucket algorithms and how to communicate limits to devices (e.g., backoff).

4. Apply load shedding and prioritization

Explain how to drop or defer low-priority traffic when capacity is exceeded, and prioritize critical data (e.g., alarms) over routine telemetry. Tie this to business rules.

5. Monitor, test, and iterate

Describe observability (metrics, logs, tracing) and load testing to validate the design. Mention feedback loops to adjust thresholds and autoscaling policies.

Key Points to Mention

  • Autoscaling policies (e.g., based on queue depth, CPU, or custom metrics) and their limitations (cold start, cost).
  • Backpressure mechanisms to signal devices to slow down, such as HTTP 429 with Retry-After or MQTT flow control.
  • Prioritization strategies: separate queues/topics for different data classes, weighted fair queuing, or SLA-based routing.
  • Load shedding techniques: graceful degradation, dropping non-essential data, and circuit breakers.
  • Trade-offs between consistency, availability, and cost (e.g., CAP theorem, eventual consistency in queues).
  • Real-world examples: how Axon's body cameras or IoT devices might handle burst uploads (e.g., after an incident).

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