책 소개
요약
현대 소프트웨어를 설계하고 개발, 운영할 때 반드시 이해해야 하는 클라우드 네이티브 패턴의 전반적인 개념과 사례를 다룬다. 고도로 분산되고 가상화된 클라우드 환경에서는 변화와 변경에 잘 대응하는 소프트웨어를 설계하고 개발해야 한다. 이 책은 이러한 현대의 기술 환경 요구사항에 맞춰 클라우드 네이티브 애플리케이션의 멘탈 모델과 함께 구축을 지원하는 패턴, 사례 및 도구를 제시하고 있으며 앱, 데이터, 서비스, 라우팅 등을 다루는 실사례와 전문가의 조언이 포함돼 있다. 이 책을 끝마칠 즘 현대 소프트웨어가 갖춰야 하는 기본 특성을 이해할 수 있고, 독자의 경험은 이에 적합한 아키텍처를 설계하는 데 큰 밑바탕이 될 것이다.
추천의 글
이 책은 이론과 실습 간의 차이를 줄여주는데, 사실 소수의 사람들만 이런 책을 쓸 수 있다고 생각한다. 코넬리아 데이비스는 박사 과정 학생으로서 수년 동안 프로그래밍 언어를 공부했고, 함수형 프로그래밍(functional programming)과 불변성(immutability)에 대한 열정을 보여줬으며, 대형 소프트웨어 시스템에서 수십 년간 일했고 대규모 소프트웨어 조직이 위대한 성과를 거두는 데 도움을 줬다.
지난 5년 동안 종종 CQRS와 이벤트 소싱(event sourcing), LISP와 클로저(Clojure), 명령형 프로그래밍(imperative programming)과 상태(state) 처리의 위험성, 심지어 재귀(recursion)와 같은 간단한 주제에 관해 그에게 도움을 요청하고 조언을 구했다.
이 책을 읽는 것이 아주 보람 있는 이유는 코넬리아가 패턴으로만 이야기를 시작하지 않기 때문이다. 처음에는 원칙으로 시작해서 논쟁, 때로는 논리, 때로는 플로차트를 이용해 타당성을 증명한다.
코넬리아는 이론에 만족하지 않고 자바(Java)와 스프링(Spring)으로 이런 패턴을 구현하고 거듭 반복해서 학습한 내용을 통합한다.
나는 이 책이 재미있고 교육적이라는 점을 알게 됐고, 이전에는 단순히 대략적으로만 이해했던 주제에 대해 엄청나게 많은 것을 배웠다. 이제 이 지식을 실행에 옮길 수 있다는 것을 증명하고 싶어서 클로저로 그의 예제를 구현하고자 노력하고 있다.
여러분이 기뻐하면서 어쩌면 깜짝 놀랄 만한 개념들을 발견할 수 있을 것이라 생각한다. 내게 중요한 개념 중 하나는 교차 관심사(cross-cutting concern)를 중앙화할 필요가 있다는 것이었는데, 이는 관점지향 프로그래밍(aspect-oriented programming), 쿠버네티스 사이드카(Kubernetes sidecar), 스프링 재시도 주입(Spring Retry injection)의 활용 여부였다.
이 책을 읽는 독자들도 나만큼 보람을 느끼길 바란다!
- 진 킴(Gene Kim)/ 연구자이자 『The Phoenix Project』(IT Revolution Press, 2018), 『데브옵스 핸드북』(에이콘, 2018), 『ACCELERATE』(IT Revolution Press, 2018)의 공동 저자
이 책에서 다루는 내용
■ 클라우드 네이티브 앱의 생명 주기
■ 클라우드 규모의 설정 관리
■ 무중단 업그레이드, 버전화된 서비스, 병렬 배포
■ 서비스 탐색과 동적 라우팅
■ 재시도와 서킷 브레이커 등과 같은 서비스 간 상호 작용 관리
이 책의 대상 독자
‘클라우드’로 가는 것은 ‘애플리케이션을 어디에 배포하는가’보다 ‘애플리케이션을 어떻게 설계하는가’에 더 중점을 둔다. 이 책은 동적이고 분산된 가상화 클라우드 환경에서 성공할 수 있는 강력한 애플리케이션을 개발하기 위한 지침을 제시한다. 클라우드 네이티브 애플리케이션의 멘탈 모델과 함께 구축을 지원하는 패턴, 사례, 도구를 제시하며 앱, 데이터, 서비스, 라우팅 등을 다루는 실사례와 전문가의 조언이 들어있다.
이 책은 기본적으로 아키텍처를 다루며, 여기에 포함된 설계 관련 논의를 지원하는 코드 예제를 포함한다. 독자는 여기서 다루는 패턴과 과거에 적용했을 법한 방법의 차이를 언급한다는 점을 알게 될 것이다. 그러나 과거 패턴에 대한 경험이나 지식은 필요하지 않다. 패턴 자체뿐만 아니라 그 패턴에 대한 동기, 그리고 그것이 적용되는 맥락의 뉘앙스를 다루고 있으므로, 독자는 소프트웨어 업계에서 쌓은 경력과 상관없이 중요한 가치를 발견할 수 있다.
책 전반에 걸쳐 많은 코드 예제가 제시되지만 프로그래밍 책은 아니다. 또한 기본적인 사항을 모르더라도 프로그래밍하는 법을 가르쳐주지는 않는다. 코드 예시는 자바로 돼 있지만, 어떤 언어로든 자신의 경험을 통해 문제없이 따라갈 수 있을 것이다. 특히 HTTP를 통한 클라이언트/서비스 상호작용에 대한 기본 지식을 갖췄다면 도움이 되지만 반드시 필요하지는 않다.
이 책의 구성
이 책은 두 개의 부와 12개의 장으로 구성돼 있다.
첫 번째 부는 클라우드 네이티브 컨텍스트를 정의하고 소프트웨어가 배포되는 환경의 특징을 설명한다.
1장에서는 클라우드 네이티브를 정의하고 클라우드와 구분한다. 이로써 이후 설명할 패턴에 관해 구축 가능한 멘탈 모델을 제시한다. 이 모델의 엔티티(entity)는 앱/서비스, 서비스 간의 상호작용, 데이터다.
2장에서는 클라우드 네이티브 운영을 설명한다. 회피 불가능한 모든 장애 상황에서 클라우드 네이티브 소프트웨어를 프로덕션(production) 환경에서 실행하는 데 사용하는 패턴과 사례를 설명한다.
3장에서는 클라우드 네이티브 플랫폼을 소개한다. 이 플랫폼은 두 번째 부에 제시된 많은 패턴을 지원하고 구현을 제공하는 개발 및 실행 환경이다. 앞으로 설명할 모든 패턴을 이해하는 것은 중요하지만, 모든 패턴을 직접 구현할 필요는 없다.
두 번째 부에서는 클라우드 네이티브 패턴 자체를 심도 있게 논의한다.
4장에서는 클라우드 네이티브 상호작용을 다루고 있으며, 데이터를 약간 추가해 친숙한 요청/응답 방식의 대안으로 이벤트 기반 통신을 소개한다. 이벤트 기반 통신은 오늘날 대부분의 소프트웨어에서 거의 보편화됐지만, 이벤트 기반 접근법은 고도로 분산된 클라우드 네이티브 소프트웨어에 상당한 이점을 제공하는 경우가 많으며, 독자는 이후에 나올 패턴을 공부할 때 두 프로토콜을 모두 고려하는 것이 중요하다.
5장에서는 클라우드 네이티브 앱/서비스와 데이터의 관계를 설명한다. 앱이 다중 인스턴스로 배포되거나 때로는 상당한 규모로 배포되는 방법, 앱을 상태 비저장(stateless)으로 만드는 이유와 방법, 특수한 상태 저장 서비스(stateful service)에 바인딩하는 방법을 다룬다.
6장에서는 클라우드 네이티브 앱/서비스를 살펴보며, 광범위하게 분산된 인프라에 많은 인스턴스가 배포될 때 애플리케이션 환경 설정을 일관되게 유지할 수 있는 방법을 다룬다. 또한 실행 중인 환경이 끊임없이 변경될 때 애플리케이션 환경 설정을 적절하게 적용하는 방법도 알아본다.
7장에서는 클라우드 네이티브 앱/서비스를 살펴보며, 애플리케이션 생명 주기와 롤링 업그레이드 및 블루/그린 업그레이드를 포함한 수많은 무중단 업그레이드 사례를 다룬다.
8장에서는 클라우드 네이티브 상호작용을 소개한다. 서비스가 끊임없이 이동하는 동안에도 앱이 필요한 서비스를 찾을 수 있는 방법(서비스 탐색), 그리고 요청이 궁극적으로 올바른 서비스로 가는 길을 찾는 방법(동적 라우팅, dynamic routing)에 초점을 맞춘다.
9장에서는 상호작용의 클라이언트 측면에 초점을 맞춘 클라우드 네이티브 상호작용을 살펴본다. 상호작용 다중화(interaction redundancy)가 필요한 이유를 설명하고 재시도(최초 요청이 실패할 경우 반복되는 요청)를 소개한 후, 재시도를 단순히 적용했을 때 발생할 수 있는 문제와 그 문제를 피하는 방법을 다룬다.
10장에서는 상호작용의 서비스 측면에 초점을 맞춘 클라우드 네이티브 상호작용을 살펴본다. 상호작용을 시작하는 클라이언트가 책임감 있게 동작하더라도, 서비스는 여전히 오용(misuse)되거나 과도한 트래픽에 압도당하지 않도록 보호해야 한다. 또한 API 게이트웨이와 서킷 브레이커도 다룬다.
11장에서는 앱과 상호작용 둘 다 살펴보며, 소프트웨어를 구성하는 분산 시스템의 동작과 성능을 관측하기 위한 방법을 다룬다.
12장에서는 데이터를 다루며, 클라우드 네이티브 소프트웨어를 구성하는 서비스간 상호작용에서의 중요한 시사점을 살펴본다. 기존의 모놀리식 데이터베이스(monolithic database)였던 것을 분산된 데이터 구조(fabric)로 분할하는 패턴을 다루며, 궁극적으로 이 책의 두 번째 부 앞부분에서 설명하는 이벤트 기반 패턴으로 되돌아간다.
상세 이미지
목차
목차
- 1부. 클라우드 네이티브 컨텍스트
- 1장. ‘클라우드 네이티브’로 정의한 단어 계속 사용하기
- 1.1 오늘날 애플리케이션 요구 사항
- 1.1.1 무중단
- 1.1.2 짧아진 피드백 주기
- 1.1.3 모바일과 멀티 디바이스 지원
- 1.1.4 사물 인터넷이라고 알려진 커넥티드 디바이스
- 1.1.5 데이터 기반
- 1.2 클라우드 네이티브 소프트웨어 소개
- 1.2.1 ‘클라우드 네이티브’의 정의
- 1.2.2 클라우드 네이티브 소프트웨어 멘탈 모델
- 1.2.3 클라우드 네이티브 소프트웨어의 작동
- 1.3 클라우드 네이티브와 세계 평화
- 1.3.1 클라우드와 클라우드 네이티브
- 1.3.2 클라우드 네이티브가 아닌 것은 무엇인가?
- 1.3.3 클라우드 네이티브는 훌륭히 동작한다
- 요약
- 요약
- 2장. 프로덕션 환경에서 클라우드 네이티브 애플리케이션 실행
- 2.1 장애물들
- 2.1.1 스노우플레이크
- 2.1.2 위험한 배포
- 2.1.3 변화는 예외다
- 2.1.4 프로덕션 설치성
- 2.2 조력자
- 2.2.1 지속적인 딜리버리
- 2.2.2 반복성
- 2.2.3 안전한 배포
- 2.2.4 변화는 비일비재하다
- 요약
- 요약
- 3장. 클라우드 네이티브 소프트웨어 플랫폼
- 3.1 클라우드(네이티브) 플랫폼 진화
- 3.1.1 클라우드로부터 시작됐다
- 3.1.2 클라우드 네이티브 발신음
- 3.2 클라우드 네이티브 플랫폼의 핵심 원리
- 3.2.1 먼저 컨테이너를 이야기해보자
- 3.2.2 ‘지속적인 변화’에 대한 지원
- 3.2.3 ‘고도로 분산’에 대한 지원
- 3.3 누가 무엇을 합니까?
- 3.4 추가적인 클라우드 네이티브 기능
- 3.4.1 SDLC 전체를 지원하는 플랫폼
- 3.4.2 보안, 변경 제어, 규정 준수(제어 기능)
- 3.4.3 컨테이너에 들어가는 내용 제어
- 3.4.4 업그레이드와 취약성 패치
- 3.4.5 변경 제어
- 요약
- 요약
- 2부. 클라우드 네이티브 패턴
- 4장. 이벤트 기반 마이크로서비스: 단순히 요청/응답만을 의미하지 않는다
- 4.1 우리는 (보통) 명령형 프로그래밍을 배운다
- 4.2 이벤트 기반 컴퓨팅 재도입
- 4.3 나의 글로벌 요리책
- 4.3.1 요청/응답
- 4.3.2 이벤트 기반
- 4.4 명령 쿼리 책임 분리(CQRS) 소개
- 4.5 다른 스타일, 유사한 도전 과제
- 요약
- 5장. 앱 다중화: 수평 확장과 상태 비저장
- 5.1 많은 인스턴스를 배포하는 클라우드 네이티브 앱
- 5.2 클라우드 환경에서의 상태 저장 앱
- 5.2.1 모놀리식 분해와 데이터베이스 바인딩
- 5.2.2 부적절한 세션 상태 처리
- 5.3 HTTP 세션과 스티키 세션
- 5.4 상태 저장 서비스와 상태 비저장 앱
- 5.4.1 상태 저장 서비스는 특별하다
- 5.4.2 앱을 상태 비저장으로 만들기
- 요약
- 요약
- 6장. 애플리케이션 설정: 그저 환경 변수만을 의미하지 않는다
- 6.1 왜 설정까지 이야기해야 할까?
- 6.1.1 앱 인스턴스의 수를 증가시키거나 감소시키는 동적 스케일링
- 6.1.2 인프라 변경으로 인한 설정 변경
- 6.1.3 다운타임 없이 애플리케이션 설정 업데이트하기
- 6.2 앱의 설정 계층
- 6.3 시스템/환경 값 주입하기
- 6.3.1 설정을 위해 환경 변수를 사용하는 방법을 자세히 알아보기
- 6.4 애플리케이션 설정 주입
- 6.4.1 구성 서버 소개
- 6.4.2 보안은 더 많은 요구 사항을 추가
- 6.4.3 동작 보기: 구성 서버를 사용한 애플리케이션 설정
- 요약
- 요약
- 7장. 애플리케이션 생명 주기: 지속적인 변경에 대한 설명
- 7.1 운영에 대한 공감대 형성
- 7.2 단일 애플리케이션 생명 주기, 다중 인스턴스 생명 주기
- 7.2.1 블루/그린 배포
- 7.2.2 롤링 업그레이드
- 7.2.3 병렬 배포
- 7.3 서로 다른 앱 생명 주기 전반에서 조율
- 7.4 실행해보기: 자격 증명 변경과 앱 생명 주기
- 7.5 생명 주기가 짧은 런타임 환경 처리
- 7.6 앱 생명 주기 상태 가시성
- 7.6.1 실행해보기: 헬스 엔드포인트와 프로브
- 7.7 서버리스
- 요약
- 요약
- 8장. 앱에 접근하기: 서비스, 라우팅, 서비스 탐색
- 8.1 서비스 추상화
- 8.1.1 서비스 사례: 구글링
- 8.1.2 서비스 사례: 블로그 수집기
- 8.2 동적 라우팅
- 8.2.1 서버 측 로드 밸런싱
- 8.2.2 클라이언트 측 로드 밸런싱
- 8.2.3 라우팅 최신화
- 8.3 서비스 탐색
- 8.3.1 웹에서의 서비스 탐색
- 8.3.2 클라이언트 측 로드 밸런싱을 이용한 서비스 탐색
- 8.3.3 쿠버네티스에서 서비스 탐색
- 8.3.4 실제로 구현해보기: 서비스 탐색 활용
- 요약
- 요약
- 9장. 상호작용 이중화: 재시도와 기타 제어 루프
- 9.1 재시도 요청
- 9.1.1 기본 요청 재시도
- 9.1.2 실행해보기: 단순 재시도
- 9.1.3 재시도: 무엇이 잘못될 수 있는가?
- 9.1.4 재시도 폭풍 생성
- 9.1.5 실행해보기: 재시도 폭풍 생성
- 9.1.6 재시도 폭풍 방지: 친절한 클라이언트
- 9.1.7 실행해보기: 친절한 클라이언트 되기
- 9.1.8 재시도하지 않을 때
- 9.2 폴백 로직
- 9.2.1 실행해보기: 폴백 로직 구현
- 9.3 제어 루프
- 9.3.1 제어 루프의 유형 이해
- 9.3.2 제어 루프 제어
- 요약
- 요약
- 10장. 프론트 서비스: 서킷 브레이커와 API 게이트웨이
- 10.1 서킷 브레이커
- 10.1.1 소프트웨어 서킷 브레이커
- 10.1.2 서킷 브레이커의 구현
- 10.2 API 게이트웨이
- 10.2.1 클라우드 네이티브 소프트웨어에서 API 게이트웨이 사례
- 10.2.2 API 게이트웨이 토폴로지
- 10.3 서비스 메시
- 10.3.1 사이드카
- 10.3.2 컨트롤 플레인
- 요약
- 요약
- 11장. 트러블슈팅: 건초 더미에서 바늘 찾기
- 11.1 애플리케이션 로깅
- 11.2 애플리케이션 메트릭
- 11.2.1 클라우드 네이티브 애플리케이션에서 메트릭 가져오기
- 11.2.2 클라우드 네이티브 애플리케이션에서 메트릭 밀어 넣기
- 11.3 분산 추적
- 11.3.1 트레이서 출력
- 11.3.2 집킨으로 추적 조합하기
- 11.3.3 구현 상세 내용
- 요약
- 요약
- 12장. 클라우드 네이티브 데이터: 모놀리식 데이터 쪼개기
- 12.1 모든 마이크로서비스는 캐시가 필요하다
- 12.2 요청/응답에서 이벤트 기반으로 이동하기
- 12.3 이벤트 로그
- 12.3.1 실행으로 확인하자: 이벤트 기반 마이크로서비스 구현
- 12.3.2 토픽과 큐의 새로운 점은?
- 12.3.3 이벤트 페이로드
- 12.3.4 멱등성
- 12.4 이벤트 소싱
- 12.4.1 지금까지의 여행
- 12.4.2 진본
- 12.4.3 이벤트 소싱의 구현
- 12.5 우리는 그냥 수박 겉핥기 중이다
- 요약