아키텍처 설계, 마이크로서비스를 사용하지 않아야 할 때

철근콘크리트·2020년 12월 27일
0

마이크로 서비스 아키텍처를 구축할 때 프로젝트의 아키텍트가 하는 3가지 일

  1. 비지니스 문제의 분해
  2. 서비스 세분화의 확정
  3. 서비스 인터페이스의 정의




"마이크로 서비스 아키텍처는 비지니스 문제를 각 활동 영역을 대표하는 덩이들로 분해하고, 비즈니스 영역의 특징 부분과 연관된 비즈니스 규칙과 데이터 로직을 이 덩이들 안에 캡슐화 한다."

비즈니스 문제를 익식하고 마이크로서비스 후보로 분해하는데 확인해야 할 지침 3가지

  1. 비즈니스 문제를 기술하고 그 문제를 기술하는데 사용된 명사에 주목하라.
  2. 동사에 주목하라.
  3. 데이터 응집성을 찾아라.
    : 비지니스 문제를 각 부분으로 분해할 때 서로 연관성이 높은 데이터 부분들을 찾는다. 마이크로 서비스는 자기 데이터를 완전히 소유해야 한다.



마이크로서비스 아키텍처를 구축할 때 고려해야 할 3가지

  1. 큰 마이크로 서비스에서 시작해 작게 리팩토링하는 것이 더 낫다.
    (문제 영역을 한 번에 작은 서비스들로 분해하는 것은 마이크로 서비스가 그저 단순한 데이터 서비스로 전략하기 때문에 너무 일찍 복잡함을 겪게 된다.)
  2. 서비스 간 교류하는 방식에 먼저 집중한다.
    (문제 영역에 대한 큰 단위의 인터페이스를 만드는데 도움이 된다.)
  3. 문제 영역에 대한 이해가 깊어짐에 따라 서비스 책임도 계속 변한다.

마이크로 서비스는 처음부터 올바르게 설계하기 어렵기 때문에 진화론적 사고 과정으로 개발해야 한다.
끝으로 완벽한 설계를 위해 시간을 낭비하고 노력에 비해 보여 줄 것이 없는 것보다는 실용적인 접근 방식을 취하고 결과물을 전달하자.



서비스 인터페이스 설계시 4가지 고려사항.

1. REST 철학을 수용하라.
: REST 방식은 서비스의 호출 프로토콜로 HTTP를 수용하고 표준 HTTP동사(GET, PUT, POST, DELETE)를 사용하는 것이 핵심이다.

2. URL를 사용해 의도를 전달하라.

3. 요청(request)과 응답(response)에 JSON을 사용하라.
: JSON은 초경량 데이터 직렬화 프로토콜이며 XML보다 훨씬 사용하기 쉽다.

4. HTTP 상태 코드로 결과를 전달하라.
: HTTP 프로토콜에는 서비스의 성공과 실패를 명시하는 풍부한 표준 응답 코드가 있다. 상태 코드를 익히고 모든 서비스에 일관되게 사용하는 것이 매우 중요하다.






마이크로 서비스를 사용하면 안되는 4가지 경우

1. 분산 시스템 구축의 복잡성
2. 가상 서버/컨테이너의스프롤
3. 애플리케이션 유형
4. 데이터 변환과 일관성

1. 분산 시스템 구축의 복잡성
마이크로서비스는 잘게 나뉘고 분산되어 있어 모놀리식 애플리케이션에 없던 복잡성을 가져온다. 마이크로서비스 아키텍처에는 높은 수준의 운영 성숙도도 필요하다. 따라서 고도로 분산된 애플리케이션을 성공시키는 데 필요한 자동호와 운영 작업에 투자할 의사가 없는 조직이라면 마이크로서비스를 고려하지 않는 것이 좋다.

2. 서버 스프롤(Server sprawl)
마이크로서비스의 가장 일반적인 배포 모델 중 하나는 한 서버에 하나의 마이크로서비스 인스턴스를 배포하는 것이다. 대규모 마이크로서비스 기반 애플리케이션의 운영 환경에서만 구축 및 관리가 필요한 서버나 컨테이너가(일반적으로 가상의) 50~100개 있을 수 있다. 클라우드에서 이들 서비스를 실행하는 데 드는 비용은 저렴하더라도 서버를 관리하고 모니터링하는 운영 작업은 엄청나게 복잡해질 수 있다.

3. 애플리케이션 유형
마이크로 서비스는 재사용성을 추구하며 높은 회복성과 확장성이 필요한 대규모 애플리케이션 구축에 매우 유용하다. 이 때문에 많은 클라우드 기반 기업에서 마이크로서비스를 채택한다. 소수 사용자를 위한 애플리케이션을 개발할 때 마이크로서비스와 같은 분산 모델로 구축한다면 구축에 따른 복잡성이 얻게 될 가치보다 더 클 수 있다.

4. 데이터 변환과 일관성
마이크로서비스를 검토할 때 여러분은 서비스의 데이터 사용 패턴과 서비스 소비자가 어떻게 서비스를 사용하는지 고민해야 한다. 마이크로서비스는 적은 수의 테이블을 둘러싸고 추상화하며 저장소에 단순한 질의 생성, 추가, 실행 등 '운영상의' 작업을 수행하는 매커니즘으로 잘 동작한다.
애플리케이션이 여러 데이터 소스에서 복잡한 데이터를 취합하고 변환해야 할 경우 마이크로서비스의 분산된 특성 때문에 작업이 어려워진다. 마이크로서비스는 변함없이 과도한 책임을 떠안고 성능 문제에도 취약해질 것이다. 마이크로서비스 사이에 트랜잭션을 처리하는 표준이 없다는 사실도잊지말자. 트랜잭션 곤리자가 필요하다면 직접 만들어야 한다.

0개의 댓글