Splitting a Monolith
Now that we know which components are consuming the most resources and taking the most time, how should we split them up?
It's already possible to move several components in our service to separate servers. RabbitMQ, Celery, and the database all communicate over the network, and so while there are a lot of steps to setting up new servers and configuring them, it is a well-understood process to install those hosts and update our application to use new URLs. This lets our API concentrate on handling network connections and moves the larger tasks to their own workers.
A developer must also consider setting up network security, accounts, access control and other concerns relating to running and securing a service.
The parts of our own application are trickier: we call functions to invoke our own features, and we will need to call a REST API instead. Should this be done using one large deployment and all the changes in one go? Should...