Serverless in 2026: When It Actually Makes Sense
Serverless stopped being a religious argument a while ago. The honest 2026 position is boring and useful: it's a deployment model that's excellent for some workloads and a bad fit for others, and the skill is knowing which is which before you commit. "Serverless" as a word has also blurred — it now spans FaaS (Lambda, Cloud Functions), serverless containers (Cloud Run, Fargate, Container Apps), and serverless databases and queues. Lumping them together is where a lot of bad decisions start.
I've shipped systems that lean heavily on serverless and systems where introducing it would have been a mistake. Here's the decision framework I actually use.
What serverless is genuinely great at
The core value proposition holds: you don't manage servers, you scale to zero, and you pay per use. For the right workload that's transformative.
- Spiky and unpredictable traffic. A webhook handler that gets 10 requests one hour and 10,000 the next is the textbook case. Serverless scales up to meet the spike and costs nothing during the quiet hours. Provisioning a fleet for peak that sits idle most of the day is pure waste.
- Event-driven glue. Reacting to a file upload, a queue message, a database change, a scheduled cron. These are short, stateless, bursty — exactly serverless's shape.
- Low-traffic services. Internal tools, admin endpoints, side projects. Paying per invocation on something that runs a few hundred times a day is far cheaper than a always-on instance.
- Fast time-to-first-deploy. No cluster to stand up, no capacity to plan. For a new service that might not survive the quarter, that's real leverage.
Where it bites
The failure modes are as real as the wins, and they cluster around a few areas.
Cost at scale inverts. Per-invocation pricing is a gift at low volume and a tax at high volume. There's a crossover point — different for every workload — where a steady stream of traffic makes a provisioned container dramatically cheaper. I've seen a high-throughput API's bill drop by more than half moving from Lambda to Fargate simply because it ran hot 24/7 and the per-request math stopped favoring FaaS. Model your actual traffic before assuming serverless is cheaper.
Cold starts on the critical path. They've shrunk a lot — lightweight runtimes and VM snapshotting (Firecracker-style, Lambda SnapStart) get many functions starting in tens of milliseconds. But a heavy JVM or a fat dependency tree can still cold-start in seconds, and if that's on a user-facing request path, someone waits. Provisioned concurrency fixes it but costs money and quietly erodes the "scale to zero" benefit.
Statelessness is a hard constraint. Functions don't keep in-memory state between invocations and can't hold persistent connections well. Anything needing a warm cache, a websocket, or a large model loaded in memory fights the model. This is why websocket architecture at scale rarely lives in pure FaaS.
Local dev and debugging. Reproducing a distributed, event-driven serverless system on a laptop is genuinely harder than docker compose up. The tooling has improved but it's still a tax on developer experience.
Serverless containers changed the calculus
The most useful shift over the last few years is that serverless containers narrowed the gap between "FaaS" and "run a container." Platforms like Cloud Run, Fargate, and Container Apps let you deploy an ordinary container image, scale it to zero, pay per use, and also handle longer requests, keep connections open within an instance, and run any runtime — without the sharp statelessness constraints of pure functions.
For a lot of workloads that used to force a choice between "Lambda but fight cold starts" and "always-on Kubernetes deployment," serverless containers are now the pragmatic middle. You keep the operational simplicity and scale-to-zero economics while sidestepping the worst FaaS limitations.
# Cloud Run-style service: scales to zero, handles concurrent requests per instance
service: payments-api
image: registry.acme.io/payments-api:sha-abc123
scaling:
minInstances: 0 # scale to zero when idle
maxInstances: 50
concurrency: 80 # requests handled per instance
resources:
cpu: "1"
memory: 512Mi
A decision table
| Workload | Best fit | Why |
|---|---|---|
| Webhook / event handler | FaaS | Bursty, short, stateless |
| Scheduled job / cron | FaaS | Runs briefly, scale to zero |
| Low-traffic API | Serverless container | Scale to zero, no cold-start-in-loop |
| Steady high-throughput API | Provisioned container | Per-request cost inverts |
| Long-running / streaming | Container or VM | FaaS timeouts and statelessness |
| Websocket / stateful | Provisioned | Persistent connections |
Costs that hide off the invoice line
The compute bill isn't the whole cost. Serverless architectures tend to fan out into many small pieces — queues, event buses, function-to-function calls — and the data transfer, API Gateway charges, and per-request costs of the supporting services can quietly exceed the compute. Watch cardinality too: a chatty serverless system generates a lot of logs and traces, and observability spend is real. If you're already thinking about Kubernetes cost and FinOps, apply the same rigor here — tag everything, alert on anomalies, and don't assume "serverless" means "free when idle" for the whole architecture.
There's also lock-in to price in honestly. Deep use of a specific cloud's event bus, function runtime, and managed triggers is portable in theory and painful in practice. Serverless containers hedge this better than proprietary FaaS because the unit of deployment is a standard container image.
How I decide
Default to serverless containers for new services with uncertain or low traffic — you get scale-to-zero economics without the sharpest FaaS constraints. Reach for pure FaaS when the workload is genuinely event-driven, short, and stateless. Move to provisioned compute when traffic is steady and high enough that per-request pricing stops making sense, or when you need persistent connections, large in-memory state, or tight tail-latency control. And model the cost against your real traffic shape rather than the marketing math — the crossover point is where most serverless regret comes from.
Serverless in 2026 isn't a movement to join or resist. It's one more tool with a well-understood envelope. Deploy it inside that envelope and it's excellent; drag it outside and you'll spend the savings on workarounds.
Resources
- AWS Lambda — best practices
- Google Cloud Run documentation
- AWS Lambda SnapStart
- Firecracker — microVMs
- CNCF Serverless Whitepaper
- Azure Container Apps documentation
Frequently asked questions
Is serverless cheaper than running containers?
It depends entirely on traffic shape. Serverless is cheaper for spiky, low, or unpredictable traffic because you pay per invocation and nothing when idle. For steady high-throughput workloads running 24/7, a provisioned container or VM is usually cheaper per request.
Are cold starts still a problem in 2026?
Much less than they were, but not gone. Lightweight runtimes and snapshot-based startup have cut cold starts to tens of milliseconds for many languages. They still matter for latency-critical user-facing paths and heavy runtimes, where provisioned concurrency or keeping the function warm is worth the cost.
When should I not use serverless?
Avoid pure FaaS for long-running jobs, sustained high-throughput services, workloads needing large in-memory state or persistent connections, and anything sensitive to tail latency where cold starts hurt. Serverless containers or provisioned compute fit those better.
Hiring a senior Android / Flutter engineer?
I architect and ship production mobile software — Kotlin, Jetpack Compose, Flutter — for robotics, EV infrastructure, fintech, and real-time systems. Open to remote roles in Europe and the US.
Get in touch →