Microservices architecture is becoming increasingly popular while building large scale applications as it provides n number of benefits.
- Separate lifecycle of each service so services can be deployed independently which means services can evolve separately.
- Each service can be fine tuned for different SLAs and scalability
- Each Service can be developed using different stack
- Each service can be monitored separately
However, Microservice service architecture is not a free lunch. It throws many challenges that must be discussed and dealt with even before venturing into this (unchartered) territory.
- Authorisation – How do you make sure that particular service and its APIs can be called only when user is authorised to do so.
- Data Consistency – ACID is no longer available, deal with eventual consistency.
- Service Discovery – How to find and interact with new services. If there are lots of services then how to make sure that they are discoverable from other services
- Deployment – What if there is a hierarchy in microservice dependency
- A -> B -> C
- SLA – Multiple hops in a request will add to latency and affect your SLA
- Fault Tolerance – How to handle Cascading Failure
- Monitoring – (How to monitor a system which has 100s or even 1000s of services)
- Tracing – Logging & Request Tracing (A message will travel across many boundaries so how to nail down where message got lost/delayed)
- Tech Stack – Selecting a stack (to go with single stack or multiple stacks?)
- Packaging and Deploying – (How to come up with a uniform way of packaging and delivering services )
- Debugging – During development phase how to make sure that developers are able to debug code as effectively as they do in monolithic system