Before we built Fly, I spent a huge amount of time trying to bend CDNs to my will. Fastly's surrogate keys are pretty good _if_ you define a good HTTP cache schema and if every request is worth caching.
My general takeaway was that HTTP is a terrible interface for "programming" things. Worse, the whole stack was difficult to test and inflexible to iterate on. And the apps I've found myself wanting to build lately rarely serve the same HTML twice.
You may find differently, but I strongly believe "just run your app and DB, no other layers" is the simplest possible way to do most full stack work.