What is System Design – Learn System Design
System Design is the core concept behind the design of any distributed systems. System Design is defined as a process of creating an architecture for different components, interfaces, and modules of the system and providing corresponding data helpful in implementing such elements in systems.
System Design involves identifying sources of data, It is an intuition towards characterizing, creating, and planning a framework to fulfill the necessity and indeed the prerequisites of particular businesses.
Why learn System Design?
In any development process, be it Software or any other tech, the most important stage is Design. Without the designing phase, you cannot jump to the implementation or the testing part. The same is the case with the System as well.
System Design not only is a vital step in the development of the system but also provides the backbone to handle exceptional scenarios because it represents the business logic of software.
From the above SDLC steps, it is clear that system design acts as a backbone because no matter how good the coding part is executed, it, later on, becomes irrelevant if the corresponding design is not good. So here we get crucial vital information as to why it is been asked in every Product Based Company.
Objectives of System Design
- Practicality: We need a system that should be targetting the set of audiences(users) corresponding to which they are designing.
- Accuracy: Above system design should be designed in such a way it fulfills nearly all requirements around which it is designed be it functional o non-functional requirements.
- Completeness: System design should meet all user requirements
- Efficient: The system design should be such that it should not overuse surpassing the cost of resources nor under use as it will by now we know will result in low thorough put (output) and less response time(latency).
- Reliability: The system designed should be in proximity to a failure-free environment for a certain period of time.
- Optimization: Time and space are just likely what we do for code chunks for individual components to work in a system.
- Scalable(flexibility): System design should be adaptable with time as per different user needs of customers which we know will keep on changing on time. The best example here out is the well-known firm: Nokia. It is the most important aspect while designing systems and is the result of why 1 of 100 startups succeed over the long run, the best example here out is GeeksforGeek.
Note: System Design also helps us to achieve fault tolerence which is ability of a software to continue working where even its 1 or 2 component fails.
Now after glancing and going through the above objectives let us not discuss the advantages of system design to understand it better as the below advantages get our understanding even closer to real-life.
System Development Life Cycle
Any system doesn’t get designed in a single day or in a single step. For every system design, there are a series of steps/phases/stages that takes place to get a strong system. This series is defined as System Development Life Cycle (SDLC). We need a strong understanding of understanding life-cycle of a system just likely to define the scope for any variable in code chunk because then only we will be able to grasp deep down how humongous systems are interacting within machines in the real world.
The stages in System Development Life Cycle are as follows:
Components of System Design
Below are some of the major components of the System Design. discussed in brief. The detailed version of this will be discussed in different posts:
- Load balancers: Most crucial component for scalability, availability, and performance measures for systems.
- Key Value Stores: It is a storage system similar to hashtables where key-value stores are distributed hash tables.
- Blob Storage: Blob stands for binary large objects, as the name suggests is storage for unstructured data such as YouTube, and Netflix.
- Databases: It is an organized collection of data so that they can be easily accessed and modified.
- Rate Limiters: These sets the maximum number of requests a service can fulfill.
- Monitoring System: These are basically software where system administrator monitor infrastructures such as bandwidth, CPU, routers, switches, etc.
- Distributed System Messaging Queue: Transaction medium between producers and consumers.
- Distributed Unique ID generator: In the case of large distributed systems, every moment multiple tasks are occurring so in order to distinguish it assign a tag corresponding to every event.
- Distributed Search: Over every website, crucial information that visitors will seek is put into the search bar.
- Distributed Logging Services: Tracing sequences of events from end to end.
- Distributed Task Scheduler: Computational resources such as CPU, memory, storage, etc.
Software architecture is a way in which we define how the components of a design are depicted design and deployment of software.
It is basically the skeleton design of a software system depicting components, abstraction levels, and other aspects of a software system. In order to understand it in a layman’s language, it is the aim or logic of a business should be crystal clear and laid out on a single sheet of paper. Here goals of big projects and further guides to scaling up are there for the existing system and upcoming systems to be scaled up.
System Architecture Patterns
There are various ways to organize the components in software architecture. And the different predefined organization of components in software architectures are known as software architecture patterns. A lot of patterns were tried and tested. Most of them have successfully solved various problems. In each pattern, the components are organized differently for solving a specific problem in software architectures.
Different types of Software Architecture Patterns include:
- Layered Pattern
- Client-Server Pattern
- Event-Driven Pattern
- Microkernel Pattern
- Microservices Pattern
Modularity and Interfaces In System Design
- Modular design refers to a method/procedure for product design involving integrating or combining smaller, independent elements to create a finished product. A large product (like a car) can be separated into smaller, simpler components that are separately developed and produced using the modular design approach. The ultimate product is created by integrating (or assembling) each of these component parts.
- Interfaces In System Design is the area where users interact. It consists of the screen displays that facilitate system navigation, the screens and forms that gather data, and the system’s reports.
Evolution/Upgrade/Scale of an Existing System
With the increase in tech usage, be it offline or online, it is now a must for every developer to design and create a scalable system. If the system is not scalable, with the increase in users, it is very likely that the system will crash. Hence the concept of scaling comes into play.
Suppose there is a system with configurations of specific disk and RAM which was handling tasks. Now if we need to evolve our system or scale up, we have two options with us.
- Upgrade Specifications of existing system: We are simply improving the processor by upgrading the RAM and disk size and many other components. Note that here we are not caring about the scalability and availability of network bandwidth. Here as per evolution we are working over the availability factor only considering scalability will be maintained. This is known as vertical scaling.
- Create a Distributed System by connecting multiple systems together: We see above that if scalability is not up to mark then we need multiple systems for this measure as availability measures do have a limitation. In order to scale up, we need more systems (more chunks of blocks) and this is known as horizontal scaling.
How Data Flows Between System
Data flows between systems through Data Flow Diagrams or DFDs.
Data Flow Diagrams or DFDs is defined as a graphical representation of the flow of data through information. DFD is designed to show how a system is divided into smaller portions and to highlight the flow of data between these parts.
Here’s an example to demonstrate the Data Flow Diagram’s basic structure:
Components of a DFD:
|Square||Defines the source of destination of data|
|Arrow||Identifies data flow and acts as a pipeline throughwhich information flows|
|Circle/Bubble||Represents a process that transforms incoming data flow into outgoing data|
|Open Rectangle||It is a data store or data at rest/temporary repository of data|
Note: Sender and Receiver should be written in uppercase always. Rather it is good practrice to use uppercaswe letter what so ever is placed in square box as per DFD conventions.
System Design Example: Airline Reservation System
Now since we have discussed about the basics of System Design so far, let us now understand System Design through a basic example – Airline Reservation System.
To understand better about the components and design of Airline Reservation System, let us first review its context-level flow diagram:
Let us now understand the DFD of the Airline Reservation System:
- In the above flow diagram, Passenger, Travel Agent, Airline are the sources across which data is migrating.
- Here data is transmitted from Passenger to book an Airline ticket as shown with the DFD arrow sign where the travel request is placed.
- Now, this data is transmitted across two sources, as shown above, namely ‘Travel Agent‘ and ‘Airline‘ where if the seat is available Preferences and Air Flight request is placed to the source.
- Travel Agent and corresponding Ticketing are placed as requested.
- If no ticket is available, then a request for Passenger Reservation is placed to the source – Airline.
Advantages of System Design
Upon detailed discussion of the introduction to system design, it is a must now to discuss its merits and demerits.
The greatest advantage of system design is inculcating awareness and creativity in full-stack developers’ via synergic bonding of API protocols gateways, networking and databases.
Some of the major advantages of System Design include:
- Reduces the design cost of a product.
- Speedy software development process
- Saves overall time in SDLC
- Increases efficiency and consistency of a programmer.
- Saves resources