이 글은 미디엄 게시글 <Good practices for high-performance and scalable Node.js applications Part 3/3 >(https://medium.com/iquii/good-practices-for-high-performance-and-scalable-node-js-applications-part-3-3-c1a3381e1382)를 번역한 게시글입니다.
이전 두 게시글에서 어떻게 하면 Node.js를 수평적으로 확장시킬 수 있고 또 확장 시 어떤 걸 고려하면 좋을지에 대해 이야기했습니다. 이번 게시글에서는 좀더 추가적인 심화 내용에 대한 사례들을 다뤄보겠습니다.
Web and Worker process
Node.js가 효율적으로 일을 처리를 할 수 있는 패턴은 바로 어플리케이션을 구성하는 두 유형의 프로세스들(web process와 worker process)을 간의 reponsibilities들을 분리시키는 것(separation of responsibilities) 이다.
web 프로세스는 들어오는 네트워크 요청들을 주로 관리하거나 최대한 빨리 발송하기 위해 설계되었다. 예를 들어 이메일 알림, 로그 작성 등과 같은 non-blocking 태스크가 수행되어야 하는 경우, web 프로세스는 worker에게 이 작업을 위임한다.
web과 worker 프로세스들 사이 소통은 다양한 방식으로 이뤄진다. 효율적이고 일반적인 방식은 priority queue를 사용하는 것이다.
이 방법의 장점은 web과 worker 프로세스들을 각기 다른 머신들마다 독립적으로 스케일할 수 있다는 점이다.
예를 들어, 만약 어플리케이션이 높은 트래픽을 감당하는데 부수 작업이 절 생성되는 경우, 당신은 worker 프로세스 보다는 web 프로세스를 더 생성하면 된다.
Kue
web과 worker 프로세스들이 서로 소통하기 위해, queue를 사용하면 된다.
Kue는 Node.js의 대중적인 queue 라이브러리 중 하나인데, Redis 기반이다. 이걸 쓰면 다른 머신의 프로세스들끼리도 소통할 수 있다.
어떤 유형의 프로세스도 job을 생성하여 queue에 추가할 수 있고, worker 프로세스들은 job들을 골라서 실행한다. job에 대해 priority, TTL, delay 등 여러가지 옵션을 사용할 수 있다.
더 많은 프로세스를 만들 수록, 병렬 Throughput(처리량)이 증가한다.
Cron
주기적으로 수행되는 유형의 작업들은 cron job으로 OS 레벨에서 수행할 수 있다.
우리의 어플리케이션을 새로운 머신에 배포할 때 이러한 방식은 추가 작업을 요구하기 때문에 꽤나 불편하다.
간편하게 하려면 NPm의 cron module을 사용하면 된다. 이 모듈은 Node.js코드 안에서 cron jobd을 생성할 수 있다.
queue를 사용하는 것은 더 클린하고 여러 기능들을 사용할 수 있다.
그런데 워커 프로세스가 하나 이상 있는 경우 문제가 발생한다. 왜냐하면 크론 기능은 모든 시간에 모든 프로세스를 꺠워서 queue를 복제하여 중복으로 작업을 수행할 것이다.
이러한 문제를 방지하기 위해선 단일 워커 프로세스를 지정하여 cron 작업을 수행하도록 하면 된다.
Leader election and cron-cluster
이 문제는 leader election이라는 문제와 관련된 것인데, cron-cluster라는 npm 패키지를 사용하여 해결한다.
이것은 크론 모듈을 켜는 동일한 API를 노출시키는데, 셋업 기간동안 이는 redis 연결을 요구한다. 왜냐하면 다른 프로세스와 통신하고 leader election algorithm을 수행해야 하기 때문이다.
redis를 단일 truth source로 사용하면서, 모든 프로세스는 어떤 프로세스가 cron을 실행할 것인지 동의하고, 그중 하나만 그 작업을 수행하도록 할 것이다.
Caching API Calls
서버 사이드 캐싱은 API 호출의 퍼포먼스와 대응성을 향상시키는 일반적인 방법이다. 그러나 이에 대한 접근 방법은 참 다양하다.
만약 분산된 시스템 환경일 경우, 레디스를 사용하는 것이 가장 적절할 것이다.
캐싱에 대해 고려해야 할 가장 어려운 부분은 무효로 되는 부분이다. 빠르지만 깔끔하지 않는 방법은 시간 엄수에는 좋지만 TTL로 인해 값이 날라가는 경우가 종종있다.
'Research > Node.js' 카테고리의 다른 글
npm_Package.json 파일 해석 (0) | 2023.03.23 |
---|---|
Node.js 성능 향상 전략에 대한 고민 (0) | 2023.03.01 |
nodejs_번역_고성능 및 확장 가능한 Node.js 어플리케이션에 대해 - 2 (0) | 2023.02.28 |
nodejs_번역_고성능 및 확장 가능한 Node.js 어플리케이션에 대해 - 1 (0) | 2023.02.28 |
Node.js stress test tool (0) | 2023.02.06 |
댓글