Designing Data-Intensive Applications: Chapter 1 Notes
Note: These are just brief chapter notes for a book club i'm doing right now with a pal :~) Use at your own discretion o.o
Chapter 1: Reliable, Scalable, and Maintainable Applications
Main Concerns of Software Systems
- Reliability
- system should continue to work correctly even in the face of adversity
- Scalability
- as system grows in data volume, traffic volume, and complexity, there should be reasonable ways to deal with that growth
- Maintainability
- everyone should be able to maintain and adapt the system productively
Reliability
- What role do humans play in regards to reliability?
- Fault != Failure
- Faults are one component of the system that deviates from spec, failures are when the system as a whole stops providing the required service to the user
- Can't completely prevent faults from causing failures, strive for fault tolerance
- Ex:
- Hardware Faults - platforms prioritize flexibility and elasticity over single machine reliability as VM's tend to go down
- Software Errors - usually lie dormant until triggered
- Human Errors - humans are unreliable, decouple where you can make mistakes from places that can cause failures
Scalability
- How do you create parameters and requirements for application load and performance?
- Describing load with load parameters depends on the system architecture, such as requests per second to the web server.
- Queuing delays account for large part of response time at high percentiles
- How do you plan for the future?
- Even if reliable today, not guaranteed system will be reliable in the future
- How do you plan to cope with an increased load?
- Vertical scaling - more powerful machines
- Horizontal scaling - distributing load across multiple smaller machines
- elastic systems- automatically add computing resources when increased load is detected
Maintainability
- How to manage system complexity as ongoing maintenance is expensive
- Operability- make easy to keep system running smoothly
- Simplicity - make easy to understand
- Evolvability- easy to make changes in the future, extensible
- Abstraction aids with removing accidental complexity