블로그 | CTO 사무실

마이크로서비스: 마이크로는 줄이고 서비스는 늘린다

로리 맥비티 썸네일
로리 맥비티
2018년 10월 1일 게시

서비스 지향 아키텍처(SOA)는 거의 10년 전에 죽었다고 선언되었습니다. 쇠퇴에 기여했지만 거의 논의되지 않은 요인 중 하나는 네트워크였다. 서비스 간 지연 시간으로 인해 아키텍트는 재사용을 촉진하고 궁극적으로 구성 가능한 애플리케이션을 만드는 데 필요한 세부성을 갖춘 서비스로 애플리케이션을 완전히 분해할 수 없었습니다.

마이크로서비스 아키텍처(MSA)를 소개합니다. 이 원칙은 애플리케이션을 분할하기 위한 주요 기준으로 목적어(명사)보다는 기능(동사)에 초점을 맞추어 더욱 광범위한 분해를 요구합니다. 이처럼 미묘해 보이는 초점의 변화를 통해 서비스의 세분화가 이루어집니다. 주어진 시스템에 있는 객체의 수보다 기능이 훨씬 더 많습니다.

네트워크가 준비되었습니다. 물리적 네트워크의 속도와 공급이 극적으로 증가했습니다. 컴퓨팅 역시 무어의 법칙에 따라 발전했고, 네트워크 지연은 거의 문제가 되지 않게 되었습니다.

불행히도 통신 지연이 그 자리를 대신하게 될 것입니다.

우리는 마이크로서비스를 배포하는 데 사용되는 컨테이너 환경의 내부에 인터넷의 복잡성을 복제했습니다.  마이크로서비스에는 DNS가 필요하지 않지만 인터넷을 실행하는 것과 동일한 종류의 이름 기반 확인에 여전히 의존합니다. 애플리케이션 태그(메타데이터)는 IP 주소로 변환되어야 합니다. 서비스 레지스트리와 복잡한 IP 테이블 항목은 소형 DNS 역할을 하며 태그를 주소로 변환하고 서비스 간 통신을 가능하게 합니다.

이 프로세스와 관련된 지연 시간을 심화시키는 것은 마이크로서비스와 관련 컨테이너의 일시적인 특성입니다. 수명이 시간이나 월 단위가 아닌 초나 분 단위로 측정되므로 모든 통화에서 이름 확인을 수행해야 합니다. 컨테이너 내부에서 수명(TTL)은 사실상 0입니다.

통신 지연의 가장 큰 원인 중 하나가 재현되는 것을 무시하더라도 TCP와 관련된 문제는 여전히 남습니다. TCP 연결을 시작하거나 종료하는 것은 무료가 아니며, 앞으로도 무료일 리가 없습니다. 이런 지연의 원인은 분명 작지만 확실히 누적적입니다. 단일 트랜잭션을 실행하는 데 필요한 각 연결, 각 마이크로서비스로 인해 지연 시간이 늘어나 결국 지연 허용 범위를 침범하게 됩니다.

HTTP/2는 극적인 동작 변화에도 불구하고 이 문제를 해결하지 못합니다. HTTP/2는 동일한 연결을 통해 여러 객체를 전송할 수 있도록 설계되어 웹 페이지와 웹 기반 애플리케이션과 같은 다중 객체 콘텐츠의 지연 시간을 줄여줍니다. 마이크로서비스는 각 서비스가 단일 응답을 반환하도록 이상적으로 설계되었습니다. 확립된 연결을 통해 여러 요청을 보내면 통신 오버헤드가 확실히 줄어들지만, 여러 요청이 여러 개별 서비스에 분산되는 시스템에서는 이를 실현할 수 없습니다.

그러므로 문제는 네트워크 지연이 아니라 통신 지연입니다. 연결은 여전히 중요하며, 웹 기반 다중 트랜잭션 통신의 성능을 향상하도록 설계된 프로토콜의 개선은 다중 서비스 트랜잭션에 도움이 되지 않습니다.

그 결과가 SOMA입니다. 서비스 지향적 마이크로 아키텍처. 서비스 지향 아키텍처와 마이크로서비스 아키텍처의 이상한 혼합으로 인해 어느 쪽이 끝나고 다른 쪽이 시작되는지 알 수 없습니다. 애플리케이션을 복합 기능 기반 서비스로 분해하는 작업은 통신 지연 시간과 궁극적으로 코드 기반의 지속 가능성에 의해 제약을 받습니다. 물론 네트워크가 발전하면서 분해를 합리적으로 달성할 수 있는 세분성이 높아졌지만 제약은 없어지지 않았습니다. 또 다른 요인은 애플리케이션에 객체보다 훨씬 더 많은 기능이 있다는 것입니다 . 이로 인해 순수한 마이크로서비스 아키텍처의 애플리케이션을 관리하는 작업은 네트워크 운영은 물론 앱 개발자에게도 일종의 물류적 악몽이 됩니다. 통신 지연으로 인해 발생하는 본질적인 문제와 결합하여, 기업들은 기능 지향적인 마이크로서비스 대신 객체 지향적인 마이크로서비스를 개발하는 경우가 점점 늘어나고 있습니다. 

이것이 결국 우리가 기존의 3계층 아키텍처를 넘어 애플리케이션 분해를 보는 이유이지만, 기능 기반 분해를 충실히 표현하지는 못하는 이유입니다.

연결 기반(TCP) 통신에 내재된 지연 시간을 새로운 방식으로 해결하거나 시스템 수준 구현에 집중하지 않는 한, 우리는 계속해서 마이크로성이 낮고 서비스가 많은 마이크로서비스 아키텍처에 제약을 받게 될 것입니다.