분산 시스템은 복잡하다
분산 시스템(distributed system)이라는 또 다른 복잡성은 개발자가 감당해야 합니다. 서비스 간 통신에 필수적인 IPC 역시 단순 메서드 호출보다는 복잡하며, 사용 불능 또는 지연 시간(latency)이 긴 원격 서비스, 부분 실패한 서비스를 처리할 수 있게 설계해야 합니다.
여러 서비스를 상대로 유스 케이스를 구현하려면 익숙지 않은 기술도 동원해야 합니다. 특히 서비스마다 DB가 따로 있기 때문에 다중 DB에 접속하여 조회하고 트랜잭션을 구현하는 일이 어렵습니다. 그래서 마이크로서비스 아키텍처는 사가라는 기술로 서비스 간 데이터 일관성을 유지합니다(4장). 또 단순 쿼리로는 여러 서비스에 있는 데이터를 조회할 수가 없으므로 API를 조합하거나 CQRS 뷰로 쿼리합니다(7장).
개발자가 많이 쓰는 IDE와 각종 툴 역시 초점은 모놀리식 애플리케이션 개발이고 분산 애플리케이션 개발은 별도로 지원하지 않습니다. 여러 서비스가 연관된 테스트를 자동화하는 것도 쉽지 않은 일입니다. 따라서 마이크로서비스 아키텍처에 특정한 이런 문제를 해결하려면 뛰어난 소프트웨어 개발/전달 스킬을 보유한 우수한 개발자가 필요합니다.
마이크로서비스 아키텍처는 운영 복잡도 역시 가중시킵니다. 종류가 다른 서비스가 여러 인스턴스로 떠 있으니 프로덕션에서 관리해야 할 가동부가 더 늘어나죠. 마이크로서비스를 성공적으로 배포하려면 다음과 같은 기술을 응용하여 플랫폼을 고도로 자동화해야 합니다.
• 넷플릭스 스핀네이커(Netflix Spinnaker) 같은 자동화 배포 툴
• 피보탈 클라우드 파운드리(Pivotal Cloud Foundry) 또는 레드햇 오픈시프트(Red Hat OpenShift)처럼 바로 쓸 수 있는(off-the-shelf) PaaS
• 도커 스웜(Docker Swarm), 쿠버네티스(Kubernetes) 등 도커 오케스트레이션 플랫폼
다양한 배포 옵션에 대해서는 12장에서 자세히 설명합니다.