Publication date: February 2025
Source: Journal of Informetrics, Volume 19, Issue 1
Author(s): Savina Kirilova, Fred Zoepfl
There seems to be a lot of contention lately about whether you should go all-in on the cloud or to keep things as simple as possible. Those on the side of “build for the cloud” often frame this as cloud-native. By that, I believe they mean you should look at every single service offered by your cloud provider when architecting your application and the bigger the better.
“What is the opposite of cloud-native?”
In this essay, I’ll define a new term for the modern opposite of cloud-native. I think you’ll find it appealing.
Those on the cloud side look back at the dark days of running physical servers with monolithic applications directly on your hardware at your location. These apps were often little more than just a single application and a huge local database. Maybe they were even client-server desktop apps (gasp!).
If you’re not up on things, you’re not cloud-native. You’d probably do what they call “lifting-and-shifting” your app to cloud. Did you have one huge server in the office? Well, now you get one huge server in AWS EC2 and copy your app to it. You also pay extreme prices for that privilege. You’re really not with the times, are you?
This is not the opposite of cloud-native. The fallacy here is comparing two modes of running applications disjoined across time. Cloud-native is one view of how to build apps in 2024. This other alternative way, a view how to run your own apps in 2001. It’s not fair nor constructive.
I recently watched a livestream about moving out of AWS. So many people participated in the conversation were contrasting two worlds: Cloud vs. On-prem. Either you run in AWS/Azure or you build a data center, you string ethernet cables, you buy a backup generator, you hire a couple of engineers to keep these running when things like hard drives fail.
What? No. This is not the alternative.
The conversation was about a company moving into another managed data center. They have the generators. They have ethernet. It’s not cloud or build your own data center in 2024. Please do not let people drag you into these false dichotomies.
You should be wary of these merchants of complexity. These hyperscale clouds want you to buy in fully to all their services. The amount of lock-in this provides is tremendous. Once your bill leaps far beyond what you expected, it’s tough to change course.
Consider that insane diagram at the top of this essay. You have a little tiny bit in the center labeled Flask. It is surrounded by every cloud-native service you might want. One portion of our app might need to scale a bit so lambda/serverless functions. We broke our single Flask-based API into 100 serverless endpoints, so we now need something to manage their deployment. What about logs and monitoring? Across all these services? We need a few log services for that. And we may need to scale the Flask bit so Kubernetes! And on it goes.
I present to you stack-native.
“Stack-native is building your app with just enough full-stack building blocks to make it run reliably with minimal complexity.”
This is what it looks like when displayed at the same scale as our cloud-native diagram:
It’s a breath of fresh air, isn’t it? But let’s zoom in so you can actually see it!
What do we have in this stack-native diagram?
That’s it. And everything in that picture is free and open source. It’s running on a single medium-sized server in a modern but affordable cloud host (e.g. Digital Ocean or Hetzner).
Is this lifted-and-shifted? I don’t think so. It’s closer to Kubernetes than to old-timey client-server on prem.
Do you have to buy a generator? Run ethernet? Fix hardware? Of course not, it runs in a state-of-the-art data center with global reach. It’s just not cloud-native. It’s stack-native and that is a good thing.
No. We have a very similar setup powering Talk Python, the courses, the mobile APIs, and much much more. Across all our apps and services we receive about 9M Python / database backed requests per month (no caching because it’s not needed). And we handle about 10TB of traffic with several TB straight out of Python.
Here’s the crazy part. All of our infrastructure is running on one large server in a US-based data center from Hetzner. We have a single 8 CPU / 16 GB RAM server that we partition up across 17 apps and databases using docker. Most of these apps are as simple or simpler than the stack-native diagram. For this entire setup, including bandwidth, we pay $65/month! That’s $25/mo for the server and another $40 for bandwidth.
I just finished doing some tentative load testing using the amazing Locust.io framework. At its peak, this setup running Nginx + Granin + Python + Pyramid + MongoDB would handle over 100M Python requests / month. For $25.
In contrast, what would this setup cost in AWS? Well, the server is about $205 / month. The bandwidth out of that server is another $100/mo. If we put all our bandwidth through AWS (for example mp3s and videos through S3) the price jumps up by another whopping $921. This brings the total to $1,226/mo.
The contrast is stark. If we chose cloud-native, we’d be tied into cloud-front, EKS, S3, EC2, etc. We’d have to pay the high prices because that’s the way you use the cloud, you noobie.
But stack-native can move. We can run it in Digital Ocean for a few years as we did. When someone like Hetzner opens a data center in the US with 1/6th pricing, we can take our setup and move. The hardest part of this is Let’s Encrypt and DNS. There is nearly zero lock-in.
I plan on writing a whole series on this topic focused on this topic. Please consider subscribing to the RSS feed here or joining the mailing list at Talk Python.
If this article made you think or you just want to share your thoughts, here are a few places with comments you could jump (no comments directly on my blog):
This article revisits André Gide's emblematically modernist novel, Les faux-monnayeurs (1925; The Counterfeiters), by reevaluating the importance and significance of the setting at the center of the narrative: the “pension Azaïs-Vedel,” a Protestant educational institution around which all the novel's characters—mostly adolescents—gravitate and all the subplots converge. It shows how Gide's choice of setting responded to the “quarrel of classicism,” which reconfigured the French literary field at the turn of the twentieth century, superimposing the political, the aesthetic, and the religious and connecting the question of literary form with that of the formation of French youth. The article also reassesses the survival of religion in twentieth-century French literature, and in particular the enduring religiosity inflecting both political modernity and modernist aesthetics.