많은 팀이 마이크로서비스로 전환했다가 어려움을 겪는다. 분산 시스템의 복잡성을 과소평가하는 경우가 많다. 모놀리스에서 경험하지 않았던 새로운 종류의 문제가 발생한다.
네트워크는 신뢰할 수 없다. 서비스 간 통신에서 타임아웃, 연결 실패, 지연이 발생한다. 로컬에서 잘 작동하던 코드가 프로덕션에서 실패한다. 네트워크 문제를 전제로 설계해야 한다.
분산 데이터의 어려움
데이터 일관성이 어렵다. 여러 서비스에 걸친 트랜잭션은 복잡하다. 사가 패턴, 보상 트랜잭션 같은 기법이 필요하다. 단순한 ACID 트랜잭션보다 훨씬 복잡하다.
데이터 중복도 문제다. 서비스마다 필요한 데이터를 복제하면 동기화 문제가 생긴다. 이벤트 소싱으로 해결하려 해도 이벤트 버저닝, 재생 같은 새로운 복잡성이 추가된다.
운영 복잡성
서비스가 많아지면 운영이 복잡해진다. 배포, 모니터링, 로깅, 디버깅 모두 더 어려워진다. 서비스 메시, 분산 추적, 중앙 집중식 로깅 같은 인프라가 필요하다. 도구 없이는 운영이 불가능하다.
팀 구조도 바뀌어야 한다. 서비스별로 소유권이 명확해야 한다. 콘웨이 법칙에 따라 조직 구조가 아키텍처에 영향을 미친다. 기술적 결정만으로는 마이크로서비스가 작동하지 않는다.
결론
마이크로서비스는 은탄환이 아니다. 복잡성을 해결하는 것이 아니라 다른 종류의 복잡성으로 교환하는 것이다. 모놀리스로 충분하다면 모놀리스를 유지하자. 마이크로서비스가 필요해지면 그때 전환해도 늦지 않다.