Skip to content

기술 특장점

ohmink edited this page Dec 21, 2020 · 1 revision

기술 특장점

Server

에러 로그 수집 및 실시간 분석에 MongoDB를 효율적으로 활용

server_stack_image

  • 에러로그 저장과 실시간 분석을 효율적으로 진행하기 위해 mongoDB를 사용하였습니다.
  • sdk로부터 수집되는 에러 이벤트 로그를 저장하고 aggregation을 통한 실시간 로그 분석한 결과를 그래프 데이터로 반환하는 api를 구현하였습니다.
  • MongoDB의 queryplanner을 활용하여 쿼리의 성능을 분석한 결과를 바탕으로 인덱싱을 적용하여 MongoDB 쿼리 성능을 향상시켰습니다.
  • Mongoose ODM을 통해 model schema를 정의하여 각 collection의 document 데이터 구조의 일관성을 유지하여 schemaless DB로서의 단점을 보완하였습니다.

Docker를 활용한 효율적인 개발/배포환경 구성

docker_image

  • 프론트엔드, 백엔드 ,DB, 모두 도커(Docker) 컨테이너화하여 인프라 구성/변경 및 배포를 쉽게 하도록 구성했습니다.

  • docker-compose와 DockerFile를 통해 다음 작업을 자동으로 실행합니다.

    • 프론트엔드 : 리액트 빌드 및 Nginx 환경설정 적용후 도커이미지 빌드 및 자동 컨테이너 실행
    • 백엔드 : express + pm2 클러스터 모드로 구성된 도커이미지 빌드 및 자동 컨테이너 실행
    • DB : mongoDB 이미지 다운로드 후 DB 환경설정 적용하여 컨테이너 실행

서버 이중화 및 로드밸런싱 적용

  • 서버 이중화와 Nginx의 로드밸런서를 활용한 부하 분산

    • express + pm2 클러스터 모드로 구성된 api 서버 두대를 사용하여 이중화
    • Nginx를 리버스 프록시로 사용하여 모든 요청은 80번 포트로 받도록 설정
    • Nginx가 포트 80번으로 오는 모든 요청중 /api에 해당하는 요청은 백엔드 서버 컨테이너 두곳으로 분배하여 부하를 분산
    • 로드 밸런싱 알고리즘은 라운드 로빈 방식, 두 서버에 균등하게 트래픽 분배
      • 라운드 로빈 : 클라이언트의 요청을 순서대로 분배하는 방식

Express.js+PM2를 통해 Express.js 서버 성능 및 안정성 향상

  • Node.js 프로세스 매니저인 PM2 사용

    • Node.js가 하나의 코어만을 활용하여 서버의 CPU를 온전히 활용하지 못하는 것을 방지
    • 프로세스 상태를 안정적으로 관리
  • 여러 개의 expres.js 서버 프로세스를 클러스터 모드로 생성

    • 성능과 안정성을 향상
    • 클러스터 모드로 동작시키기 위해 express.js 서버를 stateless하게 구현
    • 동작하는 서버의 CPU 코어에 비례하도록 인스턴스 실행

Admin(Front)

admin_stack_image

웹팩&바벨

  • 웹팩을 모듈 번들러로 사용해 코드를 하나의 파일로 압축시켰습니다.
  • 바벨을 사용해 다양한 브라우저 환경에서도 코드가 정상적으로 동작하도록 했습니다.
  • gzip 압축을 통해 번들링된 파일 크기를 크게 줄여 초기 로딩시간을 개선했습니다.

SDK

  • Node, Broswer 환경 모두에서 에러를 수집할 수 있습니다.
  • 공통 기능을 담당하는 @acent/core와 각 플랫폼을 담당하는 @acent/node, @acent/browser 등을 분리하여 이용자가 효율적으로 사용할 수 있습니다.
  • process 객체를 이용하여 에러를 수집합니다.
  • process의 정보와 os 모듈, 요청 등을 이용하여 에러 환경 및 정보를 수집합니다.
  • window 객체를 이용하여 에러를 수집합니다.
  • window의 정보와 navigator 모듈 등을 이용하여 에러 환경 및 정보를 수집합니다.
  • 사용자가 커스텀으로 처리하는 에러를 수집할 수 있도록 기능을 제공합니다.
  • 프로미스 에러 또한 수집합니다.

flow chart

flow

Clone this wiki locally