System design questions have become a staple of the software engineering and CS interview process. The main objective of this round is to assess a candidate's aptitude for developing a sophisticated system on a wide scale. Many developers and engineers have trouble with this round since they lack expertise in developing large-scale systems. The design issues cannot be accurately and uniformly solved. The same question could get different responses from various interviewers. Since this round is so open-ended, experienced engineers and junior and mid-level developers need help to participate.
Coding is not heavily stressed in this round. The interviewer is interested in learning how you designed and connected the system. Before you start putting together a response to a particular topic, you need to be familiar with some fundamental system design concepts for interviews. To lay a solid foundation for the issues in this round, we'll go over some fundamental concepts in system design and coding.
Balance of loads
A server's capacity in a system determines how much load or user request it can manage. A server's throughput is diminished, and it may be sluggish if it is concurrently subjected to more requests than it can handle. If it continues for a longer time, it can also fail (be unavailable). By dividing the volume of requests among more servers, you can overcome this problem by adding more servers (horizontal scalability). Who will be responsible for allocating the requests and balancing the load is now a question. Who will make the decision about which requests should be sent to which server to distribute the workload among multiple servers? The load balancer's function is now apparent.
A load balancer's job is to distribute traffic to numerous distinct servers to aid with throughput, speed, latency, and scalability. The load balancer can be deployed anywhere, including in front of the clients, and it will route incoming requests to various web servers as needed. Load balancers manage traffic and control the system's availability and throughput. Popular load balancers on the market include Nginx, Cisco, TP-Link, Barracuda, Citrix, and AWS Elastic Load Balancing.
Visi Learnbay’s DSA course to learn all you need to know before cracking your next IT interviews.
Caching
In the section on load balancing, we talked about the strain on the servers, but one thing you should be aware of is that your database server will often experience high loads due to a high volume of writes or reads before your web server does. The system's performance is slowed down when we frequently use the database for various queries and joins.
The best method to utilize is caching to manage these queries and many reads and updates.
For instance, do you visit your neighborhood store whenever you need anything for your kitchen? Without a doubt, we can buy and save certain essentials in our refrigerator and food cabinet instead of constantly going to the nearby supermarket. This is a cache. If the food is already in your refrigerator, cooking will take less time. Quite a bit of time is saved in this way. The system experiences the same things. Data access from primary memory (RAM) is quicker than data access from secondary memory (disk). Your system's performance can be accelerated by adopting the caching strategy.
If you frequently need to rely on a specific piece of data, cache it so you can obtain it from memory rather than the disc more quickly. This approach lightens the backend servers' workload. Network calls to the database are decreased thanks to caching. Memcache, Redis, and Cassandra are a few common caching systems. A large number of websites employ CDN (content delivery network), which is a vast server network. User access to static assets such as pictures, javascript, HTML, or CSS has sped up thanks to CDN caching. Caching can be implemented on the client (for example, in browser storage), between the client and the server (for example, with CDNs), or on the server itself.
Proxies
You may have noticed a notification on your computer asking you to add and configure proxy servers, but what actually are they, and how do they operate? Proxy servers are typically software or hardware that resides between a client and another server. It may be located between the clients and the destination servers, including the user's computer. A proxy server receives requests from clients, transmits them to the origin servers, and then returns the server's response to the client that made the request in the first place. When the server gets the request, the IP address may occasionally belong to the proxy server rather than the client.
Neither the client nor the server will be aware that a proxy is being used when using a "forward proxy," and neither will be aware of a "reverse proxy" when using one. In addition to serving as a gatekeeper, screener, load-balancer, and general helper for the main server, a "reverse proxy" can be given various responsibilities to complete.
Typically, proxies are used to process requests, filter requests, log requests, or occasionally change requests (by adding/removing headers, encrypting/decrypting, or compressing requests). It assists in coordinating requests coming from several servers and can be applied to optimize request traffic generally.
Want to master your System design and DSA skills? Head to the most popular data structures and algorithms course and learn on-demand with industry tech leaders.
CAP (Consistency, Availability, and Partition tolerance)Theorem
Because there are inherent trade-offs between the items, the theorem asserts that you cannot attain all of the properties at the best level in a single database. You can only select two options at once, and your decision will be entirely based on your priorities and requirements. You might have to tolerate some latency in your consistency requirements if, for instance, your system needs to be available and partition tolerant. Traditional relational databases naturally fit the CA side, while non-relational database engines primarily meet the AP and CP requirements.
The theorem states that you cannot achieve all properties in a single database at the best level due to the inherent trade-offs between the elements. Only two options may be chosen at once, and your priorities and needs will fully determine your choice. For example, if your system needs to be available and partition-tolerant, you may have to accept some latency in your consistency requirements. Traditional relational databases naturally meet the CA side's criteria, but non-relational database engines largely satisfy the AP and CP requirements.
Databases
It is normal practice to request that you create the database schema and specify which tables you intend to use while conducting system design interviews. How will your indices be structured, and what the primary key will look like? The many storage options (relational or non-relational) created for various use cases must also be selected. We'll review a few key database ideas frequently used in system architecture.
Database Indexing
Typically, database indexes are a data structure that makes it easier to search through databases quickly, but how? Let's use an illustration to clarify. Imagine that each record in a 200 million-row database table has one or two values that need to be looked up. Iterating across the table is necessary to obtain a value from a certain row, which might be time-consuming if it's the final record in the table. Indexing can be used to solve issues of this nature.
Replication
If your database is under such a load, what will happen? Since every request depends on the information in the servers, it will crash at some time, and your entire system will stop functioning. Replication, which basically entails copying your database (master) and limiting access to these replicas (slave), is how we avoid this kind of failure. The availability problem in your system is resolved by replication, which guarantees redundancy in the database in the event of a failure. How would you extract the data from the original (master) database if you had already constructed a copy (slave) of it? Given that they are supposed to contain the same data, how would you synchronize it among the replicas?
Using data partitioning or sharding
Data replication fixes the availability problem but not the performance and latency ones (speed). In those situations, you must share your database, simply "chunking down" or partitioning your data records and putting them on many machines. Therefore, sharding data separates your large database into several smaller databases. Consider Twitter, a platform where a lot of writing is done. Database sharding, in which the database is divided up into several master databases, can be used to solve this situation.
Want to work as a software developer or engineer in top MNCs? If yes, you need to be knowledgeable about these system design concepts for your career. That's why Learnbay has developed a comprehensive system design course for working professionals to master them for your next job at MAANG firms.