Spring Framework을 잘 알지 못하지만, Micro Service Architecture(MSA)에 관심이 많아서 Track A 세션만 들었습니다. 각 세션을 들으면서 개인적으로 정리한 것이라서 오타가 잘못된 정보가 있을 수 있습니다.
희망을 찾기 위한 우리의 여정, Coupang MSA(정재훈님)
5년 전 쿠팡 Monolithic architecture의 Paint point
- 부분의 장애가 전체 서비스에 영향을 미침
- 레거시 문제(coupang-common)
- 부분적인 Scale-out 어려움
- 배포의 비효율성: 서비스의 성장을 가로막게 됨
Vitamin project for Micro-service
- 도메인 팀에 helper library 제공
- Message Queue를 클러스터링하고, 자동으로 Fail over 되도록 구성
Configuration Management DataBase(CMDB)
- Micro-service count 수백개
- 서버의 인스턴스 10000대
- 다양한 메타 정보를 가시화하고, 자동화
- 전체 서비스가 아닌 특정 서비스 기준으로 데이터를 메쉬화
Bolt2(Deployment System of Coupang)
- 하루에 횟수로는 100번 이상, 2천대 이상 배포 가능하도록 구성
- Stage -> Canary -> All
A/B Test
- 주요한 Feature 변경은 모두 A/B 테스트로 진행
- A/B Test는 사용자 모집과 노출 빈도가 중요
API Gateway
- API Gateway에서의 콜 수 30억
- 현재 10,000개 이상의 API를 가지고 있다.
- 전체 조직에서 특정 API를 누가 사용하고 있는지, 어떤 API가 deprecated되었는지 등을 관리하기 위해
- 쿠팡 전체 서비스의 API 를 가시화하고, 어떤 Parameter, 어떤 Response, 어떤 팀, 어떤 서비스에서 사용하고 있는지
- (초기) API Gateway가 Single Point로 존재해서, Single Point of Failure와 Latency의 증가 문제 발생
- (개선) Consumer는 API Gateway에서 Routing 정보를 받아와서 직접 Provider에 요청
- (초기) Consumer는 해당 정보를 얻어가기 위해 순차적으로 API를 호출
- (개선) Consumer는 API Gateway에 요청만 하면 병렬적으로 수행후 값을 받아감
- Traffic throttling: 특정 Consumer가 API를 비정상적으로 많이 호출하더라도 장애가 발생하지 않도록
Site Reliability Engineering(SRE)
- 서비스에 장애가 난 경우, 어떤 이유 때문에 장애가 났는지?
- 서비스 장애를 재연하기 위해 어떻게 해야되는가?
Integration test for MSA
- 문제: 어떤 서비스가 dependency를 가지고 있는 경우, 하나의 서비스를 테스트하기 위해 전체 시스템을 테스트해야 한다.
- API Gateway가 있다면 Test를 위한 Dependency를 제거할 수 있다.
Dynamic properties for MSA
- Scale-out 할 때 DB connection pool 과 같은 자원은 제한적이기 때문에 이를 동적으로 관리할 방법이 필요함.
이벤트 기반 분산 시스템을 향한 여정(박용권님)
부제: build event-driven distributed system with spring, aws
지난 1년간 공급망 관리(supply chain management, SCM) 시스템을 운영, 개발하며 있었던 일
초기(2016)
- 사용자 서비스와 백 오피스 모듈로 구성된 Monolithic architecture 시스템
- Back office 중심, 주로 수작업으로 이루어짐
- 주문량 성장에 따른 자동화된 시스템 기반 업무로 전환 필요
Adapter
- 시스템 통합을 위한 어댑터 서비스 도입
- Spring boot(Java 1.8), AWS Elastic Beanstalk
- 시스템간 이질적인 용어와 모델을 번역하는 역할을 수행(주문과 입/출하 관련)
- 주문 완료 메시지: 메시지 기반으로 비동기 처리, 시스템간 결합 제거
- 주문 완료 메시지에서 수신된 메시지는 멱등성(중복 처리)을 보장하도록 기능 개발
컴포넌트의 역할에 따라 패키지를 나눈 것이 아닌, 도메인의 경계에 따라 패키지를 나누었고 그 내부에서 역할에 따라 모듈로 구성
모듈화는 왜?
- 모듈간 상호작용은 내부 프로세스로 처리
- 단일 트랜잭션 관리로 인해 강력한 일관성 확보
- IDE를 통한 손쉬운 코드 리팩토링
- 하지만, 모듈화를 구성하다 보니 모듈 간의 강결합이 발생하면서 또 다른 모놀리식 시스템화 현상이 발생하였다.
이벤트 생산과 소비를 통한 느슨한 결합(Loose coupling)
- Producer, Consumer
- Channel: 생산자와 소비자에 적절한 이벤트가 전달되도록 중간 역할
- 모듈간의 결합도를 이벤트 기반으로 해소시켰다.
RPC(Remote Procedure Call): 시스템 간 응집도 상승 RESTful API Messaing system
컨텍스트(시스템, 서비스) 간 협업을 위한 두가지 방식
- 동기: Request<->Response, 실시간 응답이 필요한 경우
- 비동기: Messaging
스프링 메시징 모듈, 메시징 통합 지원
- Spring cloud stream: 다중 바인드 지원. 하지만 아직 aws 지원하지 않습니다.
이벤트 기반 애플리케이션과 메시징 어댑터
11번가 Spring Cloud 기반 MSA 전환 1년간의 이야기(윤용성님)
어떻게 MSA를 도입할까?
- 잘 사용되지 않는 코드까지 수정할 필요가 있을까?
Hybrid MSA
MSA 플랫폼 Solution 선정
Fallback 발생 조건
- Circuit open
- Any Exception
- Semaphore, ThreadPool exception
- Timeout
Hystrix, Ribbon, Eureka
MSA 플랫폼 내부의 API server 간의 호출은 어떻게 할 것인가?
- 내부의 모든 서버가 Hystrix + Ribbon + Eureka 기반으로 서로 통신
Spring Cloud Feign With Hystrix
MSA 모니터링 문제점
- 관련된 API 서버가 어느 것인지 쉽게 알기가 어렵다.
- 분산 Tracing의 필요: 서버와 서버 호출 시 Http Header에 특정 protocol을 추가
- 특정 Trace ID(UUID)를 부여
MSA를 위한 Spring Cloud와 Kubernetes(홍정석님)
Cloud native 12 요소(https://12factor.net/ko/)
- 동시성(Concurrency)
-
폐기 가능(Disposability)
- API Gateway - Netflix Zuul
- Service Discovery - Consul, Netflix Eureka, Netflix Zookeeper
- Service Incovation - Feign
- Security - Security
- Load balancing - Netflix Ribbon
- Resiliency - Health Indicator, Netflix Hystrix
- Packaging - Spring Framework(Boot)
- Configurations - Config
Container Orchestration
- Scheduling
Kubernetes
- Automatic binpacking: 가용 서버로 스케쥴링 해주는 기능
- Self-healing: 컨테이너의 상태를 모니터링
- Horizontal scaling:
- Service discovery and Load balancing
- Automatic rollouts and rollbacks: 다섯개의 컨테이너 버전업 할 때 버전별로 stop, start를 자동으로 관리
- Secret and configuration management
- Storage orchestration
Kubelet: 컨테이너가 워커에서 돌아가는데, 마스터가 Kubelet과 통신하고 Kubelet이 컨테이너와 통신