Kadharmoideen Fadurudeen

Lead Engineer & Architect with 19+ years of experience building scalable applications and leading high-performing teams.

Quick Links

HomeExperienceBlog

Connect

© 2026 Kadharmoideen Fadurudeen. All rights reserved.

K
KadharLead Engineer & Architect
AboutExperienceProjectsBlogResourcesGames
Tools
Back to Blog
Cloud & Architecture
April 20, 2026
13 min read

Serverless vs. Traditional Backends: A Practical Decision Framework

Cold starts, cost curves, and operational overhead — a practical framework for deciding when serverless actually wins over a traditional always-on backend, and when it quietly costs you more.

Few architecture debates get re-litigated as often as "serverless vs. traditional backends" — and few get answered as badly. Most takes are context-free: someone had a great experience with Lambda on a spiky internal tool and now recommends serverless for everything, or someone got burned by cold starts on a latency-sensitive API and now avoids it entirely. Both are right about their own system and wrong as general advice.

After 19+ years building and operating backends — some serverless, some on containers, some on bare metal I had to rack myself early in my career — I've stopped thinking about this as a technology choice and started thinking about it as a traffic-shape and team-shape choice. This is the framework I actually use.

The one-sentence version

Serverless is a bet that your traffic is spikier than your team's ops capacity can comfortably provision for. If that bet is true, serverless wins. If your traffic is steady and predictable, a traditional backend almost always wins on cost and latency — you're just paying for compute you're not using in a different, less visible way.

Where Serverless Genuinely Wins

I reach for serverless (Lambda, Vercel Functions, Cloudflare Workers, Cloud Run with scale-to-zero) by default in a few very specific situations, and it's rarely close:

  • Spiky, unpredictable traffic. Webhook receivers, form submissions, scheduled jobs, image/video processing triggered by uploads — anything that goes from zero requests to a burst and back to zero. Provisioning a server to sit idle for this is pure waste.
  • Small teams with no dedicated ops capacity. No patching, no capacity planning, no 3am paging for a disk filling up. For a two-person team shipping an MVP, that operational silence is worth real money even if the per-request cost is technically higher.
  • True pay-per-use at low-to-moderate sustained volume. If you're serving a few hundred thousand requests a month, not tens of millions, the free tier and per-invocation pricing of most serverless platforms will beat the cost of an always-on instance, full stop.
  • Independent scaling per endpoint. One route gets hit 100x harder than the rest during a launch. Serverless scales that one function without you having to think about it; a monolith on a fixed fleet scales everything together or nothing at all.

Where It Quietly Costs You More

The costs that don't show up in the marketing page are the ones that matter most, because they're the ones teams discover after they've already committed:

Cold starts

A function that hasn't run recently pays a startup tax — sometimes tens of milliseconds, sometimes multiple seconds if it's pulling in a large dependency tree or running on a language runtime with a heavier boot time. For a background job, nobody notices. For a user-facing API on the critical render path, that's a visible stutter, and it happens at the worst possible time: right when traffic is picking up and instances are scaling out.

Execution time limits

Most serverless platforms cap execution duration. That's fine for a typical API call, but it forces awkward workarounds for anything genuinely long-running — large report generation, video transcoding, bulk data migrations. Teams end up building a secondary queue-and-worker system just to route around the limit, which means they're now operating two backend paradigms instead of one.

The cost curve flips at scale

Per-invocation pricing is a great deal when you're not using much compute. It stops being a great deal once your traffic is high and steady, because you're paying a premium, per request, for elasticity you're no longer using — the load isn't spiky anymore, it's a flat line. Past a certain sustained volume, a couple of reserved, right-sized instances running the same workload 24/7 is reliably cheaper.

Lock-in on proprietary triggers

Once your business logic is wired directly into a provider's event model — queue triggers, storage triggers, proprietary orchestration — moving to another platform isn't a redeploy, it's a rewrite of your integration layer. A containerized service behind an HTTP interface is portable almost by default; a function tightly coupled to one cloud's event bus usually isn't.

A Practical Decision Framework

When I'm asked to make this call on a new project, I score four dimensions. None of them alone is decisive — it's the combination that points to an answer.

DimensionFavors ServerlessFavors Traditional Backend
Traffic patternSpiky, bursty, unpredictable, or near-zero idle periodsSteady, predictable, sustained near-constant load
Team / ops capacitySmall team, no dedicated infra/ops roleTeam with infra experience or a platform team
Latency sensitivityTolerant of occasional cold-start latencyHard real-time or user-facing critical path
Sustained request volumeLow to moderateHigh and consistent enough to saturate reserved capacity

If three or more rows point the same direction, that's your answer. When it's a genuine split — spiky traffic but latency-critical, for example — that's usually a signal you need the hybrid approach below rather than a single paradigm for the whole system.

The Hybrid Approach Most Real Systems End Up With

In practice, the systems I've built rarely pick one paradigm exclusively. The pattern that shows up again and again:

Traditional core, serverless edges

An always-on service (containers on ECS/GKE/a plain VM fleet) handles the steady-state hot path — the main API, the database-heavy reads, anything latency-sensitive. Serverless functions sit around the edges for exactly the workloads they're built for: webhook ingestion, scheduled cron jobs, thumbnail generation on upload, PDF exports, one-off data backfills. Each piece runs on the paradigm that fits its actual traffic shape instead of forcing one model onto the whole system.

This isn't a compromise — it's usually the more disciplined design. It forces you to actually think about which parts of your system are spiky and which are steady, instead of defaulting to whatever's trendy for everything.

What I Tell Teams Asking Me to Decide

  • Measure your actual traffic shape before picking a paradigm — don't guess, pull the numbers.
  • If you don't know your sustained volume yet (pre-launch), start serverless — the downside of switching later is smaller than the downside of over-provisioning for traffic that never shows up.
  • If you're migrating an existing system with known, steady load, model the cost at your real request volume before assuming serverless is cheaper — run the numbers, don't trust the pricing calculator's default assumptions.
  • Keep your business logic decoupled from provider-specific trigger code so you can move the boundary later without a rewrite.

The Honest Closing

There is no universal best practice here, and anyone who tells you otherwise is generalizing from one system. Serverless and traditional backends aren't competing philosophies — they're tools tuned for different traffic shapes and different team constraints. The job isn't to pick a side; it's to be honest about your actual traffic pattern, your team's ops capacity, and your latency requirements, and let those numbers make the decision for you.

PreviousDesigning for Scale: Lessons from Serving Millions of RequestsNextBuilding a Multi-Agent System from Scratch: Architecture Patterns

Continue Reading

Explore more articles on software engineering and technology

Cloud & Architecture

Designing for Scale: Lessons from Serving Millions of Requests

What actually breaks first when traffic grows 100x — caching layers, database contention, and the architecture decisions that are cheap to make early and expensive to retrofit later.

15 min read
Read
Development

The Developer Tools I Built for Myself (and Why)

A tour of the free calculators and dev utilities on this site — why I built each one, the itch it scratched, and what I learned shipping a dozen small tools instead of one big product.

10 min read
Read
AI Agents

Building a Multi-Agent System from Scratch: Architecture Patterns

Orchestrator-worker, blackboard, and pipeline patterns for coordinating multiple AI agents — with the failure modes that only show up once you go past a single-agent demo.

11 min read
Read