Angeliot

마이크로 서비스, 콜하지 말고 이벤트 컨슈밍하기

August 22, 2018 | 1 Minute Read

API Gateway는 마이크로서비스를 시작하면서 생기는 짐입니다. 주 목적은 Monolithic에서 시작한 서비스 콜구조를 지원하기 위해서입니다. API 게이트 웨이를 심도 있게 운영하는것은 비용, 스트레스, 효율등을 고려하면 좋은 선택이 아닙니다, 이벤트 드리븐을 사용해야합니다.

예제로 보는 API 콜 방식의 문제

우리는 왜 API 콜 방식이 우리에게 고통을 주는지 가입자에게 쿠폰을 발송하는 간단한 서비스 예제를 통해서 살펴봅니다.

create account {
   create coupon
}

계정이 생성되면 내부적으로 다시 쿠폰을 생성합니다. 콜스텍을 보면 다음과 같습니다.

  1. call create account
  2. create account via API gateway
  3. call create coupon
  4. create coupon via API gateway

쿠폰 생성은 계정 생성에 의존적입니다. 따라서 이벤트 기간이 끝나면 account 서비스의 create 부분을 다음과 같이 수정해야합니다.

create account {
}

다행히도 우리는 마이크로서비스를 선택했기 때문에 모든 서비스 인스턴스를 재배포하고 재시작하는 작업은 필요없지만 불필요하게 서비스를 업데이트해야합니다. 다행히 위 예제는 콜 체인의 길이가 2 지만, 콜체인이 길어진다면 업데이트가 필요한 부분이 더 커질수 있습니다.

이벤트 드리븐은 해결책인가

네 해결책입니다. 관계 때문에 서비스를 업데이트를 할 필요가 없기 때문입니다.

create account {
}
consume create point
//consume create account
create coupon {
}

이벤트 컨슈밍 방식에서는 account 서비스는 변경이 필요없습니다. create coupon의 이벤트 컨슈밍 대상 중에 create account만 삭제하면됩니다. call 방식에서는 비니지스 로직을 수정하여 오류가 발생할 가능성이 높고 event 방식에서는 컨슈밍 대상만 제거하는 선언적인 부분만 수정하면됩니다. 이 때문에 call 방식에서는 조건문을 달아서 배포하기도 하지만 또다른 지옥의 시작입니다.

create account {
   if 이벤트 기간중인가
      create coupon
}

조건문으로 비지니스 로직이 더 복잡해지고, 불필요한 코드이기 때문에 언젠가는 저 조건문도 제거해야합니다.

참고자료

Netflix Micoroservice

Netflix Micoroservice(한글자막)

마이크로서비스 아키텍처에 대해 궁금한점이 있다면 포스트 하단의 링크(페이스북, 이메일)를 통해 문의주세요.