다음 특징을 갖는 서비스들의 조합으로 이뤄진 설계
반댓말 모놀리식 서비스
기존 기술적 계층에 따른 팀 분류
이런식으로 기술적 계층에 따라 팀을 분류하면 작은 변경에도 협업이 필요하기 때문에 협업비용이 증가하게됨
비즈니스 수행 능력(업무 도메인, 서비스)에 따른 팀 분류
팀이 하는 일이 하나의 서비스로 나뉘어짐 → 마이크로서비스
전제조건
컴포넌트 핵심: 컴포넌트가 개별적으로 대체 가능해야 하고, 업그레이드를 할 수 있어야 한다.
장점
단점
서버리스의 의미
serverless != noserver
serverless라고 하면 뜻 그대로 봤을때는 백엔드에 서버가 없다는 소리 인가 싶겠지만, 서버리스는 서버는 존재하지만 서버를 직접 관리하지 않는 경우를 뜻합니다. (추상화된 서버)
애플리케이션을 빌드하거나 실행할 수 있는 클라우드 네이티브 개발 모델
관리는 누가하나?
따라서 웹 애플리케이션 구축에만 집중하면 되게끔 할 수 있음.
서버리스를 사용하는 이유
서버리스 장점
1. 서버관리가 필요 없기에 (풀스택) 제품을 빠르게 출시가능
2. 서버를 사용할때만 금액이 나오기 때문에 비용 절약가능(특수한 경우 제외)
서버리스 단점
1. 상시 대기중인 서버가 아니기 때문에 상시대기중인 서버 보다는 느릴 수 밖에없다. (cold상태로 대기중이기 때문)
2. 서버 제공자에 너무 의존 하게됨
-> aws lambda에 백엔드를 배포 했다면 마이그레이션이 쉽지 않다(서버리스로 작업시 애플리케이션 구조가 바뀜)
마이크로서비스와 서버리스의 관계
참고 : https://zdnet.co.kr/view/?no=20160614172904
서버리스의 특징 중 하나인 무상태성(Stateless)는 무엇을 의미 하는지?
서버리스 종류
FaaS, BaaS 의 특징
FaaS
BaaS
q1) 마이크로서비스를 구성할 때, 데이터베이스를 꼭 분리해야 하나요? 데이터가 한 곳에 모여있지 않고 중복되어도 괜찮은가요? 모범 사례를 알아보고, 이유를 함께 적어주세요.
마이크로서비스를 구성한다고 하면 데이터베이스는 분리를 하는것이 맞다. 왜냐하면 데이터베이스를 한곳에서 관리하기엔 어떤 서비스의 경우 동기화된 데이터가 필요하고 어떤 서비스는 비동기화 데이터가 필요 할 수 있다. 또 서비스의 트래픽이 커짐에 따라 한곳에서 관리하다가 문제가 발생시 서비스 전체 장애가 발생 할 수 있기 때문에 따라서 규모가 있는 서비스라면 DB까지 서비스별로 분리해서 사용하는 것이 좋다. 하지만 여러 데이터베이스를 두고 사용한다면 분산 트랜잭션 이슈가 생길 수 있지만 결과적 일관성만 유지(Eventual Consistency)하는 방법으로 처리하면 된다.
결과적 일관성을 만들기 위한 방법으로는 트랜잭션 분리와 메시징 시스템 활용(메시지 큐, aws SQS, Apache Kafga)을 이용하는 방법이 있습니다.
모범사례로 배달의 민족 초창기 16년까지는 서비스는 분리 했지만 고성능 루비DB에다 모든 데이터를 관리하는 방식을 사용했다고 합니다. 그러다 하나의 서비스(리뷰)가 에러가 났는데 DB가 이어져 있다보니 다른 서비스까지 마비되는 사건 이후 마이크로 서비스로 이전을 결심하고 서비스별로 DB를 조금씩 분리하여 19년 11월에 완전한 마이크로 서비스를 완성했다고 합니다.
데이터가 한곳에 모여있지 않고 중복되어도 괜찮은가?
제 생각에는 데이터가 많이 중복 된다면 하나의 서비스로 운영하거나 결이 다른 서비스라면 불가피하게 데이터의 복제와 중복 허용이 필요합니다.
q2)여러 도메인을 가지고 있는 서비스에서, 하나의 서비스에서는 성공했지만 연관된 다른 서비스에서 실패하는 “부분 실패”의 경우 어떻게 처리해야 하나요? 음식 주문에서 결제에는 성공했지만, 주문에는 실패하는 경우를 예를 들어 설명하세요.
원래 MSA의 기본 패턴은 서비스A(주문결제)가 라고 생각하면 성공하고 연관된 서비스B(라이더스서비스)가 실패 할경우 서비스A는 응답을 못받고 응답 대기를 하게되는데 이러한 패턴을 극복한게 Circuit breaker패턴이다. a와 b 사이 서킷 브레이커를 두고 b서비스가 응답이 없다면 b 호출을 강제로 끊고 fallback 메소드를 실행 시켜 클라이언트에 주문이 실패 하였다고 전달 할 수 있음. Circuit breaker 사용함으로써 MSA를 이용할 때 서비스 간에 끼치는 영향을 최소화 할 수 있게됌
호용님 발표)
Q1)
마이크로서비스 설계 원칙
서비스별로 데이터베이스를 갖도록 설계
각 저장소 서비스별로 분산해야하고 반드시 API를 통해 접근해야함
불가피하게 데이터의 복제와 중복 허용이 필요
분산된 데이터베이스에서 발생할 수 있는 이슈 : 분산 트랜잭션 이슈
분산 트랜잭션 : 네트워크에 존재하는 2개 이상의 시스템사이에서 발생하는 트랜잭션
하나의 트랜잭션이 두 개의 시스템에서 연달아 발생한다면?
해결법
데이터 일관성 유지 방법 : 결과적 일관성만 유지한다 (Eventual Consistency)
결과적 일관성(Eventual Consistency) : 어느 시점에서는 데이터가 서로 다를수 있지만 결국에는 모든 시스템이 최신 데이터를 가질 수 있도록 적용
결과적 일관성을 만들기 위한 방법
1. 트랜잭션 분리와 메시징 시스템 활용(메시지 큐, aws SQS, Apache Kafga)
바로 직접적으로 보내는게 아닌 중간에 메시지 버퍼를 두고 결과적으로 일관성을 맞추는 방식
CAP이론 : 시스템은 CAP 중 두가지 속성만 가질 수 있다
일관성, 가용성, 분할 허용성
마이크로서비스는 AP를 가지고 일관성은 결과적 일관성을 가짐
Q2)
부분 실패가 전체 실패로 이어지지 않게끔 하는게 중요함
해결책
네트워크 타임아웃
회로 차단기 패턴 : 타임아웃이 오면 서킷브레이커에서 바로 돌려주는 방식
정민 발표)
Q1)
마이크로 서비스는 분리하는게 기본적이긴 하지만 꼭 분리 하지 않아도 될 수 도 있겠다
shared datebase라는 패턴으로 마이크로서비스를 구현 해볼 수 있음
장점과 단점이 존재
장점
1. 서비스 중단 없이 지속적인 데이터 백업이 가능
2. 이벤트를 담는 메시지 브로커가 고장나도 데이터가 손실되진 않음
3. 데이터 관계가 매우 명확함 (쿼리는 복잡해질수 있어도 속도는 빠름)
4. 데이터 교환에 있어 네트워크를 사용할 필요x
단점
1. 스키마 변동이 매우 어려워짐 데이터 설계상 변화가 생겼을 때 유연하게 대처 불가
2. 수평확장이 힘들어짐
3. 하나의 서비스가 데이터베이스에 접근하고 있을 때 다른 서비스에서 접근이 불가능
이러한 단점이 있긴하지만 서비스가 적고 이용자수가 많지 않다면 고려해볼만 패턴
Q2)
부분 실패에 해결하는 방법
1. 결제 성공을 롤백하고 주문이 불가능하다는 메시지 클라이언트 전달
2. 결제 성공은 그대로 두고 주문이 가능해질때까지 클라이언트 대기시킴
동기/비동기
서비스 | 작업 |
---|---|
동기화 | 요청/응답 |
비동기회 | 비동기화 요청/응답 단방향 알림(푸시 알림) |
HTTP는 동기인가? 비동기인가?
REST
REST는 HTTP로 소통하는 프로세스 간 통신 규약입니다. REST API는 웹에서 사용되는 데이터나 자원(Resource)을 HTTP URI로 표현하고, HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식입니다.
REST 장단점
장점
단점
메시지 브로커가 필요한 이유
메시지 브로커 특징
메시지 브로커 선택의 기준
Q3) 메시지 서비스로는 대표적으로 Apache Kafka와 Amazon SQS, Amazon Kinesis가 있습니다. 각각은 어떤 차이가 있나요?
Amazon SQS 특징
SQS는 Queue 기반으로한 애플리케이션을 쉽게 분리하고 확장할 수 있도록 지원하는 완전 관리형 메시지 대기열 서비스
Amazon SQS의 장단점
장점
단점
Amazon Kinesis 특징
kinesis는 여러 소스에서 실시간 데이터 톤을 수집하고 처리하는 Data Stream 기반 데이터 송/수신 시스템
장점
단점
Apache Kafka 특징
Apache Kafka는 이벤트 스트림을 쓰고 읽을 수 있는 오픈 소스 된 이벤트 스트리밍 플랫폼입니다. 실시간 데이터를 분석하고 데이터 통합하는데 유용함
장점
단점
결론
완벽하게 관리 가능한 메시지 대기열 서비스 필요하면 SQS 반면 실시간 데이터가 요구 사항이라면 Apache Kafka, Amazon Kinesis가 최선의 선택입니다.
Q4) 웹 서비스에서 메시지 브로커(메시지 큐)를 이용해 비동기적인 방법이 활용되는 사례를 하나 이상 찾아보고, 어떻게 활용되는지 설명하세요.
활용되는 사례에 대한 예시로 배달의 민족이 어떻게 마이크로 서비스로 이전했는가에 대해 찾아 보았고 좋은 예시가 있어서 가져왔습니다.
배달의민족이 점점 성장함에 따라 트래픽에 의한 서버 장애가 계속해서 일어나고 마이크로서비스로의 이전을 결심하고 기존에 하나로 되어있던 루비DB에서 하나 하나 개별DB로 떼어내 가고 있었는데
(초창기의 배민은 모놀리식 시스템은 분리 되어있었지만 DB가 통합된 형태였음)
배민이 마이크로서비스로 이전할때 겪은 가장 큰 문제들중 하나인 주문DB를 어떻게 분리했는가에 대해서 입니다.
우선 기존 주문시스템에서는 API기반으로 기본적인 서비스 외에 연계 서비스들이 다 동기화 방식이다 보니 리뷰 푸시알림 시스템에서 장애가 발생했는데 주문시스템에 영향이 가는것을 보고 메시지 브로커를 활용한 아키텍처를 새롭게 추가 하였습니다. 라이프 사이클을 aws.sns로 이벤트를 저장하고 aws.sqs에서 필요한 이벤트를 호출하여 전달하는 이벤트 기반 데이터 전달 방식으로 구성하여 도중에 서버가 끊겨도 다른 시스템이 영향이 가지 않고 다시 연결되면 데이터를 보내 주게끔 만들어내고 이후 다른 주문데이터가 필요한 새로운 서비스 확장도 굉장히 편하게 확장 하는데 성공 했다고 합니다.