https://medium.com/javarevisited/15-system-design-tradeoffs-every-senior-developer-must-know-692e3f9b90ce