Web Architecture 101에서 저자는 다음과 같이 11가지의 아케틱처 개념들을 설명하고 있다.
위 다이어그램은 저자가 속한 Storyblocks의 아키텍처를 나타낸 것이다. 예시를 바탕으로 위 다이어그램을 따라가보자.
DNS(Domain Name Server)는 월드 와이드 웹을 가능하게 해주는 기술이다. 가장 기본적인 수준의 DNS는 도메인 이름(google.com)에서 해당하는 IP주소로의 키/값 조회를 제공한다. 즉, 컴퓨터의 요청을 해당 키에 맞는 적절한 서버 IP로 보내주는 것이다.
로드 밸런싱에 대해 자세히 알아보기 전에, 수평적 vs 수직적 애플리케이션 확장(scaling)에 관해서 얘기해보자. StackOverflow의 답변에 따르면 수평적 확장은 더 많은 장치를 새로 추가하는 것이고, 수직적 확장은 이미 사용하고 있던 장치의 성능을 업그레이드 하는 것이다. 이때, 웹 개발에서는 대부분 수평적 확장을 원한다. 이유는 다음과 같다.
로드 벨런서는 이러한 수평 확장을 가능하게 하는 기술이다. 로드 밸런서는 들어오는 요청을 복제/미러링된 많은 서버 중 하나로 연결하고 서버의 응답을 다시 클라이언트로 보내는 역할을 한다. 이 떄, 각 서버에 과부하가 걸리지 않도록 요청을 적절히 분배해주는 일을 하는 것이다.
웹 애플리케이션 서버는 사용자들의 요청을 처리하고 결과를 HTML에 담아 사용자의 브라우저로 다시 보내는 핵심 비즈니스 로직을 실행한다. 이를 위해 DB, 캐시, 잡큐 등 다양한 백엔드 인프라와 데이터를 주고받아야 한다.
앱 서버 구현을 위해서는 특정 언어(Node.sj, Ruby, PHP, Scalal, Java, ..)와 해당 언어에 대한 웹 MVC 프레임워크(Express for Node.js, Ruby on Rail, Play for Scala, Laravel for PHP, …)를 선택해야 한다.
모든 최신 웹 애플리케이션은 하나 이상의 데이터베이스를 활용하여 정보를 저장한다. 데이터베이스는 데이터 구조를 정의하고, 데이터를 삽입/찾기/수정/삭제/연산 등의 역할을 한다.
캐싱 서비스는 정보를 거의 O(1) 시에 정보를 저장하고 조회할 수 있는 간단한 키/값 형태의 데이터 저장소를 제공한다. 프로그램은 이 캐싱 서비스를 활용하여 비용이 많이 드는 계산 결과를 저장함으로써 다음 번 검색에서의 효율을 높인다.
애플리케이션은 데이터베이스 쿼리, 외부 서비스 호출 결과, 지정된 URL의 HTML 등을 캐시에 저장한다. 실무에서는 다음과 같이 사용된다.
가장 널리 사용되는 캐싱 서버 스택은 Redis와 Memcache이다.
대부분의 웹 애플리케이션은 사용자 요청에 대한 응답과는 직접적인 관련이 없는 작업을 백그라운드에서 비동기적으로 실행할 필요가 잆다. 예를 들어, 구글의 검색 엔진은 비동기적으로 (정기적으로) 웹을 크롤링하고 있으며, 누군가 검색을 요청하면, 이러한 결과를 보여준다.
비동기 작업에 가장 널리 사용되는 것이 잡 큐 아키텍처이다. 간단하게 설명하면, 잡 서버는 큐에서 할 일이 있는지 확인하고, 있다면 큐에서 잡을 뽑아내어 실행한다.
많은 웹 앱에서는 사용자가 텍스트를 입력(쿼리)하면, 검색을 하고 가장 관련있는 결과를 보여주는 기능을 제공한다. 이 기능이 바로 전체 텍스트 검색 서비스이다. 전체 텍스트 검색에서는 쿼리 키워드를 포함하는 문서를 빨리 찾기 위해 inverted index를 활용한다.(아래 그림을 보면, in
the
with
와 같은 것들은 포함되지 않는다.)
오늘날 가장 인기 있는 검색 플랫폼은 Elasticsearch이지만, Sphinx 또는 Apache Solr와 같은 많은 선택지도 있다.
앱이 특정 규모에 도달하면, 별도의 애플리케이션으로 실행되도록 ‘서비스’가 생기게 된다. 서비스는 외부에 바로 노출되진 않지만, 다른 앱들과 연동된다.
오늘날 거의 모든 앱들은 일정 규모에 도달하면 데이터 파이프라인을 활용하여 데이터 수집, 저장 및 분석을 할 수 있도록 한다. 일반적으로 데이터 파이프라인은 3단계를 거친다.
위에서 제시한 다이어그램에서 표시되지 않은 또 다른 단계는 바로 서비스의 운영 데이터베이스에서 데이터 웨어하우스로 데이터를 로드하는 과정이다.
AWS에서는 클라우드 스토리지를 인터넷을 통해 데이터를 저장, 접근, 공유할 수 있는 단순하고 확장성 있는 방법이라고 말한다. RESTful API와 HTTP를 사용하여 언제든지 클라우드에 접근하고 저장할 수 있다.
대표적인 플랫폼으로는 아마존 S3가 있다.
CDN(Content Delivery Network)는 지리적으로 분산된 여러 개의 서버이다. 웹 콘텐츠를 사용자와 가까운 곳에서 전송함으로써 전송 속도를 높인다. HTML, CSS, javascript, image와 같은 정적인 데이터를 수 많은 엣지(edge) 서버에 분산시키는 형태로 동작한다.
Reference