We all love to think about building a system from scratch and implementing tons of features. As a beginner, it is easy to get overwhelmed by the "jargon" or technical terms of system design. I am a beginner. I have decided to write a series of blogs on various concepts of system design so that folks like me can find it easy to understand.
In today's article, we will discuss the most fundamental and probably one of the important decisions, i.e Scaling. So without wasting any time, let's get started.
What is Scaling?
At its core, scaling is all about increasing a system's capacity to handle more load. This load can take many forms, such as user traffic, data storage, or processing requirements. When a system is initially designed and built, its capacity is determined by factors such as the hardware and software configurations used.
However, as usage of the system grows over time, it may become necessary to expand its capacity to handle the increased load. Scaling is the process of doing just that - adding resources to a system to increase its capacity and improve its performance. There are two main types of scaling: horizontal scaling and vertical scaling. Let's take a closer look at what these terms mean and how they differ.
Vertical scaling, also known as "scaling up," involves adding more resources to a single machine or server to increase its capacity. This can involve upgrading components such as the CPU, memory, or storage, or adding more powerful hardware to the system.
Let's try to relate it to a real-life scenario. Suppose you have a bakery with a single chef and one oven. In the start, everything was fine but with time, more people started visiting your bakery and business is booming! As more people come, you start taking more time to serve them because you have only one chef and one oven
One of the ways to improve your performance is to make the cook work extra hours by increasing his salary and instead of using a 3-litre oven, use a 6-litre oven. This is vertical scaling. You are increasing the capacity/working power of the current resources that you have.
Horizontal scaling, also known as "scaling out," involves adding more machines or servers to a system to increase its capacity. This can involve adding more instances of the same machine or adding different machines with similar hardware configurations.
With horizontal scaling, the workload is distributed across multiple machines, allowing the system to handle more load by adding more resources.
Let's consider the same bakery and the same scaling scenario. This time, instead of giving more workload to the chef and increasing the capacity of a single oven, we decide to hire 2 more chefs and buy 2 more 3-litre ovens. This is horizontal scaling Here, we decided to add more resources instead of adding more burden on current resources.
Pros & Cons
High performance: Vertical scaling can provide high performance and low latency, as the system can handle larger workloads with fewer resources.
Simplified management: Vertical scaling can be easier to manage than horizontal scaling, as all resources are contained within a single machine or server.
Faster than horizontal scaling because of interprocess communication. Resources in horizontally scaled systems communicate via network calls which is slower.
Limited scalability: There are limits to how much a single machine can be scaled up, and once those limits are reached, further scaling is not possible without significant changes to the system architecture.
Expensive: Vertical scaling can be expensive compared to other scaling strategies, as it often requires the purchase of high-end hardware components.
Single point of failure: Vertical scaling can create a single point of failure, as the entire system's performance relies on a single machine or server. If that machine fails, the entire system may become unavailable.
High scalability: Horizontal scaling is highly scalable, as it involves adding more machines or servers to a system as demand grows, allowing for virtually limitless expansion.
Cost-effective: Horizontal scaling can be more cost-effective than vertical scaling, as it allows for the use of commodity hardware, which is often less expensive than high-end components.
Redundancy: Horizontal scaling can provide redundancy and fault tolerance, as multiple machines can be used to distribute the workload and provide backup in case of machine failure.
Increased complexity: Horizontal scaling can be more complex to manage than vertical scaling, as it involves managing multiple machines and coordinating their activities.
Network congestion: Horizontal scaling can introduce network congestion, as data must be transmitted between machines, which can create bottlenecks and slow down performance.
Data consistency: Maintaining data consistency can be a challenge with horizontal scaling, as data must be replicated across multiple machines, and synchronization issues can arise if data is updated on one machine but not on others.
What is used in the real world?
In the real world, both vertical and horizontal scaling strategies are used, depending on the specific requirements of the system being built. In general, vertical scaling is often used for applications that require high performance and low latency, such as financial trading systems or scientific simulations. Horizontal scaling is often used for applications that require high scalability and redundancy, such as e-commerce websites or social media platforms.
Many modern systems use a combination of both strategies, using vertical scaling to improve performance on individual machines and horizontal scaling to provide scalability and redundancy across multiple machines.
Ultimately, the choice of scaling strategy will depend on a variety of factors, including the specific requirements of the system, the available resources, and the expertise of the development team.
With this, we conclude today's article. We discussed scaling, different types of scaling and what is used in the real world. I hope you learned something new today.
You can appreciate and support my blogs via.
Also, let's connect on Twitter. Follow CSwithIyush for more amazing tutorials, tips/tricks on programming.