They still make up some whole product that presumably does something as a whole that you actually care about, and the complexity inherent to that doesn't go away with either approach.
They still make up some whole product that presumably does something as a whole that you actually care about, and the complexity inherent to that doesn't go away with either approach.
Someone has to deal with them, but if you are dealing with all of them then you don't really have microservices, just a multi-process monolith.
At the end of the day, it comes down to:
- how far does the data have to travel, and at what cost?
- how much latency can your process tolerate?
- how much unreliability can your process tolerate?
- where and how do you isolate resources that are concurrency sensitive?
- what's the infrastructure going to cost?
With micro services, that same function call is now a minimum of 200us. And now I have LOC for serialization/deserialization, retries, error handling, etc, bloating my code and making it harder to understand, plus now to do the same integration test I need to understand N different build systems for each component.
In a monolith it's significantly easier to do something that has an unexpected impact somewhere else. For example, changing a shared object a singleton to a clone will give you race conditions all over the place. You just don't have that footgun in micro services.