가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 서비스 규모가 커지고 저장할 데이터가 많아지면 데이터베이스에 대한 부하도 증가한다. 이때 우리는 데이터베이스를 증설할 방법을 찾아야 한다. 데이터베이스의 규모 확장 방법은 앞서 살펴본 방법과 동일하게 scale up, scale out이 있다. 수직적 확장(Scale Up) 데이터베이스를 고성능의 자원으로 증설하는 방법이다. AWS RDS는 24TB의 RAM을 제공하는 상품도 있을 만큼 고성능 데이터베이스 서버는 많은 양의 데이터를 보관하고 처리할 수 있다. 하지만 데이터베이스 수직적 확장은 몇 가지 심각한 단점이 있다. 고성능 자원을 무한히 증설할 방법이 없다. 단일 장애 지점이 발생할 위험이 있다. 고성능으로 갈수록 비용이 비싸진다..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 메시지 큐는 메시지의 무손실을 보장하는, 비동기 통신을 지원하는 컴포넌트다. 일반적으로 Kafka나 RabbitMQ 같은 메시지 브로커들을 많이 사용한다. 이들은 메시지 버퍼 역할을 하며 메시지를 비동기적으로 전송한다. 메시지 큐의 기본 아키텍처 메시지 큐의 기본 아키텍처는 아주 간단하다. 입력 서비스(생산자 또는 발행자)가 메시지를 만든다. 해당 메시지를 메시지 큐에 발행(publish)한다. 소비자 또는 구독자가 해당 메시지를 받아 그에 맞는 동작을 수행한다. 메시지 큐의 강점 메시지 큐를 이용하면 서비스 또는 서버 간 결합이 느슨해져, 규모 확장성이 보장되어야 하는 안정적 애플리케이션을 구성하기 좋다. 생산자는 소비자의 서비스가 ..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 가용성을 높이고 전 세계 어디서도 쾌적한 서비스를 위해서는 여러 데이터 센터를 지원하는 것이 필수다. 일반적으로 사용자는 가장 가까운 데이터 센터로 안내되는데, 이를 지리적 라우팅이라 부른다. 데이터 센터 지리적 라우팅에서의 geoDNS는 사용자의 위치에 따라 도메인 이름을 어떤 IP 주소로 변환할지 결정한다. 지리적 라우팅을 통해 각 데이터센터로 트래픽이 분산되어 안전한 시스템을 구성할 수 있다. 만약 데이터 센터 1에 장애가 발생해도 모든 트래픽은 장애가 없는 데이터 센터 2로 전송된다. 다중 데이터 센터 구성 시 고려사항 다중 데이터 센터 아키텍처를 구성하기 위해선 몇 가지 기술적 난제를 해결해야 한다. 어떤 기술적 난제가 있는지..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 웹 계층을 수평적으로 확장하기 위해서는 세션 데이터와 같은 상태 정보를 웹 계층에서 제거해야 한다. 이를 고려하지 않고 웹 계층을 확장하면 엉뚱한 상태 정보를 반환하는 상황이 생길 수 있기 때문이다. 웹 계층을 수평적으로 확장하는 바람직한 전략은 상태 정보를 RDBMS나 NoSQL 같은 저장소에 보관하고 필요할 때 가져오는 것이다. 이렇게 구성된 웹 계층을 무상태 웹 계층이라고 한다. 무상태 웹 계층 상태 정보 의존적 아키텍처 일반적으로 서버는 클라이언트의 상태 정보를 보관하여 요청들 사이에 상태가 유지되도록 한다. 그림과 같이 사용자 A에 대한 상태 정보는 서버 1에 저장된다. 따라서 사용자 A를 인증하기 위해선 반드시 서버 1로 H..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 앞서 웹 계층과 데이터 계층의 규모에 따른 시스템 설계를 살펴봤으니, 응답 시간을 개선하는 방법에 대해 알아보자. 응답 시간은 캐시와 콘텐츠 전송 네트워크(CDN)를 이용해 개선할 수 있다. 캐시란? 캐시는 비싼 연산이나 자주 조회되는 데이터를 메모리에 올려두는 임시 저장소다. 접근 시간이 오래 걸리는 반복 요청이나 값을 다시 계산하는 비용을 줄이고 싶은 경우 유용하다. 웹 서비스는 데이터베이스 호출 빈도에 따라 성능이 크게 좌우되기 때문에 캐시를 잘 활용하면 성능을 유의미하게 올릴 수 있다. 캐시 계층 캐시 계층은 데이터가 잠시 보관되는 곳으로 데이터베이스에 접근하는 것보다 훨씬 빠르다. 별도의 캐시 계층을 두면 이미 캐시에 데이터가..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다. 한 명의 사용자를 지원하는 시스템에서부터 수 백만 사용자를 지원하는 시스템을 만드는 방법을 알아보기 앞서 기본적으로 사용자의 요청이 처리되는 과정을 이해할 필요가 있다. 다음은 가장 단순한 단일 서버에서 사용자의 요청이 처리되는 과정을 나타낸다. 사용자의 요청이 처리되는 과정 사용자가 웹 브라우저에 URL을 입력한다. 입력된 URL 정보는 DNS에서 IP 주소로 변환되어 반환된다. 반환된 IP 주소를 가진 웹 서버로 HTTP 요청이 전달된다. 요청받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다. 사용자 수에 따른 시스템 설계 만약 단 한 명의 사용자만 이용하는 시스템이라면 위와 같이 웹 앱, 데이터베이스, 캐시 등을 ..
Main 양질의 기술 블로그를 만들자! 2021년 한 해동안 포스팅한 글들을 보면, 거의 대부분이 인터넷 강의나 개발 서적을 공부하고 요약정리한 내용을 다루고 있다. 이러한 콘텐츠를 생산해내는 과정에서 스스로는 많은 학습을 할 수 있었지만, 다른 사람에게 큰 도움이 될 것 같진 않았다. 실제로 블로그 방문 통계만 봐도 실무적인 부분을 다룬 글들이 조회수가 훨씬 높게 나오는 것을 확인할 수 있었다. 그래서 학습 노트 형식의 글 보다 마주했던 문제들을 해결한 경험이나 모범 사례들을 중심으로 콘텐츠를 만들어 보려 한다. 실무적인 부분을 중점적으로 다룬다면 더 많은 분들에게 도움이 될 수 있을 것이라 생각한다. 할 수 있겠지?🥲 2022년에는 주니어 개발자로서 고민이나 성장 방향을 공유하고 실무에 도움이 되는 ..
Java8에 추가된 Stream API는 다량의 데이터 처리나 손쉬운 병렬 처리를 위해 만들어졌다. Stream API는 일반적으로 데이터를 담고 있는 Collection의 개념이 아니라 어떤 시퀀스 요소들의 순차 및 병렬 집계 작업을 지원해주는 API이다. Stream의 특징 스트림이 처리하는 데이터소스를 변경하지 않는다.(원본 데이터를 훼손하지 않는다.) 스트림으로 처리하는 데이터는 오직 한 번만 처리된다. 원소의 유한 혹은 무한 시퀀스를 나타낸다. 요소가 무한인 경우 Short Circuit 메서드로 제한할 수 있다. 근본적으로 지연 평가(Lazy Evaluation)을 사용한다. 이 덕분에 무한 스트림을 다룰 수 있게 된다. 손쉬운 병렬 처리를 지원한다. Stream의 핵심 추상 개념 스트림 파이..
Java8부터는 인터페이스에 추상 메서드 선언뿐만 아니라 구현체를 제공할 수 있게 되었다. default 메서드 dfault 메서드의 필요성 Java8 이전에는 인터페이스에 추상 메서드가 추가되면 해당 클래스를 구현한 모든 클래스에서 다시 재정의를 해줘야 하는 불편함이 있었다. 예를 들어, 다음과 같은 구조를 가진 클래스가 있다고 생각해보자. public interface Printable { void print(); } public class PrintName implements Printable { @Override public void print() { System.out.println("print name"); } } public class PrintAge implements Printable {..