마이크로서비스 (Microservices)

개념

마이크로서비스(microservices)는 애플리케이션 개발에 대한 근래의 접근 방법으로 클라우드 네이티브(cloud native) 기술을 활용한다. 넷플릭스(Netflix)와 같은 최신의 애플리케이션들은 단일 앱처럼 보이지만, 실제로는 모두 긴밀하게 동작하는 작은 서비스들의 모음이다. 예를 들어, 영상에 접속하고, 검색하며, 미리보기 할 수 있는 단일 페이지는 각 기능을 처리하는 더욱 작은 단위의 서비스들(예, 브라우저상에서 검색, 인증 및 미리보기 실행)에 의해 구동될 수 있다. 간단히 말해서, 마이크로서비스는 모놀리식 애플리케이션(monolithic applications)에 대조되는 애플리케이션 아키텍처 패턴을 나타낸다.

다루는 문제

마이크로서비스는 모놀리식 애플리케이션에서 제기된 도전과제(challenges)에 대한 대응안(response)이다. 일반적으로, 애플리케이션에서 각기 다른 부분들은 별도로 확장(scaled)해야 할 필요가 있을 것이다. 예를 들어, 온라인 상점은 계산(checkouts) 횟수보다 제품 조회 횟수가 더 많을 것이다. 이것은 계산보다는 제품 조회 기능(functionality)에 대한 처리를 더 많이 수행해야 할 필요가 있음을 의미한다. 모놀리식 애플리케이션에서는, 이러한 논리적인 기능 부분들을 나누어 배치할 수 없다. 만약 제품을 각 기능별로 확장할 수 없다면, 전체 애플리케이션을 중복 배치해야 하고 이것에는 필수가 아닌 모든 기능요소(components)가 포함되므로 비효율적으로 자원을 사용하게 된다. 또한, 모놀리식 애플리케이션은 설계상의 잠재적 위험을 개발자가 쉽게 묵인(succumb)하도록 만든다. 모든 코드가 한 곳에 있으므로, 코드가 강결합(tightly-coupled)되기 쉽고, 주요 사항(concerns) 별로 분리하는 원리를 적용하기 더욱 어려워진다. 대개 모놀리스는 개발자가 전체 코드베이스를 이해해야 하며 그 이후 성과를 낼 수 있다.

문제 해결 방식

기능을 서로 다른 마이크로서비스로 분리하면 독립적으로 배치, 업데이트 및 확장하기 더욱 쉬워진다. 서로 다른 팀들이 큰 애플리케이션 중 각자가 맡은 작은 부분에 집중하게 되면, 맡은 부분 이외의 구조 및 체계(organization)에 부정적으로 영향을 끼치지 않으면서 더 쉽게 앱 관련 작업을 수행할 수 있다. 마이크로서비스가 많은 문제를 해결하였지만, 운영적 오버헤드 또한 만들어 낸다. 즉, 배포하고 추적해야 할 것들이 지수적 혹은 그 이상으로 증가한다. 여러 클라우드 네이티브 기술(cloud-native technologies)은 마이크로서비스를 더욱 쉽게 배치하고 관리할 수 있게 하는 것을 목표로 삼고 있다.