Node.js의 백그라운드 프로세스


96

NodeJS 애플리케이션에서 백그라운드 프로세스를 처리하는 좋은 방법은 무엇입니까?

시나리오 : 사용자가 앱에 무언가를 게시 한 후 데이터를 크런치하고 외부 리소스에서 추가 데이터를 요청합니다.이 모든 작업은 시간이 많이 걸리므로 req / res 루프에서 제외하고 싶습니다. 작업을 빠르게 덤프 할 수 있고 데몬 또는 작업 실행기가 항상 가장 오래된 작업을 가져와 처리 할 수있는 작업 대기열을 갖는 것이 이상적입니다.

RoR에서는 Delayed Job과 같은 작업을 수행했을 것입니다. 이 API에 해당하는 Node는 무엇입니까?


4
문제는 지금처럼 소프트웨어 권장 사항이며 결국 종료 될 것입니다. 마지막 문장을 "이 API에 해당하는 NodeJS는 무엇입니까?"로 바꾸려면 주제에 더 가깝습니다. 비슷한 일이 필요하기 때문에이 답변이 닫히지 않고보고 싶습니다.
ssube

감사합니다.
Ole Spaarmann 15.

2
아래에 좋은 제안이 있습니다. ChildProcess유용 할 수 있는 API 도 있습니다. nodejs.org/api/child_process.html
lispHK01 2015-06-23

stackoverflow.com/users/69349/ole-spaarmann- 마지막으로 선택한 것이 무엇인지, 그리고 NodeJS와 결정을 통합 한 방법에 대한 매우 간단한 예를 제공 할 수 있다면 관심이 있습니다. 감사합니다!
MLissCetrus

@MLissCetrus 저는 Elixir를 배우고 더 이상 NodeJS를 사용하지 않기로 결정했습니다. :)
Ole Spaarmann

답변:


114

서버와 동일한 프로세스에서 실행되는 가벼운 것을 원한다면 Bull을 적극 권장 합니다. 큐를 세밀하게 제어 할 수있는 간단한 API가 있습니다.

독립형 작업자 프로세스로 실행되는 것을 찾고 있다면 Kue를 살펴보십시오 . RESTful API 서버로 실행할 수 있으며이를 위해 작성된 여러 프런트 엔드 앱도 있습니다.

Ruby의 Resque에 익숙하다면 Node-resque 라는 노드 구현이 있습니다.

Bull, Kue 및 Node-resque는 모두 Node.js 작업자 대기열 사이에서 유비쿼터스 인 Redis의 지원을받습니다 . 3 개 모두 RoR의 DelayedJob이 수행하는 작업을 수행 할 수 있으며, 원하는 특정 기능과 API 기본 설정의 문제입니다.


3
이것은 매우 좋은 대답이지만 ChildProcess API 및 webworker-threads 모듈을 언급하면 훌륭하게 만들 수 있습니다. )
ssube

@ssube 나는 당신과 동의하지 않습니다. 명령을 실행하기 위해 대기열을 보는 포크를 만드는 것을 의미하지 않는 한 맞습니다. 나에게서 +1. Child_process는 내가 사용하는 것이고 내 문제는 엄청난 프로세스 세트를 열 수 있다는 것입니다.하지만 대기열에서 실행할 작업을 관리하는 방법이 있다면 CP가 좋은 솔루션이라는 점에 만족할 것입니다. 이것은 할 수 있지만 요점은 모든 작업을 직접 수행하는 것이 아니라 전투 테스트를 거친 코드를 재사용하는 것입니다 (이 경우 필요한 모든 마법을 수행하고 API 통합을 허용하는 Kue와 같은 것).
dewwwald

Bull은 PM2 클러스터링과 함께 작동합니까? 아니면 설명서에 표시된대로 수동으로 클러스터를 만들어야합니까?
Shayan Nahrvar

31

백그라운드 작업은 웹 서비스 작업과 직접적인 관련이 없으므로 동일한 프로세스에 있지 않아야합니다. 확장 할 때 백그라운드 작업의 메모리 사용량이 웹 서비스 성능에 영향을 미칩니다. 그러나 원하는 경우 동일한 코드 저장소에 둘 수 있습니다.

