Scalability is ability of a system to either handle increases in load without impact on the performance of the system, or the ability to be readily enlarged.
There are two methods for improving scalability: scaling vertically (scale up), and scaling horizontally (scale out).
- To scale vertically, you add more resources such as CPU, memory, and disk to a single system.
- To scale horizontally, you add more machines to a farm that runs the application and shares the load.
Points to be considered:
- You may decide to locate logical layers on the same physical tier to reduce the number of servers required while maximizing load sharing and failover capabilities.
- Consider partitioning data across more than one database server to maximize scale-up opportunities and allow flexible location of data subsets.
- Consider elastic scalability.
- Avoid stateful components and subsystems where possible to reduce server affinity.
- Reduce delays in response and longer completion times.
- Async communication over sync communication.
- Implement store-and-forward or cached message-based communication systems that allow requests to be stored when the target system is unavailable, and replayed when it is online.
- Consider patterns mentioned for Performance attributes.