検索エンジン on AppEngine 開発の問題点

最近、Google AppEngine上で動作する、単純なFacebook個人コンテンツ検索エンジンを開発している。現在幾つかの問題点にぶつかっているので、その問題点を列挙しておこうと思います。

1. Facebookコンテンツの取得(クロール)に時間がかかる

Facebookのデータ取得にはFacebookのGraph APIを利用しています。自分のユーザー権限を利用して取得できるアップデート(ポスト)の数は約50,000件になります。1度のAPI呼び出しに25件取得出来るので、データを全て取得する為には、2,000回APIを呼び出す必要があります。さらに1度のAPI呼び出しに約数秒かかり、遅いケースでは5秒以上かかるケースもあります。(Slow facebook API via Python on Google App Engine (GAE))ユーザーがサインナップしてから、検索を始める事が出来るようになるまでに、1時間とか2時間とか待たなければならない事は避けなければなりません。コンテンツにプライオリティを付けて重要なものから取得するなどの工夫が必要です。

2. AppEngineのDB(DataStore)への書き込みが遅い

検索エンジンには、転置インデックスというデータ構造を用いています。転置インデックスはKey-Valueのデータ構造を用い、Keyにはキーワード(単語)、Valueにはキーワードを含むドキュメントのリストが保持されます。キーワードの種類はインデックスするドキュメントにもよりますが、ロングテイルとなります。さらに実装にも依存しますが、同じキーワードに対して何回かの更新がかかります。現在共有出来る数値はありませんが、大量の書き込みがある場合はAppEngineのDataStoreは遅いように感じます。

AppEngineのHigh Replication DataStore (HRD)は、信頼性を上げる為に書き込み速度を犠牲にしています。「What are the speed comparisons of NDB vs DB (on High Replication Datastore)? 」によると、HRDの書き込み速度は45ms、Master-Slaveの書き込みは20msかかるようです。

3. AppEngineのDB(DataStore)への書き込みコストが高い

自分のケースでは、アップデート(ポスト)の件数が、約50,000件、転置インデックスインデックスのデータ数が約25,000件あります。合計約75,000。これだけのデータを書き込む(更新も含む)のに、AppEngineのダッシュボードによると0.77M (77万)回の書き込みオペレーションが発生、1M の書き込みオペレーションのコストは$1なので、実際に77セント課金されています。プラス読み込みoperationにも課金され、読み込みには57セント課金されています。合計$1.24。1人分のインデックス作成(約180人の友人がいるケース)に$1は個人サービスとしては高すぎると感じる。

補足

あまりに書き込みオペレーションの回数がデータ数に対して大きいので、もう少し調べた結果、DataStoreがサポートするインデックの為に作られるデータの書き込みもカウントされているようです。自分のデータでは、74,608のデータに対し、977,995のインデックの為のデータが作成されています。上記のデータと一致しないのは、情報取得時のタイミング?インデックスを自動的に作成されないように、インデックスを無効にすることにより、書き込み速度の向上、および書き込みコストが下がるか調べようと考えています。

プロトタイプ

現在のバージョンは自分のアップデートしか検索できませんが、下記から試す事が出来ます。

https://locateweb.appspot.com

Leave a comment