タスクキューのチェインについて2(Mapper APIで代替も検討?)

タスクキューのチェインの仕方に関するajnな人々の議論 Mapper APIで代替も検討できるけど、MVPには注意!
0
teamcounter @teamcounter

#appengine のTaskQueueの実装を考えてるけど、バグとかで絶対エラーになる処理があるデータをどう扱うかとか、どこまで分散して突っ込むとか、そもそも突っ込む処理が30秒超えるかもとか、結構考えること多いな。

2010-08-10 12:07:17
teamcounter @teamcounter

#appengine のTQのチェインってなんでしょうか?SDKのJAVADOCを見たけど載ってなかったような。実際にチェイン使ってる人いますかー?

2010-08-10 18:23:24
Kazunori Sato @kazunori_279

@teamcounter タスク処理の最後で次のタスクを積むやり方です。よく使いますよ~ #appengine

2010-08-10 18:25:11
teamcounter @teamcounter

@kazunori_279 たとえば、1000人の更新処理をタスクでループしてて100人目で30秒エラーになったら、エラーをキャッチして101人目から処理するようなタスクを積むということでしょうか? #appengine

2010-08-10 18:47:34
Kazunori Sato @kazunori_279

@teamcounter 私の場合、リクエスト処理時間が20秒~25秒に達するまでひたすらループを回し(例えばエンティティを更新したり)、達したら次のタスクに引き継ぐ。。って感じで使っています。 #appengine

2010-08-10 18:50:01
neji @drillbits

タスクの中でループで更新処理とか怖いから、ループの中でそれぞれの処理をするタスクを積むとかしてるなあ #appengine

2010-08-10 18:54:51
neji @drillbits

それぞれの処理で使う引数に文字列しか渡せないけど #appengine

2010-08-10 18:56:55
neji @drillbits

F10押すのがめんどくさいので、もうあっぺんぎねでいいよ

2010-08-10 18:58:04
Kazunori Sato @kazunori_279

@drillbits そう?べき等に書いておけば大丈夫と思うけど。。 #appengine

2010-08-10 18:59:19
teamcounter @teamcounter

@kazunori_279 ということは時間を計測して30秒エラーで落ちる前に繋げてるんですね。バトンを渡し終わったタスクはリトライされないように擦る必要があるってことですか? #appengine

2010-08-10 19:01:14
teamcounter @teamcounter

@drillbits その方法も考えてたんですけど、タスクが増えすぎるのも管理が辛くなるかと考えてました。 #appengine

2010-08-10 19:02:02
Kazunori Sato @kazunori_279

@teamcounter リトライされても支障ないように「べき等」に書く必要がありますね。これはタスクチェインに限らないですけど #appengine

2010-08-10 19:03:13
neji @drillbits

@kazunori_279 いえ、30秒制限があるのでそうしてたんですけど…かずのりさんのリクエスト時間測ってチェインするのがよさそうですね。普通に System#currentTimeMillis で測るんですよね?

2010-08-10 19:03:56
Kazunori Sato @kazunori_279

@drillbits です。30秒に引っかからないような粒度のループにする必要がありますね。 #appengine

2010-08-10 19:05:38
neji @drillbits

@teamcounter そうですね。さっきの方法で増産したタスクの処理でミスってて、すごい数のタスクが200回くらいリトライされてたことがあります! #appengine

2010-08-10 19:10:20
あおうさ @bluerabbit777jp

私もこのパターンが多い。タスク積むだけの一層目、引数からタスクを実行する二層目。cronで一層目だけとか。 RT “@drillbits: タスクの中でループで更新処理とか怖いから、ループの中でそれぞれの処理をするタスクを積むとかしてるなあ #appengine

2010-08-10 19:13:20
Kazunori Sato @kazunori_279

@bluerabbit777jp そうですね、恐いって理由じゃないけど、並列性を出したいときはタスクを2段階にしますね。クエリするタスクチェーンまわして、更新するタスク群積んでいくとか。#appengine

2010-08-10 19:17:10
Suguru ARAKAWA @ashigeru

@kazunori_279 最近だと、Mapper APIで代替できるケースが多くないですかね?

2010-08-10 19:17:45
Kazunori Sato @kazunori_279

@ashigeru 今から同じの書くならMapper APIが便利かも。。でも、あれって初段のmapperに適用するエンティティの条件指定ってできない気がする。。かならず全エンティティ対象になるかな。 #appengine

2010-08-10 19:19:44
neji @drillbits

(慌てて Mapper API でググる俺)#appengine

2010-08-10 19:20:46
Suguru ARAKAWA @ashigeru

@kazunori_279 「変更要求」のカインドを作って対象の子に置くとか

2010-08-10 19:24:02
Kazunori Sato @kazunori_279

@ashigeru ふむ、その「子に置く」を事前に用意できてれば行けますね。任意条件でアドホックに一括処理するのは難しそう #appengine

2010-08-10 19:28:07
Suguru ARAKAWA @ashigeru

@kazunori_279 アドホック向けにはちょっときつそうですね。ただ、クエリ条件を指定するとなんとなくshardingが難しくなりそう+MVPの扱いが難しくなりそうな印象が

2010-08-10 19:31:07
Kazunori Sato @kazunori_279

@ashigeru そう、「クエリタスクチェーン→子タスク」パターンだと、クエリタスクの並列化に工夫が必要ですね。そこまで凝ったコード書いたことないす。。MVP? #appengine

2010-08-10 19:35:29