In order to make our system be highly available, reliable, scalable, and produce high throughput, we must design a system that is:
- Resilient/Durable: Able to sustain component failures
- Elastic: Each service and resource can grow and shrink quickly based on demand
Such systems can be achieved by breaking monolithic applications into many smaller stateless components (following the microservices architecture) and deploying them in a cluster.
Instead of having a monolithic code base that caters to many concerns, you can instead break the application down into many services which, when working together, make up the whole application. Each service should:
- Have one or very few concerns
- Be de-coupled from other services
- Be stateless (if possible)
With a monolithic application, all the components must be deployed together as a single unit. if you want to scale your application, you must scale by deploying more instances of the monolith. Furthermore, because there...