GeekFactory

int128.hatenablog.com

AppEngineで大量のエンティティを処理するパターン

App Engine上で大量のエンティティを処理するパターンをまとめてみました。

Concurrent Pattern

対象のエンティティをシャードに分割し、それぞれを並列に処理するパターンです。シャーディングを行うSplitterとエンティティを処理するMapperが並行して動きます。SplitterとMapperは独立したタスクであるため、memcacheを介してエンティティを受け渡します。

このパターンの利点は、エンティティの処理内容に関係なく一定のスループットを確保できることにあります。Mapperでどんなに長い処理を行ってもSplitterは淡々とシャーディングを続けるため、スループットに影響はありません。

Mapperの処理結果をmemcacheに突っ込み、別のタスクで集約することで、MapReduceのような処理も可能かなと思います。

Serialized Pattern

対象のエンティティを直列に処理するパターンです。いわゆるタスクチェーンです。実行順序が保証されるため、前後関係に基づいて処理したい場合に適しています。

いずれの場合も、エンティティを処理するmap()関数はべき等である必要があります。二重実行されても結果が変わらない必要があります。

TaskQueueの制限時間が長くなるとMapperで処理できることが増えますね。再びAppEngineの世界が変わる気がしています。

参考