★ NodeJS의 한계 : Node는 기본적으로 비동기식이여서 여러 요청을 한 번에 처리가 가능하나 HTTP 요청, 파일 시스템 작업, DB 쿼리, 실시간 채팅 애플리케이션 등과 같은 I/O에 작업에는 적합합니다. 하지만 CPU intensive 작업이 필요한 여러 요청을 처리하는데 한계가 있습니다.(CPU intensive 작업 예시 : 암호화 작업 수행, 이미지/비디오/오디오 파일 처리, XML/JSON/YAML, 수학적 계산, 데이터 압축, 기계 학습 모델 등과 같은 대량의 구문 분석)
NodeJs의 한계 극복을 위한 대안책
- Redis : 앱이 로드되는 동안 자주 가져오는 데이터 집합이 있는 경우 HTTP요청을 보내거나 쿼리를 실행하는 대신 해당 데이터를 캐시하는 게 좋은데 이 때, Redis가 유용, 사용이 간단하고 사용자 친화적이며 기본적으로 모든 캐시 DB를 저장하는 기본 DB와 별개의 또 다른 DB
- Node Cache : 노드 캐시 패키지를 사용해 데이터를 캐싱하는 방법으로 노드 캐시는 메모리 내 캐시인 반면 Redis의 캐시는 외부에 저장이 된다. 이는 노드 앱이 다시 시작되면 데이터가 손실되어 재 캐싱을 해야 하지만 Redis는 삭제될 때까지 네트워크에 저장이 되는 것이다. 또한 Redis는 기본적으로 DB와 유사해 다른 장치에서도 액세스가 가능하나 노드 캐시는 해당 특정 Node 앱에만 존재한다.
- Cluster : 일반적으로 우린 모든 종류 요청을 수신하는 단일 Node 앱을 실행하는데, 약 8개의 앱 복사본을 별도로 실행하고 사용 가능한 앱에 요청을 배포하는 로드 밸런서를 배치한다 생각했을 때, 이것이 클러스터가 하는 일이다. 클러스터는 내장 Node 패키지로 따로 다운로드가 필요없다. 클러스터의 주의 점은 N개의 Node앱을 실행하는 경우 앱 간에 데이터가 공유되지 않는 것이다.(각각의 프로세스 ID를 사용해 별도로 실행)
- Worker Threads : 단일 스레드에서는 오류 발생 시 메인 스레드가 충돌하기에 오류 처리가 힘들어진 거에 비해 다중 스레드는 오류가 발생하면 해당 스레드만 충돌하고 나머지는 계속해 작동하는 장점이 있다. 이 특성 때문에 Node가 단일 스레드 노드 앱을 멀티 스레드 애플리케이션으로 변환하는 데 도움이 되는 Worker Threads를 제공
-> 작동 방식은 메인 스레드에서 파일 이름을 매개변수로 받아들이는 Worker()함수를 사용해 새 워커를 생성하고 WorkerData 객체를 통해 액세스 가능한 데이터를 이 파일에 전달함으로 메인 스레드는 작업자의 메시지 이벤트를 기다리기에 작업자 스레드에 오류가 발생하는 경우의 앱 충돌을 쉽게 방지할 수 있음 - Microservice Architecture : 상용화 중인 프로젝트는 규모가 크다 보니 아키텍처에서 모든 것을 처리하기에 너무 커 microservice 개념이 등장했다. 특정 작업을 수행하는 여러 서비스가 생성되고 이러한 각 서비스는 서로 연결한다. 기본적으로 우리는 각각이 특정 주제에 대해 특정 작업 집합을 수행하는 책임을 맡는 애플리케이션을 배포하고 있다. 경우에 따라 더 많은 앱으로 분할 될 수도 있는데, 이러한 아키텍처를 설계 시 데이터 불일치, 서비스 간 통신, 배포 관리 등과 같은 문제가 발생할 수 있어 구현 전에 모두 고려해야 한다. 구현 방법은 단순히 서로 다른 포트에서 실행되는 2개의 서로 다른 응용 프로그램을 만드는 것이다.
- Redis Lock : Redis의 서비스 중 하나로 교착상태를 유발할 수 있는 상황을 방지하고 싶을 때 사용된다. 예로 현재 실행중인 다른 프로세스 B에서 반환된 데이터를 사용해야 하는 프로세스 A를 실행하려 할 때 발생된다.(프로세스 A는 프로세스 B가 완료될 때까지 대기) 이를 구현하기 위해 Redis Lock을 사용해 프로세스 B가 시작되면 잠금을 획득하고 작업 완료시까지 잠금을 유지한다. 그 후 실행이 완료된 후에야 릴리스 되어 프로세스 A가 작업을 재개한다.
- 이 글은 개인적인 공부를 위해 medium에 발췌해 정리한 글입니다.
How to handle multiple API requests in your NodeJS Application
Unlike hackathons, when you’re building a NodeJS API that’s going to be used in the real world, you want to make sure that it’s capable of…
medium.com
'JS' 카테고리의 다른 글
| Optional Chaining / JS Array.some() / 논리 연산자 (2) | 2023.11.09 |
|---|---|
| JSON의 역할 및 속도 저하 (0) | 2023.11.08 |
| JS 내용 정리 (1) | 2023.06.03 |
| JS 메소드 (4) | 2023.05.30 |
| JS 5주차 개념 정리 (0) | 2023.05.25 |