Vetora logo
Medium10 componentsInterview: Very High

Video Streaming — CDN + Async Transcode (HLS + CloudFront)

Industry-standard video streaming architecture with presigned URL multipart upload (API server never touches video bytes), Kafka-driven async transcoding to 5 HLS quality tiers (240p through 4K), and CloudFront CDN delivering 95% of viewer traffic from 400+ edge locations. Separate CatalogService with Redis cache handles metadata reads.

CDNKafkaHLSAsync PipelineVideo Streaming
Problem Statement

The CDN + async transcode approach to video streaming represents the industry-standard architecture used by production VOD platforms at YouTube, Netflix, and Hulu scale. It solves the three fatal problems with the naive architecture: API-proxied uploads, synchronous transcoding, and origin-only delivery.

The first key insight is presigned URL upload. Instead of proxying video bytes through the API server (consuming gigabytes of memory per upload), the server generates a presigned S3 URL in 2ms and returns it to the client. The client uploads directly to S3 using multipart upload — splitting a 10GB file into 100MB chunks. If a chunk fails (mobile network drops), only that chunk is retried, not the entire upload. The API server never touches video bytes, eliminating the bandwidth and memory bottleneck entirely. At 6,000 uploads per second, the API server's work is signing 6,000 URLs — trivial compared to proxying 6,000 concurrent multi-gigabyte files.

The second key insight is async transcoding via Kafka. When the client signals upload completion, VideoService publishes a transcode-job event to a Kafka topic. The upload response returns immediately — the creator sees 'Video uploaded, processing...' in seconds, not after a 30-minute wait. TranscodeWorker pods consume jobs from Kafka and run FFmpeg to produce 5 HLS quality tiers: 240p (0.5 Mbps), 480p (1.5 Mbps), 720p (3 Mbps), 1080p (5 Mbps), and 4K (15 Mbps). Each tier is split into 10-second .ts segments with per-variant .m3u8 playlists and a master manifest. Transcoding takes 5-30 minutes but happens entirely in the background on dedicated workers — the API server's threads are never blocked.

The third key insight is CDN-first delivery. CloudFront serves all viewer traffic — HLS manifests, video segments, and thumbnails — from 400+ global edge locations. At a 95% cache hit rate, only 5% of requests reach the S3 origin. This transforms the egress equation: 100M concurrent viewers at 5 Mbps average = 500 Tbps total. Without CDN, all 500 Tbps hits S3 origin (impossible). With CDN at 95% cache hit, S3 sees only 25 Tbps of origin traffic, with 475 Tbps served from edge (feasible). CDN egress costs $0.01-0.02/GB versus S3's $0.09/GB — a 5-9x cost reduction that dominates the total cost of ownership.

The architecture separates read and write paths. VideoService handles the write path: upload initiation (presigned URL generation), upload completion (Kafka publishing), and user interactions (likes, comments). CatalogService handles the read path: video metadata queries with Redis caching at 90% hit rate. This separation allows independent scaling — CatalogService runs 10 pods for high read throughput while VideoService runs 4 pods for lower write volume.

HLS adaptive bitrate streaming is the viewer-facing improvement. Instead of a single 1080p MP4 that buffers on slow connections, the player fetches a master manifest listing all quality tiers with their bandwidth requirements. It selects an initial tier based on estimated bandwidth and fetches 10-second segments sequentially. If download speed drops (mobile entering a tunnel), the player switches to a lower tier (1080p to 720p to 480p) on the next segment boundary — maintaining smooth playback at reduced quality rather than buffering. If bandwidth improves, it switches up. This adaptive logic happens entirely in the client and is the reason every production video platform uses HLS or DASH.

Interviewers expect candidates to explain presigned URL upload and why the API server should never proxy video bytes, describe the async transcoding pipeline (Kafka + workers), justify CDN as the primary delivery mechanism with cost analysis, and discuss HLS adaptive bitrate as the solution to heterogeneous network conditions.

Architecture Overview

The CDN + async transcode architecture uses ten components organized into four layers: traffic ingestion (ViewerClient, UploaderClient, ApiGateway, MainLB), application services (VideoService, CatalogService), data stores (VideoDB/PostgreSQL, CatalogCache/Redis, VideoStore/S3), async pipeline (TranscodeStream/Kafka, TranscodeWorker), and edge delivery (CDN/CloudFront).

