Quick summary: The three serious contenders for edge compute in 2026 each represent a different architectural bet. Cloudflare Workers uses isolates (V8 contexts) for sub-millisecond cold starts, but limits runtimes to JavaScript/WASM. AWS Lambda (with @Edge variants) runs full container images with broad runtime support but cold starts in the 100-1000ms range. Fly.io runs full Docker containers in micro-VMs at edge locations โ slower cold starts than Workers but full runtime flexibility plus persistent storage. The right choice depends on your runtime requirements, latency tolerance, geographic distribution needs, and pricing model.
The Three Architectural Models
Cloudflare Workers: V8 isolates
Workers run as V8 isolates โ lightweight JavaScript contexts within a shared V8 process. There is no per-invocation container start; the isolate is created in microseconds. The trade-off is that you are limited to what runs in V8: JavaScript, TypeScript, and WebAssembly. No native binaries, no system calls beyond what the Workers runtime exposes.
The runtime API has expanded dramatically since 2020. Workers in 2026 have D1 (SQLite at the edge), R2 (S3-compatible object storage), Durable Objects (single-instance stateful primitives), Queues, and a polished WASM story. Many production services run entirely on Workers with no traditional backend.
AWS Lambda: containers, optionally at edge
Standard Lambda runs in micro-VMs (Firecracker) in specific AWS regions. Lambda@Edge runs in CloudFront edge locations but with significant restrictions (smaller resource limits, fewer runtimes). CloudFront Functions is the lightweight cousin โ JavaScript-only, runs in even more locations but with severe runtime restrictions.
The model: write code (or bundle a container image up to 10 GB), AWS provisions execution environments per invocation, scales to zero. Cold starts depend on runtime โ Node and Python are fastest (50-200ms typically), Java and .NET can be 1000+ms.
Fly.io: Docker containers in micro-VMs
Fly runs your Docker container in a Firecracker micro-VM, deployed to one or more of Fly's 30+ edge regions. Containers can be always-on (no cold start, you pay for continuous CPU and memory) or scale-to-zero (cold start when the first request arrives). Persistent volumes and Postgres are first-class. The mental model is "Heroku, but distributed globally."
Cold Start Reality
We benchmarked cold start latency across all three platforms. Test: simple "hello world" responder, measured from the platform's edge entry to first byte of response.
| Platform | p50 cold start | p99 cold start | Notes |
|---|---|---|---|
| Cloudflare Workers (JS) | ~5 ms | ~15 ms | Isolates have no real cold start |
| Cloudflare Workers (WASM) | ~12 ms | ~40 ms | Module instantiation overhead |
| AWS Lambda (Node, x86) | ~95 ms | ~340 ms | Provisioned Concurrency eliminates this |
| AWS Lambda (Node, ARM) | ~75 ms | ~280 ms | Graviton is faster for cold starts |
| AWS Lambda (Python) | ~120 ms | ~420 ms | Slightly slower than Node |
| AWS Lambda (Java) | ~1100 ms | ~3400 ms | JVM startup is the killer |
| AWS Lambda (Container, 200MB image) | ~280 ms | ~850 ms | Image fetch + start |
| Fly.io (small Docker image) | ~750 ms | ~2200 ms | Full VM cold start |
| Fly.io (always-on) | ~3 ms | ~8 ms | No cold start; pay for idle CPU |
The takeaway: for true cold-start performance, Workers wins by an order of magnitude. AWS Lambda is acceptable for most workloads except Java cold starts. Fly.io's cold starts are noticeable but mitigated by always-on mode (which costs more but is still cheap relative to AWS Fargate or EC2).
Geographic Distribution
| Platform | Locations (2026) | Distribution model |
|---|---|---|
| Cloudflare Workers | 320+ cities | Code runs in every location automatically |
| AWS Lambda (regional) | 32 regions | You deploy to specific regions |
| Lambda@Edge | ~200 CloudFront edges | Limited runtime support |
| CloudFront Functions | ~600 PoPs | JavaScript only, severe limits |
| Fly.io | 35 regions | You select which regions to deploy to |
For "every user gets sub-50ms latency from their location" requirements, Cloudflare Workers wins on raw geographic coverage. AWS Lambda regional deployments require explicit multi-region setup (Route 53 + per-region Lambda + DynamoDB Global Tables or similar). Fly.io sits between โ meaningful global coverage with explicit per-region control.
Real-World Latency to Users
Test: simple JSON-returning API, measured from synthetic users in 10 cities globally. p50 round-trip latency.
| City | Workers (warm) | Lambda us-east-1 | Fly.io (3 regions) |
|---|---|---|---|
| New York | 18 ms | 22 ms | 24 ms |
| London | 22 ms | 92 ms | 27 ms |
| Frankfurt | 21 ms | 98 ms | 26 ms |
| Tokyo | 34 ms | 168 ms | 41 ms |
| Singapore | 38 ms | 212 ms | 44 ms |
| Sydney | 42 ms | 205 ms | 52 ms |
| Sรฃo Paulo | 48 ms | 118 ms | 62 ms |
| Mumbai | 52 ms | 198 ms | 58 ms |
| Los Angeles | 26 ms | 74 ms | 32 ms |
| Cape Town | 78 ms | 225 ms | 92 ms |
Workers wins consistently for global latency because every request lands at a Cloudflare PoP near the user. Lambda in a single region penalizes geographically distant users heavily. Fly.io with three carefully-chosen regions covers most of the world reasonably; with more regions, gets close to Workers latency but at correspondingly higher idle cost.
Pricing Math
Pricing comparisons are notoriously slippery (each platform structures them differently). For a typical small API workload โ 10 million requests/month, 50ms average CPU time, 200KB average response size โ the rough monthly cost in 2026:
| Platform | Estimated cost | Notes |
|---|---|---|
| Cloudflare Workers | ~$5-15 | Free tier covers most small workloads |
| AWS Lambda | ~$25-50 | Plus CloudFront/data egress |
| Lambda@Edge | ~$60-90 | Edge requests cost 3x regional |
| Fly.io (always-on, small machine) | ~$5-15 | Per-machine, scales linearly with capacity |
For higher volumes (1B+ requests/month), the picture shifts:
- Workers stays cheapest because requests are cheap and bandwidth is included.
- Lambda becomes expensive because of per-request charges and data egress.
- Fly.io becomes competitive if you can fit on a small fixed pool of always-on machines.
Bandwidth is the hidden cost on AWS โ Lambda response data egress at ~$0.085/GB to internet adds up fast. Cloudflare bandwidth is included; Fly.io bandwidth is reasonable ($0.02-0.05/GB depending on region).
What Each Is Best For
Cloudflare Workers
- Best for: HTTP APIs at global scale, edge-side request modification (auth, A/B testing, headers), real-time websocket fan-out (Durable Objects), AI inference orchestration (Workers AI bindings), JAMstack backends.
- Avoid when: you need Python/Java/.NET runtimes, large native binaries, GPU compute, persistent disk > few GB.
AWS Lambda
- Best for: integration with AWS services (SQS, S3, DynamoDB), single-region high-concurrency workloads, container-based workloads with arbitrary runtimes, serverless data pipelines.
- Avoid when: you need genuinely global low latency (use Workers or Fly), cold starts matter for user-facing requests (use Provisioned Concurrency or another model), you're cost-sensitive at high request volumes.
Fly.io
- Best for: traditional Docker apps that need global distribution, apps with persistent state (Postgres, Redis), websocket-heavy apps, full-stack apps where you want one deploy target.
- Avoid when: you have extremely spiky traffic (always-on idle cost) and cold starts are unacceptable, you need 200+ edge locations.
Deeper Look: Workers' Killer Features
Durable Objects
A single-instance, strongly-consistent compute primitive distributed globally. Each Durable Object lives at one location, is reachable from anywhere, and has consistent state. Used for: chat rooms, multiplayer game state, per-tenant rate limiting, leaderboards, real-time collaboration.
D1 (SQLite at the edge)
SQLite databases hosted on Workers infrastructure. Reads can happen at any edge; writes go to a primary. Read latency is millisecond-level globally. Excellent for low-write, high-read workloads (CMS, product catalogs, configuration data).
R2 (S3-compatible storage)
Object storage with no egress fees. The same R2 bucket is accessible from Workers, from any HTTP client, from S3-compatible tools. The no-egress pricing is genuinely disruptive for media-heavy workloads.
Workers AI
Run open-source ML models (Llama, Mistral, Whisper, Stable Diffusion) at the edge with sub-second response time. Pricing is per-token/per-step. Compelling for production AI inference where you control the model selection.
Deeper Look: Lambda's Strengths
Ecosystem integration
Triggered by virtually every AWS service. SQS triggers, S3 events, DynamoDB streams, Kinesis, EventBridge โ Lambda is the glue language of AWS. If you're already deeply on AWS, Lambda is the path of least resistance.
Container support
Bundle anything that fits in a 10GB OCI image. Bring your own runtime, your own dependencies, your own native binaries. Cold start cost is real but acceptable for many workloads.
Provisioned Concurrency
Pre-warm Lambda instances to eliminate cold starts. Costs more (you pay for the warm capacity) but turns Lambda into a reasonable always-on platform when you need it.
Deeper Look: Fly.io's Strengths
Lift-and-shift Docker apps
If your existing app runs in Docker, deploying to Fly is mostly "fly launch + fly deploy." No rewrite, no platform-specific runtime, no learning curve. The fastest path from "Docker container locally" to "globally distributed in production."
Postgres clusters
Fly's managed Postgres with read replicas across regions is the cleanest "geographically distributed Postgres" experience for non-AWS users. Aurora Global Database is comparable on AWS but more complex.
Persistent volumes
Per-app persistent volumes for genuine stateful workloads. Useful when "stateless containers + external state store" doesn't fit your architecture.
Developer Experience Compared
Performance and pricing matter, but the daily developer experience often determines which platform a team sticks with. Honest impressions:
Cloudflare Workers DX
The wrangler CLI is excellent. Local development with miniflare runs the actual Workers runtime locally, so behavior matches production closely. Hot-reload during development is fast. Deployment is one command. Logs stream live with wrangler tail. Bindings (KV, R2, D1, Durable Objects) are configured in wrangler.toml, with type generation for TypeScript. The friction points: debugging is harder than for traditional Node services (no local Chrome devtools attach), some Node-specific libraries don't work without compatibility flags.
AWS Lambda DX
SAM (Serverless Application Model) and CDK are the modern deployment tools. Both work but neither is delightful. Local testing via SAM is workable but slow. CloudWatch Logs are functional but the UI feels dated; many teams pipe logs to better tools. Deployment is fast for code-only updates, slower when infrastructure changes. The friction points: the IAM permission model around Lambda is complex; cold starts on Java/.NET; the inability to easily test certain triggers locally (e.g., S3 events).
Fly.io DX
The fly CLI is one of the cleanest in cloud computing. fly launch auto-detects your app and generates sane defaults. fly deploy is fast. fly logs streams. fly ssh console drops you into the running container. Multi-region deployment is trivial. The friction points: fewer integration points with other AWS-style services (you bring your own state stores typically); the persistent-volume model has constraints around region affinity that occasionally surprise.
Subjective summary
For a developer coming from traditional backend work, Fly's "just deploy your Docker container" is the lowest-friction onramp. For someone comfortable with serverless patterns, Workers' DX is the most polished. Lambda's DX is acceptable rather than enjoyable โ its strength is the AWS service integration, not the developer experience itself.
Frequently Asked Questions
Can I run Python on Workers?
Yes, with caveats โ Cloudflare's Pyodide-based Python runtime works for many cases but is not a full CPython environment. Native extension support is limited. For pure Python web logic, it works; for ML or data-science workloads, use Lambda or Fly.
What about WebAssembly?
All three support WASM in some form. Workers has the deepest WASM integration; you can write Workers in Rust, Go, AssemblyScript, etc., compiled to WASM. Lambda supports WASM via Wasmtime-based runtimes (less mature). Fly.io supports WASM via standard container patterns.
What about regulated data and compliance?
All three offer compliant tiers (HIPAA, SOC 2, etc.). Cloudflare offers data residency controls (lock data to specific regions). AWS Lambda's compliance posture is the most mature. Fly.io is improving but is the youngest of the three.
How do I handle databases?
Workers + D1 (SQLite) for simple cases; Workers + Hyperdrive for connecting to traditional Postgres/MySQL across the internet with connection pooling. Lambda + RDS or Aurora. Fly + Fly Postgres or external Postgres.
Multi-cloud?
You can use Workers as the global front door for an AWS-backed origin, getting Workers' edge presence + Lambda's runtime flexibility. Or use Workers + Fly. Or use Workers, Lambda, and Fly each for different parts of your system. The platforms are not mutually exclusive.
What about Vercel/Netlify Edge Functions?
Both run on Cloudflare Workers infrastructure under the hood. Same performance characteristics; different developer experience and pricing model.
One Real Migration Story
A SaaS team we know moved their authentication API from AWS Lambda (us-east-1) to Cloudflare Workers in mid-2025. Motivation: their largest customer was in Europe and complained about login latency that felt slow despite passing technical SLAs. Migration: rewrote roughly 8,000 lines of Node.js Lambda code to Workers (mostly mechanical โ runtime APIs are similar). Used Workers KV for session caching, D1 for the user lookup table, and Hyperdrive to connect back to their existing RDS Postgres for the source of truth. Total migration time: 6 weeks of one engineer's time. Results: p50 login latency for European users dropped from 240ms to 55ms; AWS bill for the auth service dropped from $2,800/month to $180/month; cold-start-related timeout incidents went from 2-5 per week to zero. Net assessment: the team subsequently moved their entire public-facing API surface to Workers over the following 8 months.
Further Reading from the Dargslan Library
- DevOps & Cloud category โ serverless, edge compute, and cloud-native architecture.
- Networking category โ CDN, latency optimization, and global traffic distribution.
- Free cheat sheet library โ printable references for wrangler, AWS SAM, and Fly CLI.
- Dargslan eBook library โ comprehensive cloud and serverless courses.
The Bottom Line
The right edge compute platform depends on your specific workload. Cloudflare Workers wins on global latency, cold starts, and bandwidth pricing โ pick it for HTTP APIs, edge logic, and JAMstack backends. AWS Lambda wins on AWS ecosystem integration and runtime flexibility โ pick it for AWS-native systems and workloads with arbitrary runtime requirements. Fly.io wins on Docker compatibility and stateful workloads โ pick it for traditional containerized apps that need global distribution. Most production teams in 2026 use more than one, picking the right tool for each part of their architecture rather than forcing everything onto a single platform.