I've been tasked to create the systems architecture for a distributed system.
One approach to designing this system is to pick systems architecture patterns, and then evaluate different technologies that implement those architectural patterns.
For example, a particular architecture might call for a message bus, and given that, I could choose between various off-the-shelf open source or commercial projects that implement a message bus.
While this approach yields a nice white-board diagram, and a high-level understanding of how the system will work, some drawbacks are:
- its difficult to gauge the performance of the system as a whole without fully implementing it
- its difficult to determine how well each pattern / implementation will mesh with the other components
- because of that, choosing between patterns tends to be gut feelings similar to "Kafka is cool, I used it on project X and it did really well"
- there are no hard guarantees about the performance of the system as a whole (consistency, availability, etc)
Is there a formal approach to modeling distributed systems? Ideally one that provides a way to abstract patterns, and provide analytic tools for making predictions about the behavior of the system?