The upload path handles creator traffic — 5% of total requests but the most architecturally complex flow. UploaderClient sends POST /api/v1/videos/upload-init to VideoService via ApiGateway and MainLB. VideoService creates a video record in VideoDB (status=uploading), generates presigned S3 URLs for multipart upload (100MB chunks for a 10GB file = 100 URLs), and returns them to the client in approximately 50ms. The client uploads chunks directly to S3 — the API server never touches video bytes. After all chunks are uploaded, the client calls POST /api/v1/videos/{id}/upload-complete. VideoService publishes a transcode-job event to TranscodeStream (Kafka) and returns immediately. The upload flow completes in seconds.

The transcoding pipeline runs entirely in the background. TranscodeWorker pods (8 workers with 8 vCPU each) consume transcode-job events from Kafka. Each worker downloads the raw video from S3, runs FFmpeg to produce 5 HLS quality tiers (240p, 480p, 720p, 1080p, 4K), splits each tier into 10-second .ts segments, generates per-variant .m3u8 playlists and a master .m3u8 manifest, extracts a thumbnail image, and uploads all outputs to S3. Finally, it updates VideoDB with manifest_url and status=ready. Transcoding takes 5-30 minutes depending on video length and source resolution. Kafka's 7-day retention enables job replay on worker failure.

The playback path handles viewer traffic — 95% of total requests. ViewerClient fetches the master manifest from CDN (cache hit in 5ms). The HLS player parses the manifest, selects a quality tier based on bandwidth, and begins fetching .ts segments from CDN. CloudFront caches segments at edge locations with a 95% cache hit rate. Popular trending videos have near-100% hit rates because segments are immutable (once transcoded, they never change). Adaptive bitrate logic in the player monitors download speed per segment and switches tiers as needed.

The catalog browse path routes through ApiGateway, MainLB, and CatalogService. CatalogService checks CatalogCache (Redis, 90% hit rate) for video metadata (title, description, view count, manifest URL, thumbnail URL). On cache miss, it queries VideoDB (PostgreSQL). The response includes the CDN manifest URL that the player uses to start HLS playback.

Horizontal scaling is independent per component. CatalogService scales for read throughput (10 pods). VideoService scales for upload volume (4 pods). TranscodeWorker scales for transcoding backlog (8 workers). Kafka scales via partition count (8 partitions). CloudFront scales automatically with no configuration. Redis and PostgreSQL scale vertically within their instance class.

Architecture Preview
Loading architecture preview...
Request Flow — Upload, Transcode, and CDN Playback

This diagram shows the three primary flows: presigned URL upload (seconds, not minutes), async Kafka transcoding (background), and CDN-served HLS playback (sub-second start). The key difference from the naive variant is that the API server never blocks: uploads return presigned URLs in milliseconds, transcoding runs on dedicated workers, and playback is served entirely from CDN edge locations.

Loading diagram...
Key Design Decisions
Presigned URL Multipart Upload

Choice

Client uploads directly to S3 via presigned URLs instead of proxying through the API server

Rationale

Videos can be 10GB+. Single-PUT upload over a flaky mobile connection would fail and require full restart. Multipart upload splits into 100MB chunks — if one chunk fails, only that chunk is retried. Presigned URLs ensure the API server never proxies video bytes (10GB x 6K uploads/sec = 60TB/sec would overwhelm any API tier). The server's work is signing URLs — 2ms and 512 bytes per upload, versus gigabytes of memory for proxied upload.

Async Transcoding via Kafka Workers

Choice

Publish transcode-job to Kafka and process in background workers instead of synchronous in-request transcoding

Rationale

Transcoding a 1-hour video to 5 quality tiers takes 5-30 minutes of CPU time. Blocking the upload response for 30 minutes is unacceptable UX. Async via Kafka means the upload completes in seconds, and TranscodeWorker processes the job in the background. The video appears in the creator's dashboard as 'processing' until transcoding completes. Kafka's 7-day retention enables job replay on worker failure without data loss.

HLS Adaptive Bitrate with 5 Quality Tiers

Choice

HLS with .ts segments and per-variant .m3u8 playlists instead of single progressive MP4

Rationale

