Initially we had a web server (two actually, to achieve zero-downtime deploys) and a database.
A few months later, we introduced Redis for caching. This was much earlier than I expected we'd need to - these days as soon as a web app gets traction, it starts attracting scammers, spammers, and manipulators who put unexpected load on your system.
Just this week, we've finally added a worker server to run long running tasks. Until this week, Java's brilliant Executors were handling this for us in a background thread.
A Java uberjar, deployed to AWS's Elastic Beanstalk, is an approach I'd highly recommend for anyone wanting to get version 1 of their web app deployed.
I suppose I may be overcomplicating things with trying to do it "the right way" right out of the gate. I guess the "perfect is the enemy of done" saying comes into play here.
For learning web app APIs all I did was search Google Scholar for 'API design' and read whatever was available. Joshua Bloch has a good paper on API design. As for scaling, containers, concurrency ect look at Elixir w/Phoenix framework instead, or Erlang w/Yaws and just run it on a cheap FreeBSD comanaged box or deploy Phoenix to Heroku. BEAM will take care of the scaling. There's books around https://pragprog.com/book/lhelph/functional-web-development-...
I'm a mobile dev developing an app that I think I'm going to quit my job for to work on full time. I'm 33 and in over a decade of doing mobile (and front-end web) programming I've never worked on a personal project that showed as much promise as this one has for me, both financially and from a fulfillment standpoint.
However the prospect of wrangling the back-end and all the new things I need to do around deploying, scaling, containers, separation of services: cache, API, queue, DB, and making it all secure on top of that is giving me pause and making me less confident the more I read :(