Designing a distributed system requires quite some work, it’s a complex task that requires teams effort and a lot of good software design. But before you start digging at this monumental task you should first be sure that in order to solve your problem a distributed system is actually needed, because in a distributed system, as we will see, we use multiple layers to abstract away complexity, this requires us, if we are lucky, to maybe use a completely new technology or provide our own if none exists.