HLS splits video into 10-second segments, enabling adaptive bitrate: the client switches quality (240p to 1080p) based on real-time network conditions. Progressive download commits to a single quality at the start, causing buffering on slow connections or wasting bandwidth on fast ones. HLS also enables CDN caching per-segment — individual 10-second segments are cached independently at edge locations.

CloudFront CDN for All Viewer Traffic

Choice

CDN as the primary delivery layer with S3 as origin

Rationale

Video streaming generates enormous egress: 100M viewers x 5 Mbps = 500 Tbps. Without CDN, all traffic hits S3 origin — impossible. CloudFront's 400+ edge locations cache popular segments globally, reducing origin load to under 5% of total traffic. CDN egress costs $0.01-0.02/GB versus S3's $0.09/GB. CDN is the single most critical component — it transforms video delivery from physically impossible to operationally routine.

Separate VideoService and CatalogService

Choice

Independent microservices for upload orchestration and catalog browsing

Rationale

Upload/transcode (write path) and catalog browsing (read path) have very different scaling profiles. CatalogService handles 30K reads/sec with Redis cache — stateless and horizontally scalable. VideoService handles 6K uploads/sec with presigned URL generation and Kafka publishing. Separating them prevents upload spikes from affecting browse latency.

Redis Cache for Video Metadata

Choice

ElastiCache Redis with 90% hit rate, 300s TTL, cache-aside pattern

Rationale

Video metadata (title, manifest URL, view count) is read-heavy and tolerates 5-minute staleness. Redis serves 90% of catalog reads in 2ms. On cache miss, PostgreSQL responds in 15ms. Cache invalidation on video status changes (processing to ready) ensures viewers see newly available videos within the TTL window. The Zipfian access pattern (trending videos get disproportionate traffic) drives the high hit rate.

Scale & Performance

Target RPS

100K peak (75K playback via CDN, 15K catalog via API, 6K uploads, 4K interactions)

Latency (p99)

<1s playback start (CDN manifest + first segment), 5-30 min async transcode

Storage

~100 TB/day (raw + 5 transcoded tiers, growing continuously)

Availability

99.9% (multi-AZ, CDN offload, async pipeline)

Time & Space Complexity
OperationTimeSpaceNotes
Upload initiation (presigned URL generation)O(1) — S3 SDK signs URL using HMAC-SHA256O(1) — 512 bytes per URL2ms per URL generation. For a 10GB file with 100MB chunks: 100 URLs generated in ~200ms total. API server memory usage: ~50KB per request.
Async transcoding (FFmpeg, 5 tiers)O(N x M) — N = video duration, M = total output pixels across all tiersO(N) — intermediate frames buffered per resolution1-hour video to 5 tiers: 5-30 minutes on 8 vCPU worker. Parallelized per resolution on multi-core. GPU acceleration reduces to 3-10 minutes.
Catalog read (cache hit path)O(1) — Redis GET by video_id keyO(1) — ~2KB cached metadata per video2ms latency, 90% hit rate. 27K hits/sec out of 30K catalog reads/sec at peak.
CDN segment deliveryO(1) — edge cache lookup by URLO(S) — S = segment size (~2MB for 10-second 1080p segment)5-50ms from nearest edge location. 95% cache hit rate. Immutable segments with 86400s TTL.
Database Schema (HLD)
videos

Video metadata including upload status, CDN manifest URL, and view counts. Write path: INSERT on upload init (~6K/sec), UPDATE on transcode completion (status to ready + manifest_url). Read path: catalog queries on cache miss (~3K SELECTs/sec). Indexed by created_at for trending feeds.

video_id UUID PKtitle TEXT NOT NULLdescription TEXTmanifest_url TEXT (null until transcoding completes, then CDN HLS URL)status TEXT NOT NULL (uploading | processing | ready | failed)view_count INTEGER DEFAULT 0thumbnail_url TEXTduration_seconds INTEGERfile_size_bytes BIGINTcreated_at TIMESTAMPTZ DEFAULT NOW()

Indexes: PK on video_id, idx_videos_status_created ON (status, created_at DESC), idx_videos_created ON (created_at DESC)

