해당 영상은 11번가에서 기존의 시스템을 MSA기반으로 옮기면서 알게된 내용, 현재의 운영방식
을 공유한 강의입니다.
11번가는 기존에 Monolithic System을 사용하고 있었습니다. 폭팔적인 성장을 하는 시기에 열심히 기능을 개발했지만, 8년이 지나고보니 레거시하고 비효율적인 것들이 많아지게 되었습니다.
한 예로 팀의 중복개발을 없애기 공통모듈
이란걸 만들었었는데, 8년이 지나니 공통모듈의 개수가 200만이 넘게 되어 IDE에 뜨지도 못할 정도로 무거운 짐이 되어 있엇습니다. 하지만 이러한 문제는 개발자의 잘못이라기보다는 개발 환경과 문화의 잘못
인 경우가 많습니다.
이러한 나쁜 시스템은 나쁜 개발문화를 만들고 있었습니다.
11번가는 비단 서비스 측면뿐만이 아니라 개발자의 측면에서도 나쁜 시스템이 나쁜 개발문화를 만들고 있었기 때문에
MSA로의 변환이 필요했습니다.
11번가는 필요한 기능들부터 MSA로 하나씩 분리해 나가면서 점진적으로 변화해 큰 Legacy를 수정해나가는 방법
을 사용했습니다.
11번가는 기존 코드를 살려둔 채로 하나씩 기능들을 REST API로 분리해 호출하는 방식
으로 코드를 변경하기 시작했습니다. 이 방법의 장점은 전환한 코드에 문제가 발생했을 때 언제든지 이전코드로 돌아갈 수 있다
는 점입니다.
11번가는 NETFLIX OSS
를 선택했습니다. 그 이유는 Netflix에서 직접 사용하던 코드이기 때문에 비즈니스적으로 안전성 등의 검증이 끝났다고 생각했기 때문입니다.
Hystrix는 Netflix가 만든 Fault Tolerance Library
로 장애 전파를 방지해주며, Resilience를 보장해 줍니다.
Hystrix는 sprnig cloud없이 java만으로도 사용 가능합니다. 그렇기 때문에 팀 차원의 변경 없이 개인의 개발 영역에 독자적으로 활용하는 게 가능합니다.
Hystrix는 @HystrixCommand
또는 extends HystrixCommand<>
로 적용할 수 있습니다.
대신
실행합니다.Hystrix는 Circuit Breaker
, Fallback
, Thread Isolation
, Timeout
이라는 4가지 주요기능을 가집니다.
서킷브레이커는 일정 시간
동안 일정 개수 이상
의 호출이 발생한 경우 일정 비율
이상의 에러가 발생했을 때 Circuit Open(호출 차단)을 했다가, 일정 시간 경과
후에 단 하나의 요청에 대해 호출을 허용하며(Half Open) 이 호출이 성공하면 다시 Circuit Close(호출 허용)을 합니다.
commandKey
속성은 메서드의 동작이 비슷하거나 함께 장애가 발생할 확률이 높은 메서드를 묶어 함께 동작하고 함께 통계처리 됩니다.
어떤 기능이 제대로 동작하지 않을 때, 이에 대처하는 기능 또는 동작
을 Fallback이라고 합니다.
Fallback은 다음과 같은 조건에서 실행됩니다.
Caller의 잘못
인 경우(ex-파라미터를 잘못 넘김) HystrixBadRequestException이 실행됩니다.Hystrix는 Circuit Breaker 단위로(CommandKey 단위로) Timeout을 설정할 수 있습니다. Timeout은 Default값이 매우 짧으며, Semaphore Isolation인 경우 제 시간에 Timeout이 발생하지 않기 때문에 유의해서 사용해야 합니다.
Semaphore Isolation과 Thread Isolation이 존재합니다.
Semaphore Isolation
Thread Isolation
Ribbon은 Netflix에서 만든 Software Load Balancer를 내장한 REST Library입니다. 한마디로 클라이언트 로드벨런서
라고 정의할 수 있습니다.
스프링 클라우드에서는 Ribbon을 직접 활용하지 않습니다. Zuul API Gateway
, Rest Template
, Spring Cloud Feign
을 통해 간접적으로 Ribbon을 사용합니다.
Ribbon은 로드밸런싱 개념을 완벽히 프로그래밍 할 수 있다는 장점이 있습니다.
유레카는 Netflix에서 만든 Dynamic Service Discovery
입니다. 서버가 자신의 서비스 이름과 IP주소, 포트를 등록하면 다른 서비스에서 이름으로 해당 서버에 접속할 수 있습니다.
Eureka가 Spring Cloud와 함께 사용되면 아래와 같이 동작합니다.
Eureka와 Ribbon이 Spring Cloud와 함께 사용되면 아래와 같이 동작합니다.
ConfigurationBasedServerList
-> DiscoveryEnabledNIWSServerList
DummyPing
-> NIWSDiscoveryPing
자체 개발한 API Gateway를 그대로 쓸 것인가 아니면 Zuul을 사용할 것인가
였습니다. 11번가는 Zuul
사용을 선택했습니다. Semaphore Isolation
이 구현되어 있었습니다. Product군별로 Semaphore가 생성되고 이로 인해 특정 API군의 장애가 발생해도 Zuul 자체의 장애로 이어지지 않았습니다.Server to Server호출 시 모두 API Gateway를 거칠 것인지
였습니다. 11번가는 API서버들끼리 직접 호출하는 방식
을 사용했습니다.Ribbon
과 Eureka
를 통해 이러한 부분을 해결할 수 있었습니다. 또한 SpringCloud자체적으로 Ribbon + Eureka기반의 HTTP호출 방법인 RestTemplate
와 Sporing Cloud Feign
이 있었기에 쉽게 사용할 수 있었습니다.예시1) 3개의 인스턴스로 서버군을 구축했는데 그 중 하나의 인스턴스가 다운된 경우
예시2) 3개의 인스턴스로 서버군을 구축했는데 특정 API가 비정상적으로(시간이 매우 오래걸리게) 동작하는 경우
Zipkin
, Turbine
, Spring Boot Admin
을 사용하고 있습니다.기존의 모니터링 환경에서는 분산 Tracing에 부족함이 있었습니다. 어떤 API는 엄청나게 다양한 서버를 거쳐서 호출하게 되는데, 맨 앞단에서 API를 호출하는 개발자는 해당 API가 뒷단에서 어떤 API를 호출하게 되는지 모릅니다. -> 이러한 문제를 해결해주는 게 트위터에서 개발한 Open Source인 Zipkin이 있습니다. Zipkin은 특정 서버에서 UUID와 Tracing정보를 생성하고 해당 정보를 HTTP Header에 계속 가지고 다닙니다.
모니터링에 유용한 또 다른 기능으로 Spring Cloud Sleuth
가 있습니다.
Zipkin
을 사용하면 됩니다.불가능 합니다.
멱등성
있게 작성했습니다.Retry
를 하는걸 권장하고 있습니다.보상 API
를 작성하는 걸 권장하고 있습니다.