Building Reliable, Scalable and Maintainable Applications
Deepak Paramesh
Software Engineer II at Microsoft | Azure Technology enthusiasist
A data-intensive application is typically built from standard building blocks. They usually need to:
Three important concerns in most software systems are reliability, scalability, and maintainability:
Reliability
Typical expectations for software to be termed as reliable are that:
To put it in a nutshell: System should continue to work correctly, even in the face of faults and human errors.
Basically, a reliable system is fault-tolerant or resilient. Fault is different from failure. A fault is one component of the system deviating from its spec, whereas a failure is when the system as a whole stops providing the required service to a user.
It's impossible to reduce the probability of faults to zero, thus, it's useful to design fault-tolerance mechanisms that prevent faults from causing failures.
Some approaches for building reliable systems, in spite of unreliable human actions include:
Scalability
As system grows, there should be reasonable ways for dealing with that growth.
Describing Load
Load can be described by the?load parameters.?The choice of parameters depends on the system architecture. It may be:
Describing performance
What happens when the load increases:
In a batch processing system such as Hadoop, we usually care about?throughput, or the number of records we can process per second.
领英推荐
Latency and response time : The response time is what the client sees. Latency is the duration that a request is waiting to be handled.
It's common to see the?average?response time of a service reported. However, the mean is not very good metric if you want to know your "typical" response time, it does not tell you how many users actually experienced that delay.
Better to use percentiles.
Percentiles in practice: Calls in parallel, the end-user request still needs to wait for the slowest of the parallel calls to complete. The chance of getting a slow call increases if an end-user request requires multiple backend calls.
Approaches for coping with load
Maintainability
Design software in a way that it will minimize pain during maintenance, thereby avoiding the creation of legacy software by ourselves. Three design principles for software systems are:
Operability: Making Life Easy For Operations
Operations teams are vital to keeping a software system running smoothly. A system is said to have good operability if it makes routine tasks easy so that it allows the operations teams to focus their efforts on high-value activities. Data systems can do the following to make routine tasks easy e.g.
Simplicity: Managing Complexity
Reducing complexity improves software maintainability, which is why simplicity should be a key goal for the systems we build.
This does not necessarily refer to reducing the functionality of a system, it can also mean reducing?accidental?complexity. Complexity is accidental if it is not inherent in the problem that the software solves (as seen by the users) but arises only from the implementation.
Abstraction?is one of the best tools that we have for dealing with accidental complexity. A good abstraction can hide a great deal of implementation detail behind a clean, simple-to-understand fa?ade.
Evolvability: Making Change Easy
Make it easy for engineers to make changes to the system in the future, adapting it for unanticipated use cases as requirements change.
References and credits: