The very first question in any Architecture discussions/interviews – How to make your application Scalable.
Before answering, it's better to know what is 'Scalability'.
ü In software engineering, scalability is a desirable property of a system, which indicates its ability to handle growing amounts of work in a graceful manner.
ü Indicates the capability of a system to increase total throughput under an increased load(more users) when resources (typically hardware) are added.
ü A term that refers to how well a hardware and software system can adapt to increased demands.
ü Refers to the ability of an application to increase total throughput to handle the growing needs of data flow.
ü It is the ability of a computer application or product (hardware or software) to continue to function well when it is changed in size or volume, in order to meet a user need.
Scalability is a design concern of Distributed Applications and not Stand-Alone Applications.
Distributed applications are a step beyond traditional client-server applications. Distributed applications are applications that are designed as n-tier applications.
Such distributed application architectures promote the Design Of Scalable Applications by sharing resources, such as business components and databases.
Scaling comes in two flavours - Scale Up (vertically) vs. Scale-out (horizontally).
Scale-Up: (Adding More Memory/Processors – To a Single Machine)
Scale up means to add resources to a single node in a system.
I.e. Scaling up includes adding more memory, adding more or faster processors, or simply migrating the application to a more powerful, But Single Machine.
Such vertical scaling of existing systems also enables them to use virtualization technology more effectively.
Scaling up requires more expensive hardware, as single machine is upgraded. It's like using Smart/Expensive Server having Symmetric Multi-Processor (SMP) configurations.
Upgrading a hardware component in a single machine simply moves the processing capacity limit from one part of the machine to another part.
Adding more processors does not add performance in a linear fashion. Instead, the performance gain curve slowly tapers off as each additional processor is added.
For machines with symmetric multi-processor (SMP) configurations, each additional processor incurs system overhead. Consequently, a four-processor machine will not realize a 400 percent gain in capacity over the uniprocessor version. Once you have upgraded each hardware component to its maximum capacity, you will eventually reach the real limit of the machine's processing capacity.
Scaling up also presents other potential problems. Using a single machine to support an application creates a single point of failure, which greatly diminishes the fault tolerance of the system. While methods, such as multiple power supplies, may implement redundancy in a single-machine system, these options can be expensive.
Scale-Out: (Adding more Machines/Servers)
Scale Out means to add more nodes to a system, such as adding a new computer to a distributed software application.
Scaling out is less expensive, as it requires commodity PC hardware to distribute the processing load across more than one server.
Although scaling out is achieved using many machines, the collection essentially functions as a single machine.
By dedicating several machines to a common task, application fault tolerance is increased.
Developers and administrators use a variety of Load Balancing Techniques to scale out with the Windows platform.
Load balancing allows a site to scale out across a cluster of servers, making it easy to add capacity by adding more Replicated Servers.
It also provides Redundancy, giving the site failover capabilities so that it remains available to users even if one or more servers fail (or need to be taken down for maintenance).
Scaling out provides a method of scalability that is not hampered by hardware limitations. Each additional server provides a near linear increase in scalability.
The key to successfully scaling out an application is Location Transparency. If any of the application code depends on knowing what server is running the code, location transparency has not been achieved and scaling out will be difficult. This situation is called Location/Server Affinity.
Of course, from the administrator's perspective, scaling out also presents a greater management challenge due to the increased number of machines
Hope this helps.