Let’s talk a little about systems architecture. Specially about scalability.
First of all: do you know what scalability is? Accordingly to the book “Characteristics of scalability and their impact on performance”, scalability is the “capability of a system, network, or process to handle a growing amount of work, or its potential to be enlarged in order to accommodate that growth“.
I agree partially! I would go further and tell that your system should be able to handle more work and even less work, what could be called a downsize. This concept of scalability is also known as elasticity.
Well, but this is not the point here! 😉
So if I need to scale my application somebody could ask me if would do a Horizontal or a Vertical scale. What should I answer?
Horizontal scalability is when you add another servers in your architecture. Usually for one or more of these reasons:
- Distribution: you can use more servers to make your application more distributed. You can do it by splitting it by modules, or by micro services, or by tiers (example: web tier, business tier and data tier);
- Clustering: you add more servers to share the work between them;
- Load balancing: maybe you already has a distributed application or you already use a cluster, but you want add more servers to not only share the work, but also balance the load between them.
In this type of scalability you can use any type of server “size”, depending on what you need. For some very specific uses you may not need a huge processing, memory or things like this.
Horizontal scalability is type that most fits for elasticity as you may want to add or remove servers depending on your needs.
Vertical scalability is when you “grow” your server instead of getting another one. You can grow your server by increasing its:
- Core processing
- Video processing
- Data processing
- Data storing
In this type of scalability you usually will grow your server and rarely would “downsize” it. It fits better on situations where you have a very specific service or task running in one single server and need to improve it.
Also fits to systems that were not built for being distributed, clustered or balanced.
Mixing them both
You may want to mix the two types! For example, you use the Horizontal type and add more servers, but one of the server need to be upgraded for better results so you apply the Vertical type on it.
So, what do you think? Do you know another ways of scaling applications? Share with me at the comments!