안녕하세요 여러분, 시스템 설계 면접을 준비 중이라면 마이크로서비스 디자인 패턴도 준비하는 게 좋습니다. 면접에서 좋은 성적을 거두거나 아키텍처를 더욱 견고하게 만들기 위해서 뿐만 아니라 기존 프로젝트를 이해하기 위해서도요.
Cicuit Breaker, API Gateway, Saga, Event Sourcing과 같은 마이크로서비스 패턴은 일반적인 마이크로서비스 문제에 대한 검증된 솔루션입니다.
이러한 패턴은 확장성, 장애 내구성, 데이터 일관성과 같은 마이크로서비스 아키텍처의 일반적인 과제를 해결합니다.
과거에는 API Gateway 대 로드 밸런서 , 수평적 확장 대 수직적 확장 , 순방향 프록시 대 역방향 프록시 와 같은 일반적인 시스템 설계 문제와 일반적인 시스템 설계 문제 에 대해 이야기했습니다 . 이 글에서는 기술 면접에 필수적인 지식인 24가지 핵심 마이크로서비스 설계 패턴을 공유하려고 합니다.
이는 또한 면접을 위한 필수적인 시스템 설계 주제 중 하나이므로 , 이를 잘 준비해야 합니다.
많은 회사가 마이크로서비스를 사용하므로 이러한 패턴을 이해하면 최신 트렌드에 발맞추고 있다는 것을 보여줍니다. 이러한 패턴을 언제, 어떻게 적용할지 아는 것도 복잡한 분산 시스템 문제를 해결할 수 있는 능력을 보여줍니다.
이러한 패턴에는 종종 상쇄가 수반되므로 분석적 사고를 보여줄 수 있으며, 면접관은 이러한 패턴이 관련성 있는 솔루션인 시나리오를 종종 제시합니다.
그런데, 시스템 설계 면접을 준비하고 시스템 설계에 대해 심도 있게 배우고 싶다면 ByteByteGo , Design Guru , Exponent , Educative , Udemy 와 같은 사이트를 확인해 보세요 . 이 사이트에는 훌륭한 시스템 설계 과정이 많이 있고, 이와 같은 시스템 설계 면접 템플릿도 있어서 시스템 설계 질문에 답하는 데 사용할 수 있습니다.
시스템 설계 질문에 대답하는 방법
더 많은 선택이 필요하면 최고의 시스템 설계 과정 , 책 및 웹사이트 목록도 볼 수 있습니다.
PS 끝까지 읽어주세요. 무료 보너스가 있어요.
그럼, 우리는 무엇을 기다리고 있습니까? 바로 시작해 볼까요?
시스템 설계 인터뷰를 위한 19가지 마이크로서비스 설계 패턴
마이크로서비스 아키텍처는 느슨하게 결합된 서비스의 모음으로 애플리케이션을 구조화하는 설계 접근 방식입니다.
확장 가능하고, 유지 관리 가능하며, 복원력이 뛰어난 마이크로서비스 기반 시스템을 구축하기 위해 다양한 패턴이 등장했습니다.
프로젝트에서 사용할 수 있고 시스템 설계 면접에서도 기억할 수 있는 필수적인 마이크로서비스 패턴을 소개합니다.
1. 서비스 레지스트리
마이크로서비스 아키텍처에는 많은 마이크로서비스가 있으므로, 각 마이크로서비스는 서로를 검색하고 통신할 수 있어야 합니다.
Netflix Eureka나 Consul과 같은 서비스 레지스트리 는 서비스가 자신을 등록하고 다른 서비스를 검색할 수 있는 중앙 디렉토리 역할을 합니다.
그 모습은 다음과 같습니다.
서비스 레지스트리 패턴
2. API 게이트웨이
API 게이트웨이는 클라이언트 애플리케이션에 대한 단일 진입점 역할을 하며 여러 마이크로서비스를 통합된 API로 집계합니다.
요청을 처리하여 적절한 서비스로 라우팅하고 인증, 권한 부여, 부하 분산과 같은 작업을 수행할 수 있습니다.
API Gateway의 모습은 다음과 같습니다.
API 게이트웨이
3. 회로 차단기
전기 회로 차단기에서 영감을 받은 이 패턴은 마이크로서비스 장애가 다른 서비스로 연쇄되는 것을 방지합니다. 회로 차단기 패턴은 장애를 모니터링하고 임계값을 넘으면 회로를 열어 추가 요청을 방지합니다.
이는 우아한 저하와 장애 내구성에 도움이 되며 마이크로서비스 아키텍처에서 서비스가 완전히 중단되는 것을 방지하기 위해 반드시 필요합니다.
Netflix Hysrix를 Circuit breaker로 사용한 예는 다음과 같습니다.
회로 차단기
4. 방벽
마이크로서비스 시스템에서는 장애를 격리하는 것이 중요합니다. Bulkhead 패턴은 장애를 포함하기 위해 구성 요소나 서비스를 분리하는 것을 포함합니다.
예를 들어, 다양한 서비스에 대한 스레드 풀이나 별도의 데이터베이스를 사용하면 시스템의 한 부분에서 발생한 장애가 다른 부분에 영향을 미치는 것을 방지할 수 있습니다.
다음은 마이크로서비스 아키텍처의 벌크헤드 패턴을 보여주는 다이어그램입니다.
방벽 패턴
5. 사가 패턴
이 패턴은 분산 트랜잭션을 관리하는 데 사용됩니다. Saga 패턴은 장기 실행 비즈니스 트랜잭션을 일련의 작고 독립적인 트랜잭션으로 나눕니다.
사가에 관련된 각 마이크로서비스는 자체 트랜잭션을 처리하고 이벤트를 게시하여 후속 작업을 트리거합니다.
Saga Pattern이 실제로 어떻게 작동하는지 살펴보세요.
사가 패턴
6. 이벤트 소싱
이는 대기 시간이 길고 빈도가 높은 애플리케이션에 많이 사용되는 또 다른 인기 있는 패턴입니다.
이 패턴에서 이벤트 소싱은 현재 상태만을 저장하는 대신 현재 상태로 이어진 일련의 이벤트를 저장하는 것을 포함합니다.
이 패턴은 신뢰할 수 있는 감사 추적을 제공하고 언제든지 시스템 상태를 재구축할 수 있게 해줍니다.
이벤트 소싱이 실제로 어떻게 진행되는지 살펴보겠습니다.
이벤트 소싱
7. 명령 쿼리 책임 분리(CQRS)
CQRS 패턴은 애플리케이션의 읽기 및 쓰기 측면을 분리합니다. 정보 업데이트(명령) 및 정보 읽기(쿼리)에 대해 서로 다른 모델을 사용합니다.
읽기 및 쓰기 작업에는 서로 다른 최적화 요구 사항이 있으므로 이 패턴은 확장성을 향상할 수 있습니다.
CQRS 패턴을 보여주는 좋은 다이어그램은 다음과 같습니다.
명령 쿼리 책임 분리(CQRS)
8. 데이터 샤딩
데이터베이스 공유 패턴은 데이터베이스 부하를 분산하고 병목 현상을 방지하는 데 사용됩니다. 데이터 샤딩은 여러 데이터베이스 또는 데이터베이스 인스턴스에 걸쳐 데이터를 분할하는 것을 포함합니다.
이 패턴에서 각 마이크로서비스는 데이터의 하위 집합이나 특정 유형의 요청을 처리할 수 있습니다.
데이터베이스 샤딩이 어떻게 생겼는지 알아보세요. 출처 - Design Guru
데이터베이스 샤딩의 종류
9. 다국어에 대한 끈기
다양한 마이크로서비스는 서로 다른 데이터 저장 요구 사항을 가질 수 있습니다. Polyglot Persistence는 각 마이크로서비스의 요구 사항에 따라 여러 데이터베이스 기술을 사용하여 데이터 저장, 검색 및 쿼리 기능을 최적화할 수 있습니다.
다음은 Azure에서 Polyglot 지속성을 보여주는 훌륭한 다이어그램입니다.
다국어 능력의 끈기
10. 다시 시도하세요
마이크로서비스 아키텍처에서 일시적인 장애가 발생하면 재시도 패턴은 즉시 실패하는 대신 작업을 다시 시도하는 것을 포함합니다.
이는 서비스 간 통신이나 데이터베이스 상호 작용 등 다양한 수준에 적용될 수 있습니다.
다음은 ByteByteGo 에서 제공하는 훌륭한 다이어그램으로 , 마이크로서비스의 재시도 패턴을 보여주는 시스템 설계 학습에 좋은 곳입니다.
마이크로서비스의 재시도 패턴
12. 사이드카
사이드카 패턴은 로깅, 보안, 외부 서비스와의 통신과 같은 추가 기능을 제공하기 위해 메인 마이크로서비스에 도우미 서비스(사이드카)를 연결하는 것을 포함합니다.
이를 통해 주요 서비스는 핵심 기능에 집중할 수 있습니다.
사이드카 패턴의 모습은 다음과 같습니다.
마이크로서비스의 사이드카 패턴
13. 프런트엔드를 위한 백엔드(BFF)
BFF라고도 불리는 이 패턴은 여러 클라이언트 유형(예: 웹, 모바일)을 처리할 때 유용합니다. BFF 패턴은 각 유형의 클라이언트에 맞게 조정된 별도의 백엔드 서비스를 만드는 것을 포함합니다.
이를 통해 각 클라이언트에 대해 최적화되고 특화된 API가 가능해집니다.
백엔드를 위한 프런트엔드(BFF) 패턴은 다음과 같습니다.
프런트엔드를 위한 백엔드(BFF)
14. 섀도우 배치
섀도우 배포 패턴은 실제 사용자 경험에 영향을 주지 않고 프로덕션 트래픽의 사본(섀도)을 새로운 마이크로서비스 버전으로 라우팅하는 것을 포함합니다.
이는 널리 사용되는 배포 전략 중 하나이며 새로운 버전의 성능과 정확성을 검증하는 데 도움이 됩니다.
섀도우 배포의 모습은 다음과 같습니다.
섀도우 배치
15. 소비자 중심 계약
마이크로서비스 생태계에서 여러 서비스가 서로 상호 작용하는 경우가 많습니다. 소비자 주도 계약 패턴은 소비자가 생산자에게 기대하는 바를 명시하여 보다 견고하고 조정된 변경을 가능하게 합니다.
다음은 소비자 주도 계약을 설명하는 훌륭한 다이어그램입니다.
소비자 중심 계약
16. 스마트 엔드포인트, 멍청한 파이프
이 패턴은 복잡한 미들웨어에 의존하기보다는 마이크로서비스(스마트 엔드포인트)에 비즈니스 로직을 배치하는 것을 옹호합니다. 통신 인프라(파이프)는 간단해야 하며 메시지 라우팅만 처리해야 합니다.
17. 서비스당 데이터베이스
이는 각 마이크로서비스가 자체 데이터베이스를 가지고 있고, 서비스가 잘 정의된 API를 통해 통신하는 또 다른 인기 있는 마이크로서비스 패턴입니다.
서비스별 데이터베이스 패턴은 격리를 제공하지만 데이터 일관성과 무결성에 대한 신중한 고려도 필요합니다.
이 패턴은 다음과 같습니다.
서비스 패턴당 데이터베이스
18. 비동기 메시징
마이크로서비스 간의 동기 통신 대신, 비동기 메시징 패턴은 메시지 큐를 사용하여 비동기 통신을 용이하게 합니다. 이를 통해 시스템 응답성과 확장성을 개선할 수 있습니다.
동기 메시징과 비동기 메시징의 차이점을 보여주는 훌륭한 다이어그램이 있습니다.
비동기 메시징 패턴
19. 무국적 서비스
마이크로서비스를 무상태로 설계하면 확장성과 회복성이 간소화됩니다. 각 서비스는 저장된 상태에 의존하지 않고 독립적으로 요청을 처리하므로 수평적으로 확장하기가 더 쉽습니다.
다음은 Stateless Services와 Stateful Services의 차이점을 보여주는 훌륭한 다이어그램입니다.
무국적 서비스
시스템 설계 인터뷰 리소스
그리고, 시스템 설계 인터뷰를 더 잘 준비하기 위해 확인할 수 있는 최고의 시스템 설계 서적, 온라인 과정, 연습 웹사이트에 대한 저의 엄선된 목록이 있습니다. 이러한 과정의 대부분은 제가 여기에서 공유한 질문에 대한 답변도 제공합니다.
DesignGuru의 Grokking 시스템 설계 과정 : 시스템 설계 기술을 강화하기 위한 실습 연습과 실제 시나리오를 갖춘 대화형 학습 플랫폼입니다.
알렉스 쉬(Alex Xu) 지음 "시스템 설계 인터뷰" : 이 책은 시스템 설계 개념, 전략, 인터뷰 준비 팁에 대해 심층적으로 살펴봅니다.
Martin Kleppmann의 "데이터 집약적 애플리케이션 설계" : 확장 가능하고 안정적인 시스템을 설계하기 위한 원칙과 관행을 다루는 포괄적인 가이드입니다.
LeetCode 시스템 설계 태그 : LeetCode는 기술 인터뷰 준비를 위한 인기 있는 플랫폼입니다. LeetCode의 시스템 설계 태그에는 연습할 수 있는 다양한 질문이 포함되어 있습니다.
GitHub의 "시스템 설계 입문서" : 시스템 설계 면접을 준비하는 데 도움이 되는 기사, 책, 비디오 등의 엄선된 리소스 목록입니다.
Educative의 시스템 설계 과정 : 시스템 설계 기술을 강화하기 위한 실습 연습과 실제 시나리오를 갖춘 대화형 학습 플랫폼입니다.
높은 확장성 블로그 : 트래픽이 많은 웹사이트와 확장 가능한 시스템의 아키텍처에 대한 기사와 사례 연구를 소개하는 블로그입니다.
YouTube 채널 : "Gaurav Sen" 및 "Tech Dummies"와 같은 채널에서 시스템 설계 개념과 인터뷰 준비에 대한 통찰력 있는 영상을 확인하세요.
ByteByteGo : Alex Xu가 시스템 설계 인터뷰 준비를 위해 만든 라이브 북과 코스입니다. 여기에는 시스템 설계 인터뷰 책 1권과 2권의 모든 내용이 포함되어 있으며 곧 나올 3권으로 업데이트될 예정입니다.
Exponent : Amazon과 Google과 같은 FAANG 기업을 위한 면접 준비를 위한 전문 사이트입니다. 또한 훌륭한 시스템 설계 과정과 FAANG 면접에서 성공하는 데 도움이 되는 많은 다른 자료가 있습니다.
시스템 설계를 준비하는 방법
image_credit - 바이트바이트고
개발자가 알아야 할 일반적인 마이크로서비스 패턴과 개념 에 대한 모든 내용입니다 . 이러한 마이크로서비스 패턴은 분산 시스템을 구축하고 유지 관리하는 데 관련된 다양한 과제를 해결하고, 통신, 내결함성, 데이터 관리 및 확장성을 위한 솔루션을 제공하는 데 도움이 됩니다.
마이크로서비스 아키텍처를 설계할 때 이러한 패턴을 신중하게 결합하면 견고하고 탄력적인 시스템을 만들 수 있습니다.
이러한 추가적인 마이크로서비스 패턴을 신중하게 적용하면 회복성, 확장성 및 유지 관리성이 뛰어난 분산 시스템을 구축하는 데 도움이 됩니다.
패턴의 선택은 마이크로서비스 아키텍처의 설계와 구현 중에 직면하는 구체적인 요구 사항과 과제에 따라 달라집니다.