Scenario : A system that caters large number of users with a web front-end and a mobile app.

Things to consider

  • Choice of Database

    • For most cases relational database like MySQL would work
    • Things to consider when going for NoSQL
      • Application requires super law latency
      • Unstructured data or data has no relations
      • Need to store a massive amount of data
  • Scale the application tier

    • Decide whether horizontal or vertical scaling
    • Vertical scaling is limited by CPU, Memory, Space and cost
    • Horizontal scaling require adding new components like load balancers and changing the application to be able to share load
  • Scale the database (Database Scaling)

    • Database Replication
    • Database Sharding
  • Use Caching and CDN for static assets

    • Avoid frequent calls to database
    • Improve performance
  • Make the application/web tier stateless

    • Mitigates issue with stateless web tier/sticky sessions
    • Easier horizontal scaling
  • Support multiple data centers

    • Geo Routing
    • Geo DNS
    • Disaster Recovery
    • Availability
  • Decouple the components and make processes async, Introduce message queues

    • RabbitMQ
    • Kafka

References:

  • System Design Interview – An insider’s guide, Second Edition - Alex Xu