Google App Engineで大量データを処理する場合、特別な配慮が必要になります。処理時間の制限など、独特の制約に引っ掛かる恐れがあるからです。

 大量データを扱うケースとして、テーブルのスキーマ変更、検索結果のダウンロードなど、データの一括処理という三つについて、それぞれの設計ノウハウを解説します。

スキーマのバージョンをフィールドに持つ

 一つ目の設計ノウハウは、テーブルのスキーマを変更する際に効果があるものです。

 稼働中のシステムにおいて、機能を追加・変更する際、テーブルのスキーマ変更が必要になる場合があります。スキーマの変更に備えて、Google App Engineでは、RDBベースの場合とは違った設計が必要になります。「スキーマのバージョンをフィールドに持つ」というものです。

 Datastoreはそもそも、同じテーブル内で、異なるスキーマのレコードが混在していてもかまわない「スキーマレス」のデータベースサービスです。フィールドを追加するといったスキーマの変更を、既存の全レコードに対してまとめて実行する機能はありません。全レコードにフィールドを追加するには、1件ずつレコードを取り出し、フィールドを追加して書き戻す必要があります。レコード件数が多いと、この処理には時間がかかります。何回かに分けて実行する必要があります。

 この処理を効率的に実行するには、テーブルのスキーマ設計をあらかじめ工夫しておく必要があります。何回かに分けて実行するフィールドの追加処理では、「まだフィールドを追加していないレコードを探す」操作が必要になります。ところがDatastoreには、「特定のフィールドを持たないレコード」を検索する機能がありません。「あるフィールドが特定の値を持つレコード」は検索できても、フィールドがないレコードは探せないのです。フィールドがないレコードを探すには、レコードを1件ずつ調べていくしかありません。処理には時間がかかります。

 そこで効果的なのが、スキーマのバージョンを保持するフィールドを全てのテーブルに用意しておくことです。スキーマの変更後にレコードを格納するとき、新しいバージョン番号を格納します。これでスキーマ変更前のレコードを効率良く検索できるようになります。バージョン番号が新バージョンよりも古いという条件で検索することにより、フィールドを持たないレコードを取り出せるからです。スキーマバージョンの組み込みは、ほぼ必須の設計ノウハウだと考えています。

検索結果のダウンロードなどは非同期で実行する

 二つ目は、検索結果をCSVファイルとしてダウンロードしたり、手元のCSVファイルをアップロードしてテーブルに登録したりするときの設計ノウハウです。

 データのダウンロードやアップロードは、Google App Engineでは途中でエラーになって強制終了になりやすい処理です。第2回で紹介したように、Google App Engineでは、Webブラウザーからのリクエストを処理するプログラムを、30秒以内に実行を終わらせる必要があり、30秒を超えるとエラーになります。

 ダウンロードやアップロードの処理は、この30秒以内という制約に引っ掛かりやすいのです。Datastoreへのデータの読み書きは1件当たり、数ミリ~数十ミリ秒かかります。ダウンロード/アップロードするデータ数が数千件になると、処理時間が30秒を超える可能性があります。

 これを避けるには、第2回で紹介した「Task Queue」による非同期処理が有効です。最大10分間動作を続けることができ、それでも終わらない場合は処理を分割して複数回に分けて実行できるからです。

 非同期処理を採用する場合、ブラウザーからダウンロードやアップロードの依頼を受け付けたとき、応答画面では「処理を受け付けました」といった通知を表示します。そのあと、ダウンロードの場合は、CSVファイルなどの作成が完了したときにメールで通知したり、CSVファイルなどの作成状況をブラウザーの画面で確認できるようにしたりして、ダウンロードのためのURLをユーザーに伝えます。アップロードに関しても、処理の完了をメールやブラウザーの画面で通知します。

 ダウンロードやアップロードをブラウザーからリクエストして、その場で結果を得たい(同期型で処理したい)と強く要請された場合はどうすればよいでしょうか。30秒で処理が終わるように、データ件数に上限を設けられないかどうかを相談してみましょう。

 ダウンロード処理を非同期で実装するには、収集したデータをファイルイメージにしてDatastoreに保存し、ユーザーにそのダウンロードリンク(URL)を通知する、といった方法があります。Google App Engineには、WindowsやLinuxが備えるようなファイルシステムがありませんが、Zipファイルのイメージは作成できます。Zipファイルなら、複数ファイルをまとめることもできて便利です。