Rainer Stropek | rainer@software-architects.at
If you think you found a solution that isn't a trade-off, you have missed something
Hard to Google,
AIs can be of help
Bounded Context Approach
Work well in heterogeneous environments
Right tool for the job
Available skills of team members
Grown environment (e.g. M&A, changing policies, changing overall designs)
Easier to test/adopt new technologies
Reduce risk and cost of failure
New platforms (e.g. Node.js instead of .NET), new versions (e.g. .NET Core)
Resilience
Reduce single point of failures
Support different SLAs for difference modules (costs, agility)
Separation of services add complexity (e.g. network) -> criticism of Micrservices
Let people take responsibility
Teams “own” their services
You build it, you run it
Scaling
Fine-grained scaling is possible
Simplify deployment of services
Overall, deployment of many Microservices might be more complex
-> criticism
Composability
Ability to replace system components
Outdated technology
Changed business requirements
Harder to debug and troubleshoot
Distributed system
Possible mitigation: Mature logging and telemetry system
Performance penalty
Network calls are relatively slow
Possible mitigation: Remote calls for larger units of work instead of chatty protocols
No strong consistency
We are going to miss transactions!
Possible mitigation: Idempotent retries
Harder to manage
You have to manage lots of services which are redeployed regularly
Possible mitigation: DevOps, Automation
System is too small
For small systems, monolithic approach is often more productive
Cannot manage a monolith (e.g. deployment)? You will have troubles with Microservices!
Environment with lots of restrictions
Microservices need a high level of autonomy
Organizational hurdles for Microservices
Tightly-coupled organizations
Geographically distributed teams
Missing tools (e.g. Â self-service cloud infrastructure, CI/CD tools)
Unstable or immature service that frequently changes
Missing culture of taking ownership (need someone to blame)
Problems copeing with many different and new technologies
Any organization that designs a system will inevitably produce a design whose structure is a copy of the organization’s communication structure
Source: Conway, How Do Committees Invent, Datamation magazine, April 1968
Co-locate teams
One team responsible for a single service should be co-located
Embrace open source development style
Works internally, too
Internal consultants, custodians and trusted committers
Quality gateways
Servant leaders
Step-by-step approach
Be clear in communication
E.g. responsibilities, long-term goals, changing roles
Traditional CRUD model
CQRS
Image source: https://martinfowler.com/bliki/CQRS.html
Further readings: https://redux.js.org/introduction/core-concepts
Software Architecture: The Hard Parts
Building Evolutionary Architectures