タスクキューのチェインについて

タスクキューのチェインの仕方に関するajnな人々の議論
1
shin1ogawa @shin1ogawa

TaskQueueでシーケンスに長時間処理したい場合って、チェインしてTaskを登録するんじゃなくStatus200-299以外の300とか返すだけでもいい気がするな。実行開始時にStatus=300を設定して、全部の処理が終了した時だけ200を返すとか。 #appengine

2010-06-11 01:45:05
shin1ogawa @shin1ogawa

あーでもそれだと段々Taskの実行間隔が空いてしまうか。うーん。>200-299以外を返すことでTaskをチェイン #appengine

2010-06-11 01:46:42
Suguru ARAKAWA @ashigeru

@shin1ogawa わたしはTQの処理を「if (isCompleted()) return OK; doProcess() + addChain(); setCompleted(true);」な感じで必ず組んでますね #appengine

2010-06-11 01:49:21
shin1ogawa @shin1ogawa

@ashigeru setCompleted(true)した時にtrueの値はどこに保存しているカンジでしょうか?

2010-06-11 01:51:08
SHIIBA Mitsuyuki @bufferings

僕は「if (isCompleted()) return OK; addChain(); doProcess(); setCompleted(true);」がいいかなぁと想像してるのですが。 #appengine

2010-06-11 01:51:14
shin1ogawa @shin1ogawa

@bufferings 先にaddChain()するTaskは、30秒以上先にETAを設定する感じですか?

2010-06-11 01:53:47
Suguru ARAKAWA @ashigeru

@shin1ogawa 基本的にデータストアに登録してます>completed。タスクにユニークなキーを渡す感じです

2010-06-11 01:54:42
shin1ogawa @shin1ogawa

@ashigeru どこまで処理が終わったか?という情報(例えばKey)を格納する場合は、その値がnullかどうか、でも代用出来そうだけど、最後のaddChainが失敗することを考慮してcronが必要そうですね。 #appengine

2010-06-11 01:56:31
Suguru ARAKAWA @ashigeru

@bufferings chainがdo-processに依存するかどうかですかね

2010-06-11 01:57:16
shin1ogawa @shin1ogawa

ETAの設定が正しく働くなら、bufferingsさんの「先にaddChain、それに失敗したらエラー」が一番確実そうなんだけど、ETAを信用して良いかどうかが謎なんだよなぁw

2010-06-11 01:57:43
Suguru ARAKAWA @ashigeru

@shin1ogawa ん?addChainが失敗するというのはTQに突っ込んだはずが例外も無く突っ込まれていなかったケースですか?

2010-06-11 01:58:03
shin1ogawa @shin1ogawa

@ashigeru addChain()に失敗しつつ、DEEでaddChain()も間に合わないようなケースです。 #appengine

2010-06-11 01:58:38
Suguru ARAKAWA @ashigeru

@shin1ogawa そのときは、setCompletedしてないので自動的に再試行します

2010-06-11 01:59:34
SHIIBA Mitsuyuki @bufferings

@ashigeru なるほど。do-processに依存するケースもあるんですね。そうですね。

2010-06-11 02:00:11
Suguru ARAKAWA @ashigeru

@bufferings 並列性をあげる場合には、入り口のタスクと実際に重くなるタスクを分けて作ってます。入り口のタスクでkeyOnlyしてサブタスクにばら撒くとか

2010-06-11 02:01:13
shin1ogawa @shin1ogawa

@ashigeru ああそうか、DEEでHttpStatus500を返せばいいだけですね。 #appengine

2010-06-11 02:01:27
SHIIBA Mitsuyuki @bufferings

addChainを後に書いていて失敗したら嫌だなぁと思ってたけど、それはエラーのリトライにするんですね。じゃ、何度やっても失敗する長さのタスク以外は大丈夫か。 #appengine

2010-06-11 02:03:47
Suguru ARAKAWA @ashigeru

@shin1ogawa そです。さらにいえば、chainするタスクに連番キーを振ってcompletedを管理しておくと便利げです。

2010-06-11 02:03:55
shin1ogawa @shin1ogawa

ちなみに目的の処理は「TaskQueueを使って全エンティティをシーケンスになめる&何にか処理する」という処理。カーソルで処理開始位置を保存して、DEEになるまえにTask終了、addChainか200系以外を返すことで続きを処理するTaskを走らせたい。 #appengine

2010-06-11 02:04:42
Suguru ARAKAWA @ashigeru

@bufferings むしろチェインしてから失敗するとTQが爆裂するので、チェイン発行後はできるだけ失敗したくない感じです

2010-06-11 02:04:58
Suguru ARAKAWA @ashigeru

@shin1ogawa そういう場合はチェインより多層タスクのほうが管理も並列化も楽だと思います。keys onlyで範囲だけ決める1層目と、キーを元に処理する2層目ですね #appengine

2010-06-11 02:06:30
shin1ogawa @shin1ogawa

1段目のタスク:実際にはカーソルで100件ずつくらい飛ばし飛ばしにKeyのブロックを取得して、その単位で2段目のタスクを投入。そのKeyのブロック単位の2段目のTaskはKeyを使って自身をリトライ。これをやろうとしてるかんじ。 #appengine

2010-06-11 02:07:15
SHIIBA Mitsuyuki @bufferings

@ashigeru 並列実行可能なタスクの場合は入口でばら撒く。なるほどです。その場合タスク毎にcompletedを管理ですね。

2010-06-11 02:07:19
shin1ogawa @shin1ogawa

@ashigeru それと全く同じ事をやろうとしているようですw #appengine

2010-06-11 02:07:37