タグ: GoogleAppEngine

先日のエントリーでGoogle App Engine(以下GAE)での制限、特にDatestore Read Operation(以下DRO)の制限がキツイということを書いたけど、割と驚いてしまう事実が発覚した。

あの後、とりあえずMemcacheを使って必要最低限のデータアクセスで済む様にプログラムをチューンアップしてみて、実際にデータストアへの接続回数は改善された。が、どうにも改善されすぎている・・・。ー昨日は半日も持たずにDROが臨界点に達していたのに、昨日確認すると2%ほどしか消費されていない。Googlebotの巡回の量が減ったのかな?と思ったのだけど、そこまで目立った変化は無さそうだし、どうにも解せない。プログラムでコンテンツを表示する以上、キャッシュを使うといっても限度があり、普通に考えてそこまでの成果が出るとは考えにくい(厳密には他にもチューニングはしてるのだが)。

あれこれ考えてみて、一昨日はGAEの管理コンソール上でDatestore Viewerでデータの中身を確認していたことに思い出し、それが何か関係しているのかと調べてみたら、やっぱり管理コンソール上での作業もデータアクセスとみなされる模様。しかも管理コンソール上では、データは20件ずつ表示されるのだが、これはどうも全件取得してからそのうちの20件を表示すると言うような動きをしているみたい。(GQLコンソールを確認すると“SELECT FROM ***”でデータ取得を行っていた)

僕が保持しているデータストアの総数は1000件以上あるわけだけど、全件見ようとしたら1000×50でこれだけで一日のDROを消費されてしまうというからくりということが分かった。

公開して日も短く、Googlebot以外には殆どユーザーのアクセスが無い状況でこれだったので、途方にくれていたけど、まだGAEに関しては何とかなりそうで少し安心。むしろ早い段階でプログラムのチューンアップをする機会になってよかったと思う。

後はAmazon Product Advertising API のリクエスト制限(2000/h)の問題だけど、こればっかりはどうしたもんか・・・。



仕事をやめてから、今までろくろく出来なかったプログラミングを習得しようと職業訓練校に通ったことは以前のエントリーで記入したが、その後自前で簡単なWebサービスを作り一応公開をしている。


WEBサービスを作るにあたって最も苦慮した点としては、やはりサーバー等の準備だろう。PHPなどと違って、Javaは無料のレンタルサーバーで利用が可能なケースが殆どなく、あったとしても審査がかなり厳しかったりなどハードルは決して低くは無かった。そういう事情もあって取れる選択肢が実質的に“Google App Engine(以下GAE)”一択だった訳だが、どうにもこれが相当に使いにくい。

第一に、GAEではRDBが使えない(課金すればMySQLが使えるみたいだが)、第二にプログラミング上で様々な制約がある、そして第三に無料で使える要領が相当にタイト、ということが挙げられる。

RDBが使えないことについては正直慣れの問題で、もともとプログラマでもない僕にとっては、にわか仕込みで身に付けたMySQLからJDO(GAEで採用しているデータ格納の形式)に鞍替えするのには正直そこまで苦労はしなかった。今では手続きが簡素で、データ型にコレクションクラスが使えるJDOの方がやりやすいとまで感じている。プログラミング上の制約についても、利用可能なクラスが制限されていたりするが、基本的にはそこまで問題ではなかった。

しかし、三番目の無料で使用できるリソースについてはかなり厄介だ。現時点で躓いてしまい、回避方法を模索中だが、中々に根深いと感じる。因みに今躓いているところはタイトルにもあるとおり、“Datastore Read Operations( データストアに格納されているデータの読み込み )”についての制限だ。GAEのガイドラインには一日に0.05M回(つまり50,000回)が限度とされており正直ここいらへんは最初にざっと読み通していただけ出し、「5万回もありゃ充分やん」程度にしか考えていなかった。しかし、ここが落とし穴でこのRead Operationがどの単位で行われているかを理解しなかったため、本日サービスの一時停止という憂き目にあってしまった。

最初読み通していたときには、5万回データ取得が可能という風に考えていたが、実際には一回のデータアクセスでも1回に1000件のデータを抽出したとすると1000回分のOperationが実行されたとカウントされるようだ。

なので一度の多くのデータを抽出することを前提にアプリを作っていると、あっという間に許容量をオーバーしてしまい、一時的にサービスが停止してしまう。もっとも課金すれば上限を増やせるらしいのだが、サービスが軌道に乗るまではあまりお金を掛けたくないというのが実情。

また、setRange()メソッドで抽出するデータ量の制限を掛けたところでも、内部的に全件取得してから該当するレンジのデータを抽出するという形をとっているみたいで、これでも結果は変わらないという報告も出ている。

そうなると、“Select From ***(データベース名)”という実行の仕方ではいかんともしがたく、“Select From *** where id == ● ● ”みたいな形でデータを取得する必要がありそう。しかし、これだとかなり窮屈なつくりになってしまうのでもう何手間か必要になってきそう。

現時点で考えられる手法としては、

1.MemCache使ってデータストアへのアクセス必要最低限にとどめる

2.XMLデータストアとは別に読み込み専用のデータ用意定期的にデータストアと同期する

といったところだろうか。

なんにせよ、GAEを使ってまともなアプリを作るのはかなり難易度が高いということだと思う。

CosPa!