NodeJS 애플리케이션에서 백그라운드 프로세스를 처리하는 좋은 방법은 무엇입니까?
시나리오 : 사용자가 앱에 무언가를 게시 한 후 데이터를 크런치하고 외부 리소스에서 추가 데이터를 요청합니다.이 모든 작업은 시간이 많이 걸리므로 req / res 루프에서 제외하고 싶습니다. 작업을 빠르게 덤프 할 수 있고 데몬 또는 작업 실행기가 항상 가장 오래된 작업을 가져와 처리 할 수있는 작업 대기열을 갖는 것이 이상적입니다.
RoR에서는 Delayed Job과 같은 작업을 수행했을 것입니다. 이 API에 해당하는 Node는 무엇입니까?
답변
서버와 동일한 프로세스에서 실행되는 가벼운 것을 원한다면 Bull을 적극 권장 합니다. 큐를 세밀하게 제어 할 수있는 간단한 API가 있습니다.
독립형 작업자 프로세스로 실행되는 것을 찾고 있다면 Kue를 살펴보십시오 . RESTful API 서버로 실행할 수 있으며이를 위해 작성된 여러 프런트 엔드 앱도 있습니다.
Ruby의 Resque에 익숙하다면 Node-resque 라는 노드 구현이 있습니다.
Bull, Kue 및 Node-resque는 모두 Node.js 작업자 대기열 사이에서 유비쿼터스 인 Redis의 지원을받습니다 . 3 개 모두 RoR의 DelayedJob이 수행하는 작업을 수행 할 수 있으며, 원하는 특정 기능과 API 기본 설정의 문제입니다.
답변
백그라운드 작업은 웹 서비스 작업과 직접적인 관련이 없으므로 동일한 프로세스에 있지 않아야합니다. 확장 할 때 백그라운드 작업의 메모리 사용량이 웹 서비스 성능에 영향을 미칩니다. 그러나 원하는 경우 동일한 코드 저장소에 둘 수 있습니다.
두 프로세스 간의 메시징에 대한 한 가지 좋은 선택은 때때로 메시지를 삭제하는 것이 괜찮다면 redis 입니다. “남은 메시지 없음”을 원하면 Rabbit 과 같은 더 무거운 브로커가 필요합니다 . 웹 서비스 프로세스는 게시 할 수 있고 백그라운드 작업 프로세스는 구독 할 수 있습니다.
두 프로세스를 공동 호스팅 할 필요는 없으며 사용하는 모든 것에 대해 별도의 VM, Docker 컨테이너에있을 수 있습니다. 이를 통해 많은 문제없이 확장 할 수 있습니다.
답변
MongoDB를 사용하는 경우 Agenda를 권장 합니다. 이렇게하면 별도의 Redis 인스턴스가 실행되지 않고 예약, 대기열 및 웹 UI와 같은 기능이 모두 제공됩니다. Agenda UI 는 선택 사항이며 물론 별도로 실행할 수 있습니다.
또한 필요한 경우 전체 백그라운드 처리 시스템을 교체 할 수 있도록 애플리케이션 로직과 큐잉 / 스케줄링 시스템간에 느슨하게 결합 된 추상화를 설정하는 것이 좋습니다. 즉, 애플리케이션 / 처리 로직을 아젠다 작업 정의에서 멀리 유지하여 경량을 유지하십시오.
답변
작업 예약에 Redis 를 사용하는 것이 좋습니다 . 다양한 데이터 구조가 있으며 항상 사용 사례에 더 적합한 것을 선택할 수 있습니다.
RoR과 DJ에 대해 언급 했으므로 sidekiq에 익숙하다고 가정합니다. 원하는 경우 작업 스케줄링에 node-sidekiq 을 사용할 수 있지만 주 목적은 nodejs를 RoR과 통합하는 것이기 때문에 차선책 imo입니다.
작업자 데몬 화의 경우 PM2 사용을 권장 합니다. 널리 사용되고 적극적으로 유지 관리됩니다. 많은 문제 (예 : 배포, 모니터링, 클러스터링)를 해결하므로 과도하게 사용하지 않는지 확인하십시오.
답변
나는 bee-queue & bull을 시도 하고 결국 bull 을 선택했습니다. 처음에는 bee-queue b / c를 선택했습니다. 매우 간단하고 예제는 이해하기 쉬우 며 황소의 예제는 약간 복잡합니다. bee ‘s wiki Bee Queue의 Origin 도 저와 공감합니다. 그러나 꿀벌의 문제는 <1> 문제 해결 시간이 상당히 느리고 최신 업데이트가 10 개월 전이었습니다. <2> 작업을 일시 중지 / 취소하는 쉬운 방법을 찾을 수 없습니다.
반면 Bull은 문제에 대한 대응으로 코드를 자주 업데이트합니다. Node.js 작업 대기열 평가에서는 황소의 약점이 “문제 해결 시간이 느리다”고 말했지만 제 경험은 그 반대입니다!
그러나 어쨌든 그들의 API는 비슷하기 때문에 하나에서 다른 것으로 전환하는 것이 매우 쉽습니다.
답변
적절한 Node.js 프레임 워크를 사용하여 앱을 빌드하는 것이 좋습니다.
가장 강력하고 사용하기 쉬운 것은 Sails.js 라고 생각합니다 .
MVC 프레임 워크이므로 ROR에서 개발하는 데 익숙하다면 매우 쉬울 것입니다!
당신이 그것을 사용한다면, 그것은 이미 강력한 (자바 스크립트 용어로) 작업 관리자를 제공합니다.
new sails.cronJobs('0 01 01 * * 0', function () {
sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");
더 많은 정보가 필요하면 주저하지 말고 저에게 연락하십시오!