두 프로세스 간의 메시징에 대한 한 가지 좋은 선택은 때때로 메시지를 삭제하는 것이 괜찮다면 redis 입니다. "남은 메시지 없음"을 원하면 Rabbit 과 같은 더 무거운 브로커가 필요합니다 . 웹 서비스 프로세스는 게시 할 수 있고 백그라운드 작업 프로세스는 구독 할 수 있습니다.

두 프로세스를 공동 호스팅 할 필요는 없으며 사용하는 모든 것에 대해 별도의 VM, Docker 컨테이너에있을 수 있습니다. 이를 통해 많은 문제없이 확장 할 수 있습니다.


3
Rabbit을 언급 한 유일한 답변입니까? 이것이 기업의 대답입니다. +1
Augie Gardner

11

MongoDB를 사용하는 경우 Agenda를 권장 합니다. 이렇게하면 별도의 Redis 인스턴스가 실행되지 않고 예약, 대기열 및 웹 UI와 같은 기능이 모두 제공됩니다. Agenda UI 는 선택 사항이며 물론 별도로 실행할 수 있습니다.

또한 필요한 경우 전체 백그라운드 처리 시스템을 교체 할 수 있도록 애플리케이션 로직과 큐잉 / 스케줄링 시스템간에 느슨하게 결합 된 추상화를 설정하는 것이 좋습니다. 즉, 애플리케이션 / 처리 로직을 아젠다 작업 정의에서 멀리 유지하여 경량을 유지하십시오.


3

작업 예약에 Redis 를 사용하는 것이 좋습니다 . 다양한 데이터 구조가 있으며 항상 사용 사례에 더 적합한 것을 선택할 수 있습니다.

RoR과 DJ에 대해 언급 했으므로 sidekiq에 익숙하다고 가정합니다. 원하는 경우 작업 스케줄링에 node-sidekiq 을 사용할 수 있지만 주 목적은 nodejs를 RoR과 통합하는 것이기 때문에 차선책 imo입니다.

작업자 데몬 화의 경우 PM2 사용을 권장 합니다. 널리 사용되고 적극적으로 유지 관리됩니다. 많은 문제 (예 : 배포, 모니터링, 클러스터링)를 해결하므로 과도하게 사용하지 않는지 확인하십시오.


1

나는 bee-queue & bull을 시도 하고 결국 bull 을 선택했습니다. 처음에는 bee-queue b / c를 선택했습니다. 매우 간단하고 예제는 이해하기 쉬우 며 황소의 예제는 약간 복잡합니다. bee 's wiki Bee Queue의 Origin 도 저와 공감합니다. 그러나 꿀벌의 문제는 <1> 문제 해결 시간이 상당히 느리고 최신 업데이트가 10 개월 전이었습니다. <2> 작업을 일시 중지 / 취소하는 쉬운 방법을 찾을 수 없습니다.

반면 Bull은 문제에 대한 대응으로 코드를 자주 업데이트합니다. Node.js 작업 대기열 평가에서는 황소의 약점이 "문제 해결 시간이 느리다"고 말했지만 제 경험은 그 반대입니다!

그러나 어쨌든 그들의 API는 비슷하기 때문에 하나에서 다른 것으로 전환하는 것이 매우 쉽습니다.


-6

적절한 Node.js 프레임 워크를 사용하여 앱을 빌드하는 것이 좋습니다.

가장 강력하고 사용하기 쉬운 것은 Sails.js 라고 생각합니다 .

MVC 프레임 워크이므로 ROR에서 개발하는 데 익숙하다면 매우 쉬울 것입니다!

당신이 그것을 사용한다면, 그것은 이미 강력한 (자바 스크립트 용어로) 작업 관리자를 제공합니다.

new sails.cronJobs('0 01 01 * * 0', function () {
   sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");

더 많은 정보가 필요하면 주저하지 말고 저에게 연락하십시오!


5
Node.js의 백그라운드 프로세스 관리자를 찾고 있습니다. 정의에 따라 이것은 웹 앱과 분리되어야합니다. 그리고 Sails, Express, Hapi 또는 원하는 것을 사용하는지 여부는 중요하지 않습니다.
Ole Spaarmann 2015 년

좋아, 당신은 불 또는 Webworker - 스레드 ... 행운을 시도 할 수 있습니다 오순절 Node.js를 :)
지오 막 있도록

sails.js는 꽤 크고 cronJobs보다 훨씬 많은 기능을 수행합니다. 나는 sails.js가 사용하는 노드 크론 ( github.com/kelektiv/node-cron )을 찾았습니다.
pbatey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.