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.