System Design

Below are some key architectural concepts to take into account while building systems. I borrowed most of these concepts from the book “think like amazon by John Rossman” who had borrowed these from “Paul Tearnen”. The explanations of these concepts are mine.

  • Scalability: Ability to quickly increase system throughput and capacity.
  • Security: Manage authentication and data security.
  • Flexibility: Multipurpose and transformable to handle multiple use cases.
  • Interoperability: Ability to easily integrate with external systems via well defined APIs.
  • Observability (my own):
    • Monitoring: Monitor the health of the system to identify issues before they arise. And also report monitoring traces so system behavior over a period can be observed.
    • Traceability: Ability to explain system behavior via event logs and audits that help link the distributed flow of data.
  • Extensibility: Ability to extend the system to cater to future business needs with low cost and time.
  • Reusability: Reusability of sub components for multiple scenarios across systems. Inside system code reuse via modularization.
  • Reliability (my own): Ensure consistency of data in a distributed architecture. Consistency can be serializable or eventual based on use case. Based on the use case appropriate system consistency should be guaranteed.
  • Modularity: Creating modular systems with low coupling and high cohesion.
  • Testability (my own): System should have good unit test , integrated tests and regression tests coverage to ensure high quality.
  • Deployability (my own): Code release processes should be engineered to have systematic code review, testing and regression processes to enable simple and verifiable deployments.
  • Stability: The ability of the core architecture to withstand new requests and changes. On an infrastructure side stability entails ensuring redundancy and failover.
  • Availability: Ability to respond immediately via low latency.

See various articles on system design below.