メニュー

2010年11月9日

Google App Engineについて

http://togetter.com/li/66450

これに関して書いておきます。

全体の流れはTogetterを見てください。

makotokuwataさんは勉強会を開催されていて影響力あると思うので、反論しておきます。

appengineには得手不得手があり、デメリットもあります。
これについてはmakotokuwataさんと意見の相違はないのですが、総合的に考えるとメリットのほうが大きい、というのが僕の意見です。


まずAppEngineがいまいちブレークしないのは、お金を集める仕組みが用意されていないことと、Datastore (Bigtable) の使い方が難しいことの2点だと思う。
Datastoreの難しさには同意です。
ただ、お金を集める仕組みはブレークには関係あるようには思えません。
appengineはアプリの実行環境であり、PayPalなりGoogle Checkoutなり、外部のシステムと連携すればいいだけです。
Amazon EC2やレンタルサーバにもPHPにもPythonにも、お金を集める仕組みは無いです。


で、2点目の「Datastore (Bigtable) が使いにくい」という点だけど、これはもうどうしようもない用に思う。つまり解決のめどが思いつかない。
これは、徐々にライブラリ等も増え、Google側も機能を増やしてくると思います。
ですので、いずれ解決する問題だと思います。



これはどちらが正しいかという話ではなくて、どちらにも利点と欠点はあるのだから、単に開発者がどちらを選ぶかという話に過ぎない。ただGAEでの問題点は、開発者には選ぶ自由がないことだ。つまり「性能はそこそこでいいから使いやすい方を選ぶ」ことができない。
利点と欠点があること、開発者が選ぶかに過ぎない、という点は同意です。
開発者には選ぶ自由がないというのは、プラットフォーム選定の段階で選んでいるので、選択の自由がないとは言えないでしょう。



GAEマンセーな人の意見はいつも、「高い性能を出すためには機能が犠牲になるのはやむを得ない」というものだけど、性能と機能のどちらを優先するかは開発者が決めることであって、プラットフォームで強制されることは、*本来は*おかしな話である。
性能と機能のどちらを優先するかは開発者が決めることなので、性能を優先するためにappengineを選んだのなら、それを「プラットフォームで強制される」とは言わず、制約ある環境を選んだだけでしょう。



あとアプリの性能は、なにもデータベースの性能だけに依存するものではない。どちらかというと、「いかにキャッシュをうまく効かせられるか」「いかにデータを分散できるか」のほうが重要であって、それだとBigtableである必要性は薄い。
データベースの性能だけに依存しない、というのは同意です。
appengineでもキャッシュは非常に重要な要素です。
ただ「データを分散」がRDBだと難しいのでappengineにメリットがあります。



いくらBigtableが高性能だといっても、RDBMSと比べるとずいぶん使い勝手が落ちるので、正直言ってプラスよりマイナスのほうが大きいんじゃないかと思う。
個人的には、appengineは多くのタイプのアプリケーションで、性能とコスト面でメリットがあるので、
マイナスよりプラスが大きいと思っています。



「高性能」と「高機能」はなかなか両立しない。そして歴史を振り返ってみると、「高性能(速いこと)」よりも「高機能(使いやすくて便利)」であるほうが好まれる傾向にあると思う。端的な例がプログラミング言語で、高性能なC++やJavaよりスクリプト言語のほうが今は人気だ。
「高性能」と「高機能」はなかなか両立しない、は同意です。
スクリプト言語に人気があるのは、ハードの性能向上により、性能の差を許容できるレベルになったからです。
逆に言えば、高性能なappengineが注目されているのは、高機能なRDBでは解決できない領域があるからです。ハードの性能があがれば、再びRDBの時代になるかもしれません。



データベースも、高性能だけど扱いにくいBigtabeよりも、性能は若干落ちるかもしれないけどずっと扱いやすいRDBMSのほうが、主流のままだと思う。
主流というのがよく分かりませんが、RDBは重要なところでこれからも使われるでしょうし、
メモリやSSDなどのハード性能向上により、さらに盛り上がる可能性もあるかなと思います。



GAEでも、BigtableにアクセスするよりもMemcacheにアクセスしたほうが高速なので、結局キャッシュしなきゃいけないなら、DBは多少遅いRDBMSでもいいと思う。
これは規模の問題で、アクセスが少なかったりデータ量が少ないならRDBでいいと思います。Datastoreはデータが数十~数百ギガバイトの単位になっても、数十ミリ秒でデータを取ってきます。RDBだと「多少遅い」ではすまないのではないでしょうか(高い商用サーバ等なら別かもしれませんが)。



あとGAEのBigtableは、現状ではどう考えてもRDBMSより信頼性が劣るので(マジでデータが消えることがある)、お金を扱うようなアプリをGAEで開発するのはおすすめしない。ブログとか掲示板とかにとどめておいたほうがいい。
5月頃に大規模障害があり、一部のデータが消えました。ただし、その後バックアップのデータは届き、手動でマージ出来ました。
RDBでもハードが壊れたら一緒なので、appengineの信頼性が低いわけではありません。レプリカなしでRDBを運用するくらいならappengineのほうが信頼できます。そして充分なバックアップ体制を用意するにはお金がかかるので、appengineにコストメリットがあります。



じゃあGAEは使い物にならないかというと、もちろんそんなことはなく、(A)収益は特に考えない(無料で使えればそれでいい)、(B)信頼性もそこそこでいい、(C)複雑なデータモデルは扱わない、という条件を満たすならGAEはお勧め。具体的にはブログとか掲示板ね。
ブログや掲示板が向いているというのは同意ですが、規模が必要ないならWordpressのほうが早いです(コードを書く必要すらありません)。
「信頼性」がデータという意味なら、僕は信頼にたるプラットフォームだと思っています。時々重くなったり、APIが失敗するという意味なら、たしかに1000回に1回はエラーが出ます。ただし自前のサーバで信頼性を担保するにはお金がかかります。よって、コストをかけてappengineより信頼性の高いシステムを作るか、コストメリットをとるか、です。



こういう条件を満たすアプリはけっこう多いはず。BTSとかグループウェアとか写真管理とか。反対に、在庫管理とか受注管理とか会計のシステムは、データモデルや検索条件も複雑だし、無理にBigtableやKVSを使うよりRDBMSを使ったほうがいいと思う。
在庫管理とか受注管理などはRDBがいい、には同意です。
その理由はデータ量が少ないからRDBでも性能要件を満たせるであろうから、です。
モデルが複雑だとしても性能要件が高いのであれば、appengineはありだと思います。




というわけで、Togetterをご覧になって、appengineをネガティブに捉えてた人もいらっしゃるかも知れませんが、
appengineは、いわゆるWeb開発では非常に大きなメリットがありますので、

ドキュメントをご覧になっていただいたり、
http://code.google.com/intl/ja/appengine/docs/

本も発売されていますし、
http://www.amazon.co.jp/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%BE%B9%E5%BA%95%E6%B4%BB%E7%94%A8-Slim3-Google-Engine-Java/dp/4798026999/

勉強会に参加されたり、
http://atnd.org/events/9571

Twitterに #appengine タグで質問してみてください。