タスクキューのチェインについて2(Mapper APIで代替も検討?)
#appengine のTaskQueueの実装を考えてるけど、バグとかで絶対エラーになる処理があるデータをどう扱うかとか、どこまで分散して突っ込むとか、そもそも突っ込む処理が30秒超えるかもとか、結構考えること多いな。
2010-08-10 12:07:17#appengine のTQのチェインってなんでしょうか?SDKのJAVADOCを見たけど載ってなかったような。実際にチェイン使ってる人いますかー?
2010-08-10 18:23:24@teamcounter タスク処理の最後で次のタスクを積むやり方です。よく使いますよ~ #appengine
2010-08-10 18:25:11@kazunori_279 たとえば、1000人の更新処理をタスクでループしてて100人目で30秒エラーになったら、エラーをキャッチして101人目から処理するようなタスクを積むということでしょうか? #appengine
2010-08-10 18:47:34@teamcounter 私の場合、リクエスト処理時間が20秒~25秒に達するまでひたすらループを回し(例えばエンティティを更新したり)、達したら次のタスクに引き継ぐ。。って感じで使っています。 #appengine
2010-08-10 18:50:01@kazunori_279 ということは時間を計測して30秒エラーで落ちる前に繋げてるんですね。バトンを渡し終わったタスクはリトライされないように擦る必要があるってことですか? #appengine
2010-08-10 19:01:14@drillbits その方法も考えてたんですけど、タスクが増えすぎるのも管理が辛くなるかと考えてました。 #appengine
2010-08-10 19:02:02@teamcounter リトライされても支障ないように「べき等」に書く必要がありますね。これはタスクチェインに限らないですけど #appengine
2010-08-10 19:03:13@kazunori_279 いえ、30秒制限があるのでそうしてたんですけど…かずのりさんのリクエスト時間測ってチェインするのがよさそうですね。普通に System#currentTimeMillis で測るんですよね?
2010-08-10 19:03:56@drillbits です。30秒に引っかからないような粒度のループにする必要がありますね。 #appengine
2010-08-10 19:05:38@teamcounter そうですね。さっきの方法で増産したタスクの処理でミスってて、すごい数のタスクが200回くらいリトライされてたことがあります! #appengine
2010-08-10 19:10:20私もこのパターンが多い。タスク積むだけの一層目、引数からタスクを実行する二層目。cronで一層目だけとか。 RT “@drillbits: タスクの中でループで更新処理とか怖いから、ループの中でそれぞれの処理をするタスクを積むとかしてるなあ #appengine”
2010-08-10 19:13:20@bluerabbit777jp そうですね、恐いって理由じゃないけど、並列性を出したいときはタスクを2段階にしますね。クエリするタスクチェーンまわして、更新するタスク群積んでいくとか。#appengine
2010-08-10 19:17:10@ashigeru 今から同じの書くならMapper APIが便利かも。。でも、あれって初段のmapperに適用するエンティティの条件指定ってできない気がする。。かならず全エンティティ対象になるかな。 #appengine
2010-08-10 19:19:44@ashigeru ふむ、その「子に置く」を事前に用意できてれば行けますね。任意条件でアドホックに一括処理するのは難しそう #appengine
2010-08-10 19:28:07@kazunori_279 アドホック向けにはちょっときつそうですね。ただ、クエリ条件を指定するとなんとなくshardingが難しくなりそう+MVPの扱いが難しくなりそうな印象が
2010-08-10 19:31:07@ashigeru そう、「クエリタスクチェーン→子タスク」パターンだと、クエリタスクの並列化に工夫が必要ですね。そこまで凝ったコード書いたことないす。。MVP? #appengine
2010-08-10 19:35:29