Looking for a solution for a problem, sometimes you need to wonder whether the requirements cover the full scale of the deployments, i.e:
Will the solution be deployed is unusually small scales?
Will the solution be deployed in very large scales?
A good example for the first scenario is running the full solution on one computer (read Laptop) for demonstration purposes, but with real data. If the original system is lightweight, most normal computers can handle quite a lot of processes (see a normal process list)
The second scenario is trickier, as you normally know the largest size the solution will be deployed. Where the surprises come? The moment you just have to deploy the same solution for a much larger customer. When scaling out difficulties are encountered: concurrency, single point of failures, load distribution, etc.
Some real life examples:
- Arbiter for load sharing – should be discarded in very small systems because only one working engine is needed.
- Having one working engine – but no capabilities to scale it to use multiple computers.
- Using different operating systems for different engines – no capability to integrate on one computer easily.
Since design is a matter of decisions, one of the first things to check for scaling is the necessity of each building block in each of the scenarios.
There is no magical solution to fit all sizes, but taking into account the possible deployment scenarios can make the decision taking process more effective and provide a more flexible solution overall – capable of being deployed in large or small scale