다음은 웹 개발자를 위한 대규모 서비스를 지탱하는 기술을 읽고 정리한 내용입니다 🙌


1. 작업큐(Job-Queue) 시스템

웹 서비스와 요청

본래 웹 서비스의 요청은 동기적으로 실행이 되었는데, 데이터가 축적되어 처리가 무거워지면서 작업큐 시스템을 통해서 나중으로 미뤄도 되는 처리를 비동기로 실행하도록 한다.

예) 특정 url을 북마크 할 때 해당 url의 개요를 얻고 키워드를 추출하고, 카테고리를 판정하는 작업들을 비동기로 처리한다. 그렇지 않으면 북마크를 추가할 때마다 긴 시간이 소요된다.

작업큐 시스템 입문

  • 비동화 하는 방법 → 해당 처리를 독립된 스크립트로 어플리케이션 내부에서 호출한다.
    • 이 방법은 대량의 비동기 처리시 그 수만큼의 프로세스를 실행시키므로 성능상 단점이 될 수 있다.
    • 스크립트 시작과 초기화의 오버헤드가 커서 성능이 좋지 않다.
    • 소규모 어플리케이션에서만 진행하는 것이 좋다.
  • 작업큐와 워커를 세트로 작업큐 시스템을 사용하는 것이 일반적이다.
    • 작업큐에 실행하고자 하는 처리를 등록하고, 워커가 큐에서 작업을 추출해서 처리한다.
    • 작업큐를 통해 일시작인 대량의 처리 등록시 부하의 변동을 흡수한다.
    • 워커가 항상 실행하고 있으므로 처리시 초기화 오버헤드가 거의 없다.


    이미지 출처: 대용량 서비스를 지탱하는 기술


2. 스토리지 선택 - RDBMS 와 key-value 스토어

증가하는 데이터를 어떻게 저장할까 ?

웹 어플리케이션과 스토리지

  • 스토리지란?
    • 데이터를 영속적 혹은 일시적으로 저장하기 위한 기능
  • 원본 데이터는 서비스의 근본적인 신뢰성과 관계되어서 매우 중요하다.
  • 캐시 데이터는 신뢰성보다는 성능을 높이고 비용을 줄일 때 사용된다.
  • 스토리지를 처음부터 잘 선택하는 것이 중요하다. 중간에 변경을 하려는 것은 굉장히 어렵다.

스토리지 선택의 전제조건

  • 평균크기
  • 최대크기
  • 신규추가빈도
  • 갱신빈도
  • 삭제빈도
  • 참조빈도

스토리지의 종류

  • 현재는 크기 4가지 이다.
    • RDBMS
      • SQL 언어로 데이터 조작을 수행하는 시스템
      • 대표적으로 MySQL이 있다.
      • MySQL에서는 SQL을 해석하여 실행하는 블록(서버, 옵티마이저, 캐시버퍼)과 실제 데이터를 보관하는 기능블록(InnoDB와 같은 스토리지 엔진)이 분리되어 있다.
      • 트랜잭션이 필요하고 갱신빈도가 높다면 InnoDB 엔진을 선택하고 추가작업이나 count 등만을 사용하면 MyISAM을 사용하는 등 특징에 맞게 선택해서 사용한다.
        • 그렇지만 하나의 서버에서 두가지 엔진을 사용하는 것은 효율적인 CPU, 메모리 사용이 어렵다.
    • 분산 key-value 스토어 (ex. memcached 등등)
      • 정말 심플한 스토리지 이다.
      • RDBMS에 비해 기능을 부족하지만 성능이 10~100배이다.
      • 분산알고리즘을 사용하기도 하는데 key의 해시값을 서버대수로 나누어서 분산저장하는 방법이나 더 복잡한 방법으로 분산한다.
      • 캐시데이터를 분산 key-value 스토리지에 저장할 수 있다.
    • 분산 파일 시스템
      • 보통 어느 크기 상의 데이터를 저장하는데 적합하다.
    • 그 밖의 스토리지

3. 캐시 시스템

웹 어플리케이션의 부하와 프록시/캐시 시스템

  • 용량이 부족할 때 HTTP 레벨의 캐싱을 포워드 프록시와 리버스 프록시로 진행할 수 있다.

  • 프록시에서 요청에 대한 응답을 캐싱하여 같은 요청이 전달됐을 때 캐싱해둔 응답을 반환할 수 있다.