Maybe there are some "user" features (login, logout, change name) and "cart" features (add/remove item in cart).
These features would all live horizontally, be able to call each other (design your object graph wisely!) and would never be able to inspect or elaborate on implementation details!
These features may or may not talk to some database for its own persistence, but that's up to the functions.
And the features are pure functions in your language of choice. They have no knowledge of the web, or requests, they're perfectly transient. They act on a "state" object that you pass around to them, which in tests is just a blob of memory and in production is a real database or wherever else you store state.
It's simple, yet so powerful. This is how we do it, and it's scaling very nicely.