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.