The manifest_url column points to the CDN HLS master manifest (e.g., https://d1234.cloudfront.net/videos/{id}/master.m3u8). Set to null during upload and processing. Updated by TranscodeWorker after all quality tiers and segments are uploaded to S3.

likes

User-video like records for engagement tracking. Write-heavy at ~2K INSERTs/sec. Composite unique index on (user_id, video_id) prevents duplicate likes.

like_id UUID PKuser_id UUID NOT NULL FKvideo_id UUID NOT NULL FKcreated_at TIMESTAMPTZ DEFAULT NOW()

Indexes: PK on like_id, UNIQUE on (user_id, video_id), idx_likes_video ON (video_id, created_at)

Growth is proportional to user engagement. Like counts are cached in Redis and invalidated on write.

Event Contracts
Transcode Jobtranscode-jobs

Published by VideoService after upload completion. Consumed by TranscodeWorker which downloads the raw video from S3, runs FFmpeg for 5 HLS quality tiers, and uploads segments to S3. Partitioned by video_id for per-video ordering. 7-day retention for replay.

Key Schema

video_id (string)

Value Schema

{ video_id: string, s3_key: string, file_size: integer, output_prefix: string }

What-If Scenarios

Viral video with 100M concurrent viewers (CDN absorbs 95%)

Impact

100M viewers x 5 Mbps = 500 Tbps total. CDN serves 475 Tbps from edge (95% hit rate). S3 origin serves 25 Tbps (5% misses) — high but feasible with request partitioning across S3 prefixes. CloudFront automatically scales with no configuration. Individual edge locations may see up to 10 Gbps per-PoP for a single viral video.

Mitigation

Pre-warm CDN for expected viral content (product launches, live events). Use S3 Transfer Acceleration for origin requests. Distribute segments across multiple S3 prefixes to avoid per-prefix throttling.

TranscodeWorker backlog during upload surge (500+ hours/min uploaded)

Impact

8 workers can process approximately 50-100 videos/hour depending on length. A sustained surge of 500 hours/min creates a growing backlog in Kafka. New videos show 'processing' for hours instead of minutes. Creators become frustrated with the delay.

Mitigation

Auto-scale TranscodeWorker count based on Kafka consumer lag. Add priority queues — short videos (under 5 minutes) get a fast-lane topic. GPU-accelerated workers process 3-5x faster than CPU-only. The V2 variant uses GPU pools with auto-scaling.

Redis CatalogCache failure (0% hit rate, all reads hit PostgreSQL)

Impact

30K catalog reads/sec fall through to PostgreSQL. At 15ms per read, PostgreSQL needs 450 concurrent connections — above the 300 max_connections. Reads queue, p99 latency spikes from 5ms to 200ms+. Viewers experience slow catalog loading but playback (CDN-served) is unaffected.

Mitigation

Redis Cluster with 3-node HA and automatic failover. On total cache failure, implement circuit breaker to degrade gracefully — serve cached metadata from a local in-memory cache (stale but available) while Redis recovers.

S3 outage in us-east-1 (origin unavailable for CDN cache misses)

Impact

CDN continues serving cached segments (95% of traffic). However, 5% of requests that would hit the origin fail. New or unpopular videos with cold caches become completely unavailable. New uploads fail because presigned URLs point to the unavailable S3 endpoint.

Mitigation

The V2 variant solves this with multi-region origin failover — CDN checks the primary origin (us-east-1) and on failure routes to the secondary (eu-west-1) where segments are cross-region replicated. For the V1 variant, S3 cross-region replication to a backup bucket provides partial mitigation.

Failure Modes & Resilience
ComponentFailureImpactMitigation
CloudFront CDNEdge location degradation (partial, rare)Viewers in the affected region experience increased latency as traffic reroutes to the next nearest edge. CloudFront automatically reroutes — viewer impact is 100-200ms additional latency during rerouting.CloudFront has built-in redundancy across 400+ edge locations. No operator action needed. Monitor via CloudFront metrics for cache hit rate drops per edge location.
TranscodeStream (Kafka)Kafka broker failure (single broker in 3-broker cluster)Partition leaders on the failed broker become unavailable. Kafka rebalances partitions to surviving brokers (~30 seconds). During rebalance, some transcode-job publishes may fail. Videos uploaded during this window show 'uploaded' but do not enter transcoding until the publish is retried.Kafka cluster with 3 brokers and replication factor 3. ISR (In-Sync Replicas) ensures no data loss. VideoService retries failed publishes with exponential backoff.
TranscodeWorkerWorker crash during transcoding (FFmpeg segfault, OOM)The partially transcoded video has incomplete segments in S3. The Kafka offset is not committed, so the job will be redelivered to another worker. The new worker starts from scratch (no checkpointing), wasting the partial work.Kafka consumer auto-commit disabled; commit only after all segments are uploaded and VideoDB is updated. Idempotent transcoding: check if segments already exist in S3 before re-transcoding. Dead letter queue for jobs that fail 3 times.
VideoDB (PostgreSQL)Primary database failureUpload initiation fails (cannot create video records). Catalog reads fall back to cache (90% of reads unaffected). Cache misses fail. Transcode completion updates fail (workers retry). Existing playback is unaffected (CDN-served).RDS Multi-AZ with automatic failover (30-60 seconds). Read replicas for catalog query offload. Connection pooling via PgBouncer for connection storm handling after failover.
Scaling Strategy

Auto-scaling per component: CatalogService scales on CPU utilization (target 60%, add pods at 70%). VideoService scales on request rate. TranscodeWorker scales on Kafka consumer lag (add workers when lag exceeds 500 jobs). Redis: vertical scaling within the r7g family (large to xlarge to 2xlarge). PostgreSQL: vertical scaling + read replicas for catalog query offload. CDN: automatic, no configuration. The architecture supports 100M+ concurrent viewers with proportional scaling of CDN capacity and origin infrastructure.

Monitoring & Alerting

Key metrics: (1) CDN cache hit rate — the primary performance indicator. Alert below 90%, critical below 80%. (2) Kafka consumer lag on transcode-jobs — indicates transcoding backlog. Alert if lag exceeds 1,000 jobs (approximately 30 minutes of backlog). (3) Playback start latency (p99) — measured from manifest fetch to first segment rendered. Alert above 2 seconds. (4) Upload initiation latency (p99) — presigned URL generation should be under 100ms. Alert above 500ms. (5) Redis cache hit rate — alert below 85%. (6) TranscodeWorker processing time per video — baseline 5-30 minutes. Alert if mean exceeds 45 minutes (indicates resource contention). (7) S3 origin 5xx error rate — alert above 0.1%. Indicates throttling or service degradation.

Cost Analysis

At 10M concurrent viewers: CloudFront CDN egress (~$15,000/month at 500 Tbps with reserved capacity), TranscodeWorker 8 pods ECS Fargate 8vCPU ($2,500/month), VideoService 4 pods ($400/month), CatalogService 10 pods ($1,000/month), PostgreSQL db.r7g.xlarge ($350/month), Redis cache.r7g.large ($250/month), MSK Kafka 3 brokers ($600/month), S3 storage ~100TB ($2,300/month). Total: ~$22,400/month. Contrast with the naive variant: 1,000 viewers cost $146K/month in S3 egress alone. The CDN variant serves 10,000x more viewers at 1/6th the cost. CDN egress optimization (reserved capacity pricing, origin shield) can reduce the CDN bill by another 30-40%.

Security Considerations

Presigned URL security: URLs are signed with AWS SigV4 and expire after 1 hour. Each URL is scoped to a specific S3 key — uploaders cannot overwrite other videos. CDN signed URLs for playback restrict access to authenticated viewers (optional — public videos skip signing). Content moderation: after transcoding completes, a moderation pipeline (out of scope) scans thumbnails and sample frames for policy violations before setting status=ready. Rate limiting: upload initiation limited to 10/minute per user to prevent storage abuse. API Gateway JWT authentication on all API endpoints.

Deployment Strategy

Rolling deployment for VideoService and CatalogService — replace one pod at a time while the LB routes to healthy pods. TranscodeWorker: rolling replacement with Kafka consumer rebalancing. In-flight transcoding jobs on the old worker are lost but redelivered by Kafka. CDN: no deployment needed — CloudFront propagates configuration changes to all edge locations in 5-15 minutes. Database migrations during low-traffic windows with RDS blue/green deployment for zero-downtime schema changes.

Real-World Examples
  • YouTube uses a similar architecture with Colossus (distributed file system) replacing S3 and Borg (cluster manager) replacing ECS, but the conceptual pipeline — presigned upload, async transcode, CDN delivery — is identical
  • Netflix uses a more advanced variant with per-title encoding optimization (variable bitrate per scene), but the HLS/DASH + CDN delivery model matches this architecture
  • Vimeo, Dailymotion, and most production VOD platforms use this exact pattern: S3 + async transcode + CloudFront/Fastly/Akamai CDN
Solution Comparison
VariantTierLatencyThroughputCostComplexityReliability
V0: Naive (Single Bitrate, No CDN)T115-45 min upload, 50-200ms playback redirect~10K RPS (limited by 40 threads)$146K/month at 1K viewers (S3 egress dominated)Low99% (single DB, no CDN)
V1: CDN + Async Transcode (HLS + CloudFront)T2~2s upload init, 5-30 min async transcode, <1s playback100K RPS peak$22K/month at 10M viewers (CDN egress)Medium99.9% (multi-AZ, CDN)
V2: Adaptive Multi-Region (HLS + Edge + Cassandra)T3<1s upload init, 3-20 min GPU transcode, <800ms playback200K RPS peak$80K/month at 100M viewers (multi-region CDN + GPU)Very High99.99% (multi-region, origin failover)

This template is for educational and illustration purposes only. It may not represent the optimal production design for this problem. Real-world systems involve additional considerations (compliance, specific cloud provider constraints, organizational requirements) not captured here. Use this as a starting point for discussion, not as a production blueprint.

Frequently Asked Questions
Why presigned URL upload instead of proxying through the API server?

A 10GB video proxied through the API server consumes 10GB of server memory for the upload duration (minutes to hours). At 100 concurrent uploads, the API tier needs 1TB of memory just for byte proxying. Presigned URLs eliminate this entirely: the server generates a signed URL in 2ms (512 bytes of memory) and the client uploads directly to S3. The API server's bandwidth and memory usage drops from terabytes to kilobytes. Additionally, multipart upload splits large files into 100MB chunks with per-chunk retry — a failed chunk on a mobile network is retried without restarting the entire upload.

How does HLS adaptive bitrate prevent buffering?

HLS splits video into 10-second segments at each quality tier. The player downloads segments sequentially, measuring download speed per segment. If the current 1080p segment (5 Mbps) takes longer to download than its 10-second playback duration, the player switches to 720p (3 Mbps) for the next segment. This switch happens seamlessly — the viewer sees a brief quality reduction but no buffering pause. If bandwidth recovers, the player switches back up. The master .m3u8 manifest lists all quality tiers with their bandwidth requirements, enabling the player to make informed switching decisions.

Why is CDN the most critical component for video delivery?

Video bandwidth math: 100M concurrent viewers x 5 Mbps average = 500 Tbps total egress. No single origin (S3, GCS, or any object store) can serve 500 Tbps. CDN distributes this load across 400+ global edge locations. At 95% cache hit rate, the origin sees only 25 Tbps — feasible for S3 with proper request distribution. Beyond bandwidth, CDN reduces viewer latency from 200-500ms (cross-region to origin) to 5-50ms (nearest edge location). And CDN egress costs $0.01-0.02/GB versus S3's $0.09/GB — a 5-9x cost reduction that dominates total cost at scale.

What happens if Kafka is down when an upload completes?

The upload itself succeeds (video bytes are in S3), but the transcode-job event is not published to Kafka. VideoService should implement retry with exponential backoff for the Kafka publish. If Kafka is unavailable for an extended period, VideoService can write the job to a local database table as a fallback (outbox pattern) and a recovery process sweeps the outbox when Kafka recovers. The video remains in status='uploaded' until the transcode job is successfully published and processed.

Why 5 quality tiers instead of 3 or 10?

Five tiers (240p, 480p, 720p, 1080p, 4K) cover the practical range of viewer devices: 240p for feature phones on 2G/3G, 480p for smartphones on cellular, 720p for tablets and laptops on Wi-Fi, 1080p for desktop monitors, and 4K for smart TVs on fiber. Fewer tiers (3) means larger quality jumps during adaptive switching — a 480p to 1080p jump is jarring. More tiers (10) means more storage (10x instead of 5x the original file) and more transcoding time, with diminishing perceptual benefit between adjacent tiers. The storage cost of 5 tiers (approximately 10x the original) is offset by bandwidth savings: serving 240p to a mobile user saves 95% bandwidth versus serving 4K.

Related Templates

Discussion

Sign in to join the discussion.

Ready to design your own Video Streaming?

Open the simulator, place components on the canvas, wire them up, and run a traffic simulation to see how your architecture performs under real load.

Open Simulator