What 'backend architecture' really means
Most framework debates conflate three independent layers: language runtime, HTTP framework, and deployment model. Separate them and clarity follows.
When people argue 'Django vs FastAPI vs Next.js', they're usually mixing up three different things: the framework (routing, middleware, conventions), the runtime (Python sync, Python async, Node.js, Go…), and the deployment model (long-running server, container, serverless function). These are independent choices.
Every backend, at its core, does the same thing: receive an HTTP request → route it to some code → talk to a database → return a response. What differs is HOW each layer is structured and what conventions the framework imposes on you.
Three axes to compare any backend meaningfully: (1) concurrency model (how it handles many requests at once), (2) framework style (batteries-included vs minimal vs full-stack JS), (3) deployment target (long-running process vs serverless vs edge). These explain 90% of 'why does X feel different from Y'.
Example of how mixing layers confuses things: 'Django is slow' is almost never a fact about Django — it's usually about a blocking DB query, a thread-per-request model overwhelmed by concurrency, or an N+1 ORM pattern. The framework code itself costs microseconds; the stuff around it costs milliseconds.
The mental model: stop looking for 'the best backend'. Start asking 'what combination of runtime + framework + deployment fits THIS workload and THIS team?'. Every choice is a trade-off across those three axes.
Grounded on https://martinfowler.com/architecture/
Next up
Concurrency models — threads, events, goroutines
How a backend handles many simultaneous requests. Thread-per-request, event loop, goroutines, worker pools — each has radically different scaling ceilings.