代替手段としてEG Bullをご覧ください。ありがとう!
キューは、node.jsのために構築されたRedisに裏付けられた優先ジョブキューです。
Protipこれは最新のKueドキュメントです。チェンジリストも読んでください。
最新リリース:
$ npm install kue
マスターブランチ:
$ npm install http://github.com/Automattic/kue/tarball/master
最初にkue.createQueue()
を使用してジョブQueue
を作成します。
var kue = require ( 'kue' )
, queue = kue . createQueue ( ) ;
queue.create()
を呼び出してジョブのタイプ( "email")と任意のジョブデータを返します。 Job
を返します。これをsave()
ed()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
} ;
デフォルトでは、ジョブには1つの試みしかありません。つまり、失敗した場合、失敗としてマークされ、介入するまでそのままです。ただし、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 ;
} )
最後のシナリオでは、提供された機能が(評価を介して)実行され、次の試行遅延値を取得するために実行されます。つまり、外部/コンテキスト変数を参照することはできません。
ジョブプロデューサーは、仕事がアクティブな状態に住むことができる時間に有効期限を設定することができます。そのため、労働者がタイムリーに返信しなかった場合、KueはTTL exceeded
て失敗し、その仕事がアクティブな状態で立ち往生し、腐敗するのを防ぎます並行性。
queue . create ( 'email' , { title : 'email job with TTL' } ) . ttl ( milliseconds ) . save ( ) ;
ジョブ固有のログを使用すると、ジョブの生涯の任意の時点で情報をUIに公開できます。そのためには、 job.log()
を呼び出します。これは、sprintfのようなサポートのためのメッセージ文字列と可変argumentsを受け入れます。
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
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 ) ;
} ) ;
} ) ;
} ) ;
利用可能なイベントは、「ジョブイベント」で言及されたものと同じですが、「ジョブ」が付いています。
遅延したジョブは、 .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 ( ) ;
キューはタイマーで遅延したジョブをチェックし、スケジュールされた遅延を超えた場合にそれらを宣伝し、デフォルトでトップ1000のジョブのチェックに毎秒になります。
キューではジョブの処理は簡単です。最初に、ジョブを作成し、Redisなどへのアクセスを提供するために行うようにQueue
インスタンスを作成し、関連するタイプでqueue.process()
を呼び出します。 createQueue
という名前が示唆するものとは異なり、現在Singleton Queue
インスタンスを返すことに注意してください。したがって、node.jsプロセス内で1つのQueue
オブジェクトのみを構成および使用できます。
次の例では、コールバックdone
email
に渡します。エラーが発生したときに、 done(err)
done()
呼び出してkueに伝えます。この関数がエラーで応答すると、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 ( ) ;
}
労働者は、 Job.result
keyにそれを保存するためにdone(null,result)
としてジョブ結果を渡すこともできます。また、 result
complete
イベントハンドラーに渡され、仕事のプロデューサーが好きならそれを受け取ることができます。
デフォルトでは、 queue.process()
への呼び出しは、処理のために一度に1つのジョブのみを受け入れます。電子メールの送信などの小さなタスクの場合、これは理想的ではないため、数字を渡すことでこのタイプの最大アクティブジョブを指定することができます。
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 ) ;
} ) ;
} ) ;
注意キューのctx
パラメーター>=0.9.0
はプロセスコールバック関数の2番目の引数であり、 done
常に常に最後です
注pause
メソッドの署名はKue >=0.9.0
から変更され、コールバック関数を最後に移動します。
「実際の」例については、ノードカンバスを使用して多数のスライドからPDFをコンパイルする必要があるとします。私たちの仕事は次のデータで構成されている可能性があります。一般的に、大規模なデータをジョブに保存すべきではないことに注意してください。IDSのような参照を保存し、処理中にそれらを引き込む方が良いことに注意してください。
queue . create ( 'slideshow pdf' , {
title : user . name + "'s slideshow"
, slides : [ ... ] // keys to data stored in redis, mongodb, or some other store
} ) ;
job.data
プロパティを介して、処理中に別のプロセス内でこの同じ任意のデータにアクセスできます。この例では、各スライドを1つずつレンダリングし、ジョブのログと進行状況を更新します。
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)
現在のアクティブなジョブが完了した後、すべての労働者が処理を停止するようにシグナルを送信します。労働者は、アクティブな仕事が呼び出されるようにtimeout
ミリ秒を待ったり、シャットダウンエラーの理由でfailed
アクティブなジョブをマークします。すべての労働者がキューに止められていると言うと、彼らは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
メソッドの署名はキュー>=0.9.0
から変更され、コールバック関数を最後に移動することに注意してください。
Redisクライアントライブラリまたはキューのいずれかのすべてのエラーは、 Queue
オブジェクトに排出されます。イベントをerror
にバインドして、猛攻撃の例外を防止したり、キューエラーをデバッグしたりする必要があります。
var queue = require ( 'kue' ) . createQueue ( ) ;
queue . on ( 'error' , function ( err ) {
console . log ( 'Oops... ' , err ) ;
} ) ;
Kueは、作業者によってdone
ときに完了/失敗したジョブをマークします。したがって、適切なエラー処理を使用して、ワーカーのコードとnode.jsプロセスを防ぐために、ハンドルジョブが終了する前に出発する必要があります。これは2つの方法で実現できます。
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から廃止され、使用することはお勧めしません。
これは最も柔らかくて最良のソリューションですが、キューには組み込まれていません。この議論を参照してください。関連する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 )
} ) ;
しかし、これはドメインと同じように、asyncコールスタックの例外をキャッチすることはありません。
uncaughtException
に結合し、キューを優雅にシャットダウンしますが、これはエラーのコンテキストを失っているため、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 ) ;
} ) ;
} ) ;
キューは現在、クライアントサイドジョブの状態管理を使用しており、Redisがその操作の途中でクラッシュすると、いくつかのスタックジョブまたはインデックスの矛盾が発生します。その結果、特定の数のジョブが立ち往生し、新しいジョブが作成された場合にのみ労働者によって引き出されます。したがって、次のように電話して、この問題を修正するためにウォッチドッグを実行することを強くお勧めします。
queue . watchStuckJobs ( interval )
interval
はミリ秒単位で、デフォルトは1000msです
キューはバージョン1.0から完全にアトミックジョブの状態管理にリファクタリングされ、これはLUAスクリプトおよび/またはbrpoplpushの組み合わせによって発生します。こちらとこちらをご覧ください。
キューオブジェクトには、各州のジョブの数について説明する2つのタイプの方法があります
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...
} ) ;
ただし、2番目のものは大規模な展開に拡大しません。そこでは、より具体的な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
} ) ;
最後の2つの方法は、後の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はクライアントのデフォルト設定を使用してRedisに接続します(ポートのデフォルトは6379
、デフォルトは127.0.0.1
に、プレフィックスデフォルトはq
にデフォルトです)。 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
です。通常、プレフィックスは、複数のアプリに1つのRedisインスタンスを使用する必要がない限り、変更するべきではありません。また、メインアプリケーション全体で孤立したテストベッドを提供するのに役立ちます。
接続情報をURL文字列として指定することもできます。
var q = kue . createQueue ( {
redis : 'redis://example.com:1234?redis_option=value&redis_option=value'
} ) ;
node_redisはUnixドメインソケットをサポートしているため、Kueにそれを行うように指示することもできます。 Redisサーバーの構成については、Unix-Domain-Socketを参照してください。
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_redis apiに適合する(または適応した場合)node.js redis redisクライアントライブラリをキューに注入できます。 node_redis接続オプションを提供する代わりに、redis接続ファクトリーとして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 ) ;
}
}
} ) ;
すべての<0.8.xクライアントコードは、 <0.8.x
オプションを渡すようにリファクタリングして、 redis#createClient
をオーバーライドするモンキーパッチスタイルの代わりにQueue#createQueue
に渡すか、キュー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、およびプレフィックスのオプションを渡すことができます。例えば:
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 . app . set ( 'title' , 'My Application' ) ;
非デフォルトキューオプションを使用している場合、 kue.app
にアクセスする前にkue.createQueue(...)
を呼び出す必要があることに注意してください。
ArnaudBénardが寄稿したKue-UI Webインターフェイスを使用することもできます
UIキューとともに、UIが利用するJSON APIも公開します。
「Get /Job /Search?Q = AVIビデオ」など、ジョブのクエリ:
[ "5" , "7" , "10" ]
デフォルトでは、Kueは検索のためのジョブデータオブジェクト全体をインデックス化しますが、これはJob#searchKeys
呼び出すことでカスタマイズして、indexを作成するジョブデータのキーを伝えることができます。
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 ( ) ;
検索機能は、キュー>=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
:to
to、 "/jobs/0..2"、ここで:order
「asc」または「desc」になります:
[ { "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}
]
注:複数のジョブを大量に挿入する場合、1つの挿入が失敗した場合、キューは残りのジョブを順番に処理し続けます。応答配列には、ジョブのIDSが正常に追加され、故障した要素はエラーを説明するオブジェクトになります: {"error": "error reason"}
。
以下の例は、CLUSTERを使用してCPUにジョブ処理負荷を広める方法を示しています。より詳細な例については、Cluster Moduleのドキュメントを参照してください。
Cluster .isMaster
の場合、ファイルはマスタープロセスのコンテキストで実行されています。その場合、キューにバンドルされたWebアプリを起動するなど、1回しか必要ないタスクを実行できます。 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
コアがある場合)。
アプリマウントを使用して、Webアプリケーションをカスタマイズしたり、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をtestmode.enterに渡すことで、ジョブ処理を有効にすることができます
before ( function ( ) {
queue . testMode . enter ( true ) ;
} ) ;
貢献が大好きです!
貢献するときは、簡単なルールに従ってください。
(MITライセンス)
Copyright(c)2011 LearnBoost <[email protected]>
このソフトウェアおよび関連するドキュメントファイル(「ソフトウェア」)のコピーを取得している人に、これにより許可が無料で許可されます。 、ソフトウェアのコピーを公開、配布、サブライセンス、および/または販売し、次の条件を条件として、ソフトウェアが提供される人を許可します。
上記の著作権通知とこの許可通知は、ソフトウェアのすべてのコピーまたはかなりの部分に含まれるものとします。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的ないかなる種類の保証なしに「現状のまま」提供されます。いかなる場合でも、著者または著作権所有者は、契約、不法行為、またはその他の訴訟、ソフトウェアまたは使用またはその他の取引に関連する、またはその他の契約、またはその他の請求、またはその他の責任について責任を負いません。ソフトウェア。