Scalability is the property of a software system to be able to handle a growing amount of work. For instance, more users and/or more requests in a given period of time. Furthermore, there are different ways to achieve scalability and there are also contrasting ways to scale.
- Scalability dimensions
- Types of scalability
- Software qualities required to achieve scalability
- Modularity
- Service statelessness
- Scalable infrastructure
- Efficient resource utilization
- Deployability – automated deployment
- Provisioning – automated provisioning
- Testability – ability to test in continuous integration pipelines
- Fault tolerance
- Monitoring and observability
- Documentation and knowledge management
- Closing remarks
Scalability dimensions
There are different types of scalability, also called dimensions in Wikipedia.
- Administrative
- Functional
- Geographical
- Heterogeneity
- Load scalability
Administrative scalability
Ability of an increasing number of organizations, business units and/or users to access the system. As the company grows, as the service you offer sells more user subscriptions/memberships; admin burden increases. Having built-in ways to manage this extra load, it is called administrative scalability.
Functional scalability
Ability to keep adding features without disrupting existing functionality. There is an excellent manner to understand if your software is successful, new features keep being requested and growing. The ability to add new features without impacting existing ones, in parallel without affecting different streams of work, is called functional scalability.
Geographical scalability
Ability to expand to new cities, new areas, new countries without losing performance and efficiency.
Heterogeneity
Ability to keep expanding the distributed system using different hardware’s, operating systems, software vendors, etc.
Load scalability
Ability for a software system to accommodate higher and lower loads with ease. This is the most widely known understanding of software systems scalability and the focus for the rest of the article.
Types of scalability
There are 2 main types of scalability. Scaling out, also known as horizontal scalability, and scaling up, or vertical scalability. Additionally, these 2 types can be combined in a hybrid scalability.
Scaling up or vertical scalability
Vertical scaling involves adding resources to a single node, typically involving the addition of CPUs, memory or storage to a single computer. This will inevitably end up having a cap at some point due to hardware limitations. However, it is “easier” while there is the opportunity to keep adding resources to the same node.
Scaling out or horizontal scalability
This way of scaling refers to adding more nodes in a distributed system. For instance, you have a load balancer with 2 nodes running, and you add one more node. This technique allows your system to grow and shrink without impacting running instances.
Hybrid scalability
Hybrid scalability refers to a combination of the prior 2 methods, in which some services scale horizontally and some others vertically. In essence, some approaches used as appropriate.
Software qualities required to achieve scalability
There are key software qualities that need to be considered to ensure a successful scalability of software systems. These qualities are generic and will need to be adjusted to particular circumstances and needs. As a result, a well-designed architecture ensures that scaling can be performed without significant rework. They should not be confused with Software Quality in Software Engineering as explained in this article.
- Modularity
- Service Statelessness
- Scalable infrastructure – able to add/remove nodes
- Efficient resource utilization
- Deployability – automated deployment
- Provisioning – automated provisioning
- Testability – ability to test in continuous integration pipelines
- Fault tolerance
- Monitoring and observability
- Documentation and knowledge management
Modularity
The software should be designed with a modular approach based on low coupling (classes on one module do not know about others in other modules) and high cohesion (objects that have related responsibilities are close together), allowing components to be added, removed, or modified independently. Modularity helps in isolating changes and minimizing the impact on other parts of the system during scaling.
Service statelessness
Not keeping data state in services to be able to add/remove nodes as needed for horizontal scaling. A classic case is keeping customer data in HTTP sessions to know about the customer across requests. If you do that, then it is hard to remove nodes from the cluster, making it hard to scale up/down.
Scalable infrastructure
Infrastructure that is easier to add/remove nodes and/or add/remove resources from each instance.
Efficient resource utilization
The software should utilize system resources efficiently to avoid wastage. This involves optimizing algorithms, minimizing resource contention, and managing memory, CPU, and network usage effectively. Efficient resource utilization ensures that scaling operations do not lead to unnecessary overhead or bottlenecks.
Deployability – automated deployment
Automated deployments allows your system to be deployed without human intervention and usually in seconds or faster. For this to happen, deployables need to ready or shippable before hand.
Provisioning – automated provisioning
The software should support automated deployment and provisioning processes. Automation reduces the complexity and time required to scale the system. Techniques like containerization, infrastructure-as-code, and configuration management tools can facilitate efficient deployment and provisioning of resources.
Testability – ability to test in continuous integration pipelines
Thorough testing and validation are crucial to ensure scalability. Load testing, stress testing, and performance testing help identify system limitations, bottlenecks, and ensure the software can handle increased loads. Robust testing practices enable developers to address scalability issues before they become critical.
Fault tolerance
The software should be resilient to failures and capable of recovering gracefully. This includes incorporating mechanisms like fault tolerance, error handling, and redundancy to ensure uninterrupted operation during scaling events. Fault-tolerant systems can handle failures or performance degradation without causing severe disruptions.
Monitoring and observability
The software should provide robust monitoring capabilities to track system performance, resource usage, and bottlenecks. Real-time monitoring and performance management tools help identify scalability issues, bottlenecks, and areas that require optimization. Proactive monitoring enables the system to scale up or down promptly as needed.
Documentation and knowledge management
Adequate documentation and knowledge management practices should be in place to capture system architecture, deployment procedures, and operational guidelines. Well-documented software assists in smooth scaling by providing clear instructions, troubleshooting steps, and insights into the system’s behavior.
Closing remarks
By considering these software qualities during the design, development, and maintenance phases, organizations can enhance the scalability of their software systems and minimize issues during scaling operations.