대안으로 황소를 참조하십시오. 감사합니다!
Kue는 Node.js를 위해 제작 된 Redis가 뒷받침하는 우선 순위 작업 대기열입니다.
PRIPIP 이것은 최신 KUE 문서입니다. Changelist도 읽으십시오.
최신 릴리스 :
$ npm install kue
마스터 브랜치 :
$ npm install http://github.com/Automattic/kue/tarball/master
먼저 kue.createQueue()
로 작업 Queue
만듭니다.
var kue = require ( 'kue' )
, queue = kue . createQueue ( ) ;
queue.create()
유형 ( "이메일")이있는 queue.create ()를 호출하고 임의의 작업 데이터는 Job
반환 한 다음 save()
ED가 될 수 있습니다. save()
메소드는 선택적으로 콜백을 수락하여 문제가 발생하면 error
로 응답합니다. title
키는 특별한 표지이며 UI 내의 작업 목록에 표시되므로 특정 작업을보다 쉽게 찾을 수 있습니다.
var job = queue . create ( 'email' , {
title : 'welcome email for tj'
, to : '[email protected]'
, template : 'welcome-email'
} ) . save ( function ( err ) {
if ( ! err ) console . log ( job . id ) ;
} ) ;
작업의 우선 순위를 지정하려면 숫자에 매핑되는 숫자 또는 우선 순위 이름으로 priority()
메소드를 호출하십시오.
queue . create ( 'email' , {
title : 'welcome email for tj'
, to : '[email protected]'
, template : 'welcome-email'
} ) . priority ( 'high' ) . save ( ) ;
기본 우선 순위 맵은 다음과 같습니다.
{
low : 10
, normal : 0
, medium : - 5
, high : - 10
, critical : - 15
} ;
기본적으로 작업에는 한 번의 시도 만 시도합니다. 즉, 실패 할 때 실패로 표시되며 개입 할 때까지 그런 식으로 남아 있습니다. 그러나 Kue를 사용하면이를 지정할 수 있으며, 이는 실패시 일반적으로 문제없이 재 시도 할 수있는 이메일 전송과 같은 작업에 중요합니다. 이를 위해 .attempts()
메소드를 숫자로 호출하십시오.
queue . create ( 'email' , {
title : 'welcome email for tj'
, to : '[email protected]'
, template : 'welcome-email'
} ) . priority ( 'high' ) . attempts ( 5 ) . save ( ) ;
작업에 실패하자마자 작업이 실패하자마자 작업이 지연된 경우에도 Job#delay
통해 지연이 발생하더라도 수행됩니다. 실패 (백 오프라고도 함)시 작업 재구성을 지연 시키려면 Job#backoff
방법을 다양한 방식으로 사용할 수 있습니다.
// Honor job's original delay (if set) at each attempt, defaults to fixed backoff
job . attempts ( 3 ) . backoff ( true )
// Override delay value, fixed backoff
job . attempts ( 3 ) . backoff ( { delay : 60 * 1000 , type : 'fixed' } )
// Enable exponential backoff using original delay (if set)
job . attempts ( 3 ) . backoff ( { type : 'exponential' } )
// Use a function to get a customized next attempt delay value
job . attempts ( 3 ) . backoff ( function ( attempts , delay ) {
//attempts will correspond to the nth attempt failure so it will start with 0
//delay will be the amount of the last delay, not the initial delay unless attempts === 0
return my_customized_calculated_delay ;
} )
마지막 시나리오에서는 다음 시도 지연 값을 얻으려면 각각의 반응에 대해 제공 기능이 실행됩니다. 즉, 외부/컨텍스트 변수를 참조 할 수 없습니다.
구직자들은 직무가 활성 상태로 살 수있는 시간 동안 만료 가치를 설정할 수 있으므로 근로자가 적시에 응답하지 않으면 TTL exceeded
로 실패 할 것입니다. 동시성.
queue . create ( 'email' , { title : 'email job with TTL' } ) . ttl ( milliseconds ) . save ( ) ;
직무 별 로그를 사용하면 직무의 평생 시점에서 UI에 정보를 노출시킬 수 있습니다. 그렇게하려면 단순히 sprintf와 같은 지원을위한 변수와 같은 메시지 문자열을 수락하는 job.log()
호출합니다.
job . log ( '$%d sent to %s' , amount , user . name ) ;
또는 다른 것 (내부적으로 util.inspect () 사용) :
job . log ( { key : 'some key' , value : 10 } ) ;
job . log ( [ 1 , 2 , 3 , 5 , 8 ] ) ;
job . log ( 10.1 ) ;
작업 진행은 비디오 변환과 같은 장기 작업에 매우 유용합니다. 작업의 진행 상황을 업데이트하려면 간단히 job.progress(completed, total [, data])
:
job . progress ( frames , totalFrames ) ;
데이터를 사용하여 작업에 대한 추가 정보를 전달할 수 있습니다. 예를 들어 현재 상태에 대한 추가 상황 데이터가있는 메시지 또는 객체.
작업 별 사건은 Redis Pubsub를 통해 Job
인스턴스에서 해고됩니다. 다음 이벤트는 현재 지원됩니다.
enqueue
start
작업이 진행 중입니다promotion
직무는 지연된 상태에서 대기열로 승진합니다.progress
상황은 0-100까지 다양합니다failed attempt
작업이 실패했지만 아직 계속 시도했습니다.failed
직업이 실패했고 남은 시도가 없습니다.complete
되었습니다remove
했습니다예를 들어 이것은 다음과 같은 것처럼 보일 수 있습니다.
var job = queue . create ( 'video conversion' , {
title : 'converting loki's to avi'
, user : 1
, frames : 200
} ) ;
job . on ( 'complete' , function ( result ) {
console . log ( 'Job completed with data ' , result ) ;
} ) . on ( 'failed attempt' , function ( errorMessage , doneAttempts ) {
console . log ( 'Job failed' ) ;
} ) . on ( 'failed' , function ( errorMessage ) {
console . log ( 'Job failed' ) ;
} ) . on ( 'progress' , function ( progress , data ) {
console . log ( 'r job #' + job . id + ' ' + progress + '% complete with data ' , data ) ;
} ) ;
재시작 된 node.js 프로세스는 특정 작업 오브젝트에 대한 참조를 잃어 버리기 때문에 프로세스 재시작시 작업 수준 이벤트가 수신되지는 않습니다. 보다 안정적인 이벤트 핸들러를 원한다면 큐 이벤트를 찾으십시오.
참고 Kue는 작업 객체를 메모리에 저장하여 완료/이벤트를 방출하지 못할 때까지 저장합니다. 불완전한 작업에 큰 동시성이있는 경우이 기능을 끄고 메모리 스케일링을 위해 큐 레벨 이벤트를 사용하십시오.
kue . createQueue ( { jobEvents : false } )
또는 작업 수준 기능 events
사용하여 작업 수준에서 작업에 대한 이벤트가 해고되는지 여부를 제어 할 수 있습니다.
var job = queue . create ( 'test' ) . events ( false ) . save ( ) ;
대기열 수준 이벤트는 앞에서 언급 한 작업 수준 이벤트에 대한 액세스를 제공하지만 "전역"레벨에서 논리를 적용하기 위해 Queue
인스턴스로 범위를 띠게됩니다. 이에 대한 예는 완료된 작업을 제거하는 것입니다.
queue . on ( 'job enqueue' , function ( id , type ) {
console . log ( 'Job %s got queued of type %s' , id , type ) ;
} ) . on ( 'job complete' , function ( id , result ) {
kue . Job . get ( id , function ( err , job ) {
if ( err ) return ;
job . remove ( function ( err ) {
if ( err ) throw err ;
console . log ( 'removed completed job #%d' , job . id ) ;
} ) ;
} ) ;
} ) ;
사용 가능한 이벤트는 "Job Events"에서 언급 한 것과 동일하지만 "Job"로 접두사가 있습니다.
지연된 작업은 .delay(ms)
방법을 호출하여 현재 에 비해 밀리 초 수를 전달하여 임의의 거리에 대기 할 수 있습니다. 또는 향후 특정 시간으로 JavaScript Date
개체를 전달할 수 있습니다. 이것은 자동으로 Job
에 "지연"으로 표시됩니다.
var email = queue . create ( 'email' , {
title : 'Account renewal required'
, to : '[email protected]'
, template : 'renewal-email'
} ) . delay ( milliseconds )
. priority ( 'high' )
. save ( ) ;
Kue는 타이머로 지연된 작업을 점검하여 예정된 지연이 초과 된 경우마다 1 초마다 상위 1000 개의 작업을 확인하지 못한 경우 홍보합니다.
Kue는 처리 작업이 간단합니다. 먼저 작업 생성과 마찬가지로 Queue
인스턴스를 생성하고 Redis 등에 액세스 할 수 있도록 한 다음 관련 유형으로 queue.process()
호출하십시오. createQueue
이름과 달리 현재 싱글 톤 Queue
인스턴스를 반환합니다. 따라서 node.js 프로세스 내에서 단일 Queue
객체 만 구성하고 사용할 수 있습니다.
다음 예에서 우리는 콜백 done
email
로 전달합니다. 오류가 발생하면 kue에게 어떤 일이 일어 났을 때 done(err)
done()
합니다. 이 함수가 오류로 응답하면 UI에 표시되며 작업은 실패로 표시됩니다. 전달 된 오류 객체는 표준 유형 Error
여야합니다.
var kue = require ( 'kue' )
, queue = kue . createQueue ( ) ;
queue . process ( 'email' , function ( job , done ) {
email ( job . data . to , done ) ;
} ) ;
function email ( address , done ) {
if ( ! isValidEmail ( address ) ) {
//done('invalid to address') is possible but discouraged
return done ( new Error ( 'invalid to address' ) ) ;
}
// email send stuff...
done ( ) ;
}
작업자는 작업 결과를 두 번째 매개 변수로 전달하여 done(null,result)
을 Job.result
키에 저장하기 위해 수행 할 수 있습니다. result
또한 complete
이벤트 처리기를 통해 전달되므로 구인이 좋아하면 구인을받을 수 있습니다.
기본적으로 queue.process()
에 대한 호출은 처리를 위해 한 번에 하나의 작업 만 수락합니다. 이메일 전송과 같은 작은 작업의 경우 이것은 이상적이지 않으므로 숫자를 전달 하여이 유형의 최대 활성 작업을 지정할 수 있습니다.
queue . process ( 'email' , 20 , function ( job , done ) {
// ...
} ) ;
근로자는 일시적으로 일시 중지하고 활동을 재개 할 수 있습니다. 즉, pause
호출 한 후에는 resume
호출 될 때까지 프로세스 콜백에서 일자리를받지 않습니다. pause
기능은이 작업자를 우아하게 종료하고 우아한 종료에서 shutdown
방법과 동일한 내부 기능을 사용합니다.
queue . process ( 'email' , function ( job , ctx , done ) {
ctx . pause ( 5000 , function ( err ) {
console . log ( "Worker is paused... " ) ;
setTimeout ( function ( ) { ctx . resume ( ) ; } , 10000 ) ;
} ) ;
} ) ;
참고 kue >=0.9.0
의 ctx
매개 변수는 프로세스 콜백 함수의 두 번째 인수이며 done
것은 항상 마지막입니다.
참고 일시 pause
메소드 서명은 콜백 함수를 마지막으로 이동시키기 위해 kue >=0.9.0
에서 변경됩니다.
"실제"예를 들어, 노드 캔버스가있는 수많은 슬라이드에서 PDF를 컴파일해야한다고 가정 해 봅시다. 우리의 작업은 다음 데이터로 구성 될 수 있습니다. 일반적으로 대규모 데이터를 작업 IT 스펠에 저장해서는 안되며 ID와 같은 참조를 저장하여 처리 중에 가져 오는 것이 좋습니다.
queue . create ( 'slideshow pdf' , {
title : user . name + "'s slideshow"
, slides : [ ... ] // keys to data stored in redis, mongodb, or some other store
} ) ;
작업 job.data
통해 처리하는 동안 별도의 프로세스 내에서 동일한 임의의 데이터에 액세스 할 수 있습니다. 예에서는 각 슬라이드를 일대일로 렌더링하여 작업의 로그 및 진행 상황을 업데이트합니다.
queue . process ( 'slideshow pdf' , 5 , function ( job , done ) {
var slides = job . data . slides
, len = slides . length ;
function next ( i ) {
var slide = slides [ i ] ; // pretend we did a query on this slide id ;)
job . log ( 'rendering %dx%d slide' , slide . width , slide . height ) ;
renderSlide ( slide , function ( err ) {
if ( err ) return done ( err ) ;
job . progress ( i , len , { nextSlide : i == len ? 'itsdone' : i + 1 } ) ;
if ( i == len ) done ( )
else next ( i + 1 ) ;
} ) ;
}
next ( 0 ) ;
} ) ;
Queue#shutdown([timeout,] fn)
현재 활성 작업이 완료된 후 모든 작업자가 처리를 중지하도록 신호를 보냅니다. 근로자는 활성 작업이 부름을 받거나 셧다운 오류 이유로 failed
활동에 실패하기 위해 timeout
밀리 초를 기다립니다. 모든 근로자가 Kue에게 말하면 fn
이 부름을받습니다.
var queue = require ( 'kue' ) . createQueue ( ) ;
process . once ( 'SIGTERM' , function ( sig ) {
queue . shutdown ( 5000 , function ( err ) {
console . log ( 'Kue shutdown: ' , err || '' ) ;
process . exit ( 0 ) ;
} ) ;
} ) ;
shutdown
메소드 서명은 콜백 함수를 마지막으로 이동시키기 위해 kue >=0.9.0
에서 변경됩니다 .
Redis 클라이언트 라이브러리 또는 큐의 모든 오류는 Queue
오브젝트에 방출됩니다. 예외를 방지하거나 KUE 오류를 디버그하기 위해 error
이벤트에 바인딩해야합니다.
var queue = require ( 'kue' ) . createQueue ( ) ;
queue . on ( 'error' , function ( err ) {
console . log ( 'Oops... ' , err ) ;
} ) ;
Kue는 작업자가 done
경우 작업 완료/실패를 표시하므로 작업자의 코드 및 Node.js 프로세스에서 핸들 작업이 끝나기 전에 출근하지 않도록 적절한 오류 처리를 사용해야합니다. 이것은 두 가지 방법으로 달성 할 수 있습니다.
queue . process ( 'my-error-prone-task' , function ( job , done ) {
var domain = require ( 'domain' ) . create ( ) ;
domain . on ( 'error' , function ( err ) {
done ( err ) ;
} ) ;
domain . run ( function ( ) { // your process function
throw new Error ( 'bad things happen' ) ;
done ( ) ;
} ) ;
} ) ;
통지 - 도메인은 안정성 0 이있는 nodejs에서 더 이상 사용되지 않으며 사용하지 않는 것이 좋습니다.
이것은 가장 부드럽고 최상의 솔루션이지만 Kue와 함께 내장되어 있지 않습니다. 이 토론을 참조하십시오. 관련 Open Kue 문제 에서이 기능에 대해 언급 할 수 있습니다.
약속을 사용하여 같은 일을 할 수도 있습니다
queue . process ( 'my-error-prone-task' , function ( job , done ) {
Promise . method ( function ( ) { // your process function
throw new Error ( 'bad things happen' ) ;
} ) ( ) . nodeify ( done )
} ) ;
그러나 이것은 도메인처럼 비동기 통화 스택에서 예외를 포착하지 않습니다.
uncaughtException
에 바인딩하고 Kue를 우아하게 종료하지만, 오류 컨텍스트를 잃어 버렸기 때문에 JavaScript의 관용구를 권장하는 오류를 처리하는 것이 아닙니다. process . once ( 'uncaughtException' , function ( err ) {
console . error ( 'Something bad happened: ' , err ) ;
queue . shutdown ( 1000 , function ( err2 ) {
console . error ( 'Kue shutdown result: ' , err2 || 'OK' ) ;
process . exit ( 0 ) ;
} ) ;
} ) ;
Kue는 현재 클라이언트 측정 상태 관리를 사용하고 있으며 해당 운영 중에 Redis가 충돌하면 일부 작업 또는 인덱스 불일치가 발생합니다. 그 결과 특정 수의 일자리가 고정되어 새로운 일자리가 만들어 질 때만 근로자가 철수 할 수 있습니다. 더 이상 새로운 일자리가 만들어지지 않으면 영원히 붙어 있습니다. 따라서 우리는 당신이 다음을 호출 하여이 문제를 해결하기 위해 Watchdog를 실행할 것을 강력히 제안합니다.
queue . watchStuckJobs ( interval )
interval
은 밀리 초이며 기본값은 1000ms입니다
Kue는 버전 1.0의 완전 원자 상태 관리로 리팩토링되며 LUA 스크립트 및/또는 BRPOPLPUSH 조합에 의해 발생합니다. 여기와 여기에서 더 많은 것을 읽을 수 있습니다.
큐 객체에는 각 상태의 작업 수에 대해 알려주는 두 가지 유형의 방법이 있습니다.
queue . inactiveCount ( function ( err , total ) { // others are activeCount, completeCount, failedCount, delayedCount
if ( total > 100000 ) {
console . log ( 'We need some back pressure here' ) ;
}
} ) ;
특정 작업 유형을 쿼리 할 수도 있습니다.
queue . failedCount ( 'my-critical-job' , function ( err , total ) {
if ( total > 10000 ) {
console . log ( 'This is tOoOo bad' ) ;
}
} ) ;
작업 ID에 대한 반복
queue . inactive ( function ( err , ids ) { // others are active, complete, failed, delayed
// you may want to fetch each id to get the Job object out of it...
} ) ;
그러나 두 번째는 대규모 배포로 확장되지 않으므로보다 구체적인 Job
정적 방법을 사용할 수 있습니다.
kue . Job . rangeByState ( 'failed' , 0 , n , 'asc' , function ( err , jobs ) {
// you have an array of maximum n Job objects here
} ) ;
또는
kue . Job . rangeByType ( 'my-job-type' , 'failed' , 0 , n , 'asc' , function ( err , jobs ) {
// you have an array of maximum n Job objects here
} ) ;
마지막 두 가지 방법은 이후 KUE 버전에서 변경 될 수 있습니다.
오류 처리 섹션이나 프로세스가 어떤 식 으로든 활성 작업을 잃어버린 경우 위의 작업을 수행하지 않은 경우 프로세스가 다시 시작되면 복구 할 수 있습니다. 맹목적인 논리는 모든 고정 된 작업을 재확인하는 것입니다.
queue . active ( function ( err , ids ) {
ids . forEach ( function ( id ) {
kue . Job . get ( id , function ( err , job ) {
// Your application should check if job is a stuck one
job . inactive ( ) ;
} ) ;
} ) ;
} ) ;
참고 클러스터 배포에서 응용 프로그램은 현재 다른 근로자가 제공하는 유효한 작업을 포함하지 않아야합니다.
작업 데이터 및 검색 인덱스는 Redis 메모리 공간을 먹으므로 실제 배포에는 작업 관리 프로세스가 필요합니다. 첫 번째 기회는 완료시 자동 작업 제거를 사용하는 것입니다.
queue . create ( ... ) . removeOnComplete ( true ) . save ( )
그러나 결국/일시적으로 완료된 작업 데이터가 필요한 경우 아래와 같은 주문형 작업 제거 스크립트를 설정하여 최상위 n
완성 된 작업을 제거 할 수 있습니다.
kue . Job . rangeByState ( 'complete' , 0 , n , 'asc' , function ( err , jobs ) {
jobs . forEach ( function ( job ) {
job . remove ( function ( ) {
console . log ( 'removed ' , job . id ) ;
} ) ;
} ) ;
} ) ;
프로세스가 종료되기 전에 .remove
되거나 작업 지수가 누출되기 전에 완료하기 위해 .
기본적으로 Kue는 클라이언트 기본 설정 (포트 기본값은 6379
, 호스트 기본값은 127.0.0.1
, q
기본값)을 사용하여 REDIS에 연결합니다. Queue#createQueue(options)
options.redis
에서 Redis 연결 옵션을 허용합니다.
var kue = require ( 'kue' ) ;
var q = kue . createQueue ( {
prefix : 'q' ,
redis : {
port : 1234 ,
host : '10.0.50.20' ,
auth : 'password' ,
db : 3 , // if provided select a non-default redis db
options : {
// see https://github.com/mranney/node_redis#rediscreateclient
}
}
} ) ;
prefix
Redis에 사용 된 주요 이름을 제어합니다. 기본적으로 이것은 단순히 q
입니다. 여러 앱에 하나의 Redis 인스턴스를 사용해야하지 않는 한 일반적으로 Prefix는 변경되지 않아야합니다. 또한 주요 응용 프로그램에서 분리 된 테스트 베드를 제공하는 데 유용 할 수 있습니다.
연결 정보를 URL 문자열로 지정할 수도 있습니다.
var q = kue . createQueue ( {
redis : 'redis://example.com:1234?redis_option=value&redis_option=value'
} ) ;
node_redis는 Unix 도메인 소켓을 지원하므로 Kue에게 그렇게하도록 지시 할 수도 있습니다. Redis 서버 구성은 Unix-Domain 소켓을 참조하십시오.
var kue = require ( 'kue' ) ;
var q = kue . createQueue ( {
prefix : 'q' ,
redis : {
socket : '/data/sockets/redis.sock' ,
auth : 'password' ,
options : {
// see https://github.com/mranney/node_redis#rediscreateclient
}
}
} ) ;
node.js redis redis 클라이언트 라이브러리를 node_redis API에 준수 (또는 조정 된 경우)를 KUE에 주입 할 수 있습니다. node_redis 연결 옵션을 제공하는 대신 Redis Connection Factory 로서만 createClientFactory
기능 만 제공해야합니다.
아래는 Redis-Sentinel이 자동 마스터/슬레이브 장애 조치를 위해 Redis Sentinel에 연결할 수 있도록하는 샘플 코드입니다.
var kue = require ( 'kue' ) ;
var Sentinel = require ( 'redis-sentinel' ) ;
var endpoints = [
{ host : '192.168.1.10' , port : 6379 } ,
{ host : '192.168.1.11' , port : 6379 }
] ;
var opts = options || { } ; // Standard node_redis client options
var masterName = 'mymaster' ;
var sentinel = Sentinel . Sentinel ( endpoints ) ;
var q = kue . createQueue ( {
redis : {
createClientFactory : function ( ) {
return sentinel . createClient ( masterName , opts ) ;
}
}
} ) ;
Redis redis#createClient
의 0.8.x
패치 스타일 대신 Queue#createQueue
에 Redis 옵션을 전달하려면 모든 <0.8.x
클라이언트 코드를 리팩토링해야합니다.
var Redis = require ( 'ioredis' ) ;
var kue = require ( 'kue' ) ;
// using https://github.com/72squared/vagrant-redis-cluster
var queue = kue . createQueue ( {
redis : {
createClientFactory : function ( ) {
return new Redis . Cluster ( [ {
port : 7000
} , {
port : 7001
} ] ) ;
}
}
} ) ;
UI는 작은 특급 응용 프로그램입니다. 기본 설정이있는 독립형 애플리케이션으로 인터페이스를 실행하기 위해 bin/
로 스크립트가 제공됩니다. 포트, Redis-Url 및 Prefix 옵션을 전달할 수 있습니다. 예를 들어:
node_modules/kue/bin/kue-dashboard -p 3050 -r redis://127.0.0.1:3000 -q prefix
다른 응용 프로그램 내에서도 해고 할 수 있습니다.
var kue = require ( 'kue' ) ;
kue . createQueue ( ... ) ;
kue . app . listen ( 3000 ) ;
제목은 "kue"로 기본값을 기본값으로,이 호출을 변경합니다.
kue . app . set ( 'title' , 'My Application' ) ;
비 디폴트 kue 옵션을 사용하는 경우 kue.app
에 액세스하기 전에 kue.createQueue(...)
호출해야합니다 .
Arnaud Bénard가 기여한 Kue-UI 웹 인터페이스도 사용할 수 있습니다.
UI와 함께 UI가 사용하는 JSON API도 노출됩니다.
쿼리 작업, 예를 들어 "Get /Job /Search? Q = AVI 비디오":
[ "5" , "7" , "10" ]
기본적으로 Kue는 검색을 위해 전체 작업 데이터 객체를 색인하지만, 호출 Job#searchKeys
통해 사용자 정의 할 수 있습니다.
var kue = require ( 'kue' ) ;
queue = kue . createQueue ( ) ;
queue . create ( 'email' , {
title : 'welcome email for tj'
, to : '[email protected]'
, template : 'welcome-email'
} ) . searchKeys ( [ 'to' , 'title' ] ) . save ( ) ;
검색 기능은 Kue >=0.9.0
에서 기본적으로 꺼져 있습니다. 이것에 대해 자세히 알아보십시오. 필요한 경우 검색 인덱스를 활성화하고 종속성에 빨간색을 추가해야합니다.
var kue = require ( 'kue' ) ;
q = kue . createQueue ( {
disableSearch : false
} ) ;
npm install reds --save
현재 주 수와 근로자 활동 시간에 따라 밀리 초의 작업 시간에 응답합니다.
{ "inactiveCount" : 4 , "completeCount" : 69 , "activeCount" : 2 , "failedCount" : 0 , "workTime" : 20892 }
일자리 받기 :id
:
{ "id" : "3" , "type" : "email" , "data" : { "title" : "welcome email for tj" , "to" : "[email protected]" , "template" : "welcome-email" } , "priority" : - 10 , "progress" : "100" , "state" : "complete" , "attempts" : null , "created_at" : "1309973155248" , "updated_at" : "1309973155248" , "duration" : "15002" }
직업 가져 오기 :id
의 로그 :
[ 'foo' , 'bar' , 'baz' ]
지정된 범위를 :from
작업을 받으 :order
:to
[ { "id" : "12" , "type" : "email" , "data" : { "title" : "welcome email for tj" , "to" : "[email protected]" , "template" : "welcome-email" } , "priority" : - 10 , "progress" : 0 , "state" : "active" , "attempts" : null , "created_at" : "1309973299293" , "updated_at" : "1309973299293" } , { "id" : "130" , "type" : "email" , "data" : { "title" : "welcome email for tj" , "to" : "[email protected]" , "template" : "welcome-email" } , "priority" : - 10 , "progress" : 0 , "state" : "active" , "attempts" : null , "created_at" : "1309975157291" , "updated_at" : "1309975157291" } ]
위와 동일, 제한에 의해 제한 :state
:
- active
- inactive
- failed
- complete
위와 동일하지만 :type
및 :state
로 제한됩니다.
작업 삭제 :id
:
$ curl -X DELETE http://local:3000/job/2
{"message":"job 2 removed"}
직업 만들기 :
$ curl -H "Content-Type: application/json" -X POST -d
'{
"type": "email",
"data": {
"title": "welcome email for tj",
"to": "[email protected]",
"template": "welcome-email"
},
"options" : {
"attempts": 5,
"priority": "high"
}
}' http://localhost:3000/job
{"message": "job created", "id": 3}
배열을 전달하여 여러 작업을 한 번에 생성 할 수 있습니다. 이 경우 응답은 순서를 보존하는 배열이됩니다.
$ curl -H "Content-Type: application/json" -X POST -d
'[{
"type": "email",
"data": {
"title": "welcome email for tj",
"to": "[email protected]",
"template": "welcome-email"
},
"options" : {
"attempts": 5,
"priority": "high"
}
},
{
"type": "email",
"data": {
"title": "followup email for tj",
"to": "[email protected]",
"template": "followup-email"
},
"options" : {
"delay": 86400,
"attempts": 5,
"priority": "high"
}
}]' http://localhost:3000/job
[
{"message": "job created", "id": 4},
{"message": "job created", "id": 5}
]
참고 : 여러 작업을 대량으로 삽입 할 때 삽입이 실패하면 Kue는 나머지 작업을 계속 처리합니다. 응답 배열에는 성공적으로 추가 된 작업의 ID가 포함되며 실패한 요소는 오류를 설명하는 객체입니다. {"error": "error reason"}
.
아래의 예는 클러스터를 사용하여 CPU에 작업 처리로드를 전파하는 방법을 보여줍니다. 사용에 대한 자세한 내용은 클러스터 모듈의 문서를 참조하십시오.
Cluster .isMaster
의 경우 마스터 프로세스의 맥락에서 파일이 실행되는 경우,이 경우 Kue와 함께 번들 된 웹 앱을 시작하는 것과 같이 한 번만 원하는 작업을 수행 할 수 있습니다. else
블록의 논리는 작업자 당 실행됩니다.
var kue = require ( 'kue' )
, cluster = require ( 'cluster' )
, queue = kue . createQueue ( ) ;
var clusterWorkerSize = require ( 'os' ) . cpus ( ) . length ;
if ( cluster . isMaster ) {
kue . app . listen ( 3000 ) ;
for ( var i = 0 ; i < clusterWorkerSize ; i ++ ) {
cluster . fork ( ) ;
}
} else {
queue . process ( 'email' , 10 , function ( job , done ) {
var pending = 5
, total = pending ;
var interval = setInterval ( function ( ) {
job . log ( 'sending!' ) ;
job . progress ( total - pending , total ) ;
-- pending || done ( ) ;
pending || clearInterval ( interval ) ;
} , 1000 ) ;
} ) ;
}
이렇게하면 각 컴퓨터 CPU 코어마다 email
작업 프로세서 (작업자)가 생성되며 각각 10 개의 동시 이메일 작업을 처리 할 수 있으며 N
핵심 시스템에서 총 10 * N
동시 이메일 작업이 발생합니다.
이제 브라우저에서 Kue의 UI를 방문하면 작업이 대략 N
배 더 빠르게 처리되고 있음을 알 수 있습니다! ( N
코어가있는 경우).
앱 장착을 사용하여 웹 응용 프로그램을 사용자 정의하거나 TLS를 활성화하거나 basic-auth-connect
와 같은 추가 미들웨어를 추가 할 수 있습니다.
$ npm install --save basic-auth-connect
var basicAuth = require ( 'basic-auth-connect' ) ;
var app = express . createServer ( { ... tls options ... } ) ;
app . use ( basicAuth ( 'foo' , 'bar' ) ) ;
app . use ( kue . app ) ;
app . listen ( 3000 ) ;
테스트 모드를 사용하여 모든 작업을 jobs
어레이로 밀어 넣습니다. 테스트중인 코드가 정확하게 일자리를 얻을 수 있도록 해당 배열의 작업에 대한 주장을하십시오.
queue = require ( 'kue' ) . createQueue ( ) ;
before ( function ( ) {
queue . testMode . enter ( ) ;
} ) ;
afterEach ( function ( ) {
queue . testMode . clear ( ) ;
} ) ;
after ( function ( ) {
queue . testMode . exit ( )
} ) ;
it ( 'does something cool' , function ( ) {
queue . createJob ( 'myJob' , { foo : 'bar' } ) . save ( ) ;
queue . createJob ( 'anotherJob' , { baz : 'bip' } ) . save ( ) ;
expect ( queue . testMode . jobs . length ) . to . equal ( 2 ) ;
expect ( queue . testMode . jobs [ 0 ] . type ) . to . equal ( 'myJob' ) ;
expect ( queue . testMode . jobs [ 0 ] . data ) . to . eql ( { foo : 'bar' } ) ;
} ) ;
중요 : 기본적으로 작업 모드 중에 생성 될 때 작업이 처리되지 않습니다. true to testmode.enter로 전달하여 작업 처리를 활성화 할 수 있습니다.
before ( function ( ) {
queue . testMode . enter ( true ) ;
} ) ;
우리는 기여를 좋아합니다!
기고 할 때 간단한 규칙을 따르십시오.
(MIT 라이센스)
Copyright (C) 2011 Learnboost <[email protected]>
이에 따라이 소프트웨어 및 관련 문서 파일 ( '소프트웨어')의 사본을 얻는 사람에게 허가는 제한없이 소프트웨어를 처리 할 수있는 권한이 부여됩니다. , 소프트웨어의 사본을 게시, 배포, 서브 리센스 및/또는 판매하고, 소프트웨어가 제공하도록하는 사람을 다음과 같은 조건에 따라 할 수 있도록합니다.
위의 저작권 통지 및이 권한 통지는 소프트웨어의 모든 사본 또는 실질적인 부분에 포함되어야합니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증 없이도 '있는 그대로'제공됩니다. 어떠한 경우에도 저자 또는 저작권 보유자는 계약, 불법 행위 또는 기타, 소프트웨어 또는 사용 또는 기타 거래와 관련하여 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않아야합니다. 소프트웨어.