ku-sukeのブログ

Just another hatena blog

今時のWebエンジニアの入り口としてのGAE

 本日、GoogleがCloud SQLMySQLのレンタルみたいなの)の無料版を発表しました。500MB/6ヶ月でGoogle App Engineなどから無料で使えるようです。

さて、それはいいとして最近弊社なども含め、今時の環境って本気だすと複雑化してますよね。OSCで発表された前佛さんのMunin資料を31pと2つ戻って29pを見比べてみてくださいw


こんなの絶対おかしいよ!!

NoSQLや非同期処理など、様々な新しい技術にチャレンジしたいと思っていても、どこから手を付けよう、、みたいなことってありますよね。Cassandraがいいのかな、Redisがいいのかな?みたいにはてブの着いた記事があれば読んでみるんだけど、インストールとか面倒そうでやってない、そんなあなたです!

あなたが手を出さない理由

LAMPだけ触っていればよかった頃は幸せでした。さくらのサーバとかロリポップを借りて、フリーの掲示板スクリプトを借りてきて、FTPでアップロードして、多少パーミッションとかに苦労するくらいで、実践練習できたんです。

ところが、node.js / Cassandra / nginxで掲示板を作ろうと思ったらどうでしょうか。

  • まずVPSを借りて(それでも月額500円でVPSが借りれるのは幸せな時代ですが)
  • sshからのコマンドライン操作を覚えて
  • パッケージマネージャを使って基本的なソフトウエアをインストールして
  • パッケージマネージャにないものは独自でインストールして
  • なれないviとかでせこせこコンフィグいじって
  • セキュリティにも気をつけないといけないけどどうしていいか分からなくて

いや、そりゃミドルウエアの設定とかチューニングも覚えたいけどさ、まずは動かしたいんだよ!入力フォームにかいた文字がリクエスト送ったらDBに登録されて一覧出力される、、まずはそれだけでいいんだよ!

という、入門ハードルの高まりなのではないかと個人的には考えています。

はいそこでGoogle App Engineで入門しましょう

ひとまず、ミドルウエアのインストールとか抜きにして、Webエンジニアとして今時の環境で使われている技術を「体験しておきたい」「使い所を知っておきたい」という欲求があるのではないでしょうか。

今までは共用レンタルサーバが担っていたこの部分、実はクラウド時代はGoogleAppEngineでおなじ学習体験ができるのです!!

  • サーバの煩わしい設定不要
  • 好きな機能からかいつまんで学習できる
  • 無料あるいは低価格で始められる

そう、Google App Engineならね。


どーん

※追記:ブコメで、でもGAEはベンダーロックインだからって書いてる方居らっしゃったのですが、GAEのノウハウってコピペでは確かに移植できないですが、同じようなアーキテクチャを自分で書くときにものっすごく役に立つので、そんなに「損」はしないですよ。

GAEを使えば、JAVAPythonに加え、少し頑張ればjRubyやQuercus(PHP)、Scalaも使えますが、この先の勉強を考えると純正の言語をおすすめします。あ、Goもあったっけ、そうねそうね。はい。

今時のWebエンジニアが身に着けたいこんな技術

memcache

一応簡単なところから。memcacheは名前の通り、メモリ上にデータをキャッシュする技術ですが、多くのウェブアプリで、毎回取得する必要ないデータをおいておき高速に取得するために用いられます。

Google App Engineでは純正でmemcacheを利用することができ、memcachedをインストールしたり、ketamaを使ったConsistent Hashingの設定に悩むことはありません。ただこれだけです。

# python
memcache.add(key="chache_key_hogehoge", value="ここに値", time=3600)
NoSQL(AppEngine Datastore)

これはかなり重要です。もしあなたが情報処理などの勉強で、一生懸命DBの正規化を学んだのであれば、その延長で考えないことをおすすめします。NoSQLもそもそもGoogleBigTableの論文をもとに各社各OSSソフトウエアが始まったと言っても過言ではないので、同じくインストールしなくてもすぐ使えるDatastoreを使い倒して身につけましょう。

  • スキーマレスとはいえどのようにデータを確保するか?
  • JoinやGroup Byをほとんど使わずに求めるデータを表示できるか?
  • 独特なトランザクションや一貫性の保ち方は?

CAP定理もあわせて調べることで、Amazon DynamoDB、Redis、Cassandra、HBaseなどに入るときも「差分」を調べるだけで対応していくことができるでしょう。

OAuthを用いた外部認証

Twitterなどで経験されている方も多いですが、ユーザの認証を外部サービスを使って実現することも今時のWebサービスでは多く、外部サービス側を退会したらどうする?やセッションが切れたら再認証をどうする?といった点は設計力の向上につながります。

キューによるバックグラウンド処理

大規模サービスの場合、少し重い処理(数秒以上)が発生するときに、1リクエスト内で処理が完了するのを待っていると、あっというまにサーバが処理待ちで捌けなくなってしまいます。GAEのTask Queueを使うことで、ActiveMQなどのキュー処理について似た知識を得ることができるでしょう。

Map Reduceなどによるビッグデータ処理

Hadoopを導入している組織も多いと思うのですが、これももともとGoogleのMapReduceが元になります。Datastoreは実用レベルの集計は単体ではできませんが、MapReduceを使うことで実現が可能になります。さらにはBig Queryという関連サービスでは、10億行以上のデータからSQLのような条件句で一瞬で取り出すような機能もあります。

非同期操作

ScalaのPlay Frameworkなんかが注目されている理由の一つに、同期的な処理(通常のHTTPリクエスト)以外にWebSocketを用いた非同期処理用のコントローラが用意されている点が大きいのではないでしょうか。

AppEngineにもChannel APIを用いた非同期処理(WebSocketと非常に似ています)や、DataStoreへの非同期アクセスが用意されているので、まずはリクエストを投げて、他の処理を続行し、すべての処理が揃ったら最後にレスポンスを返す、といった処理が専用APIを叩くだけでこなせます。

信頼性の低いデータソースへの読み書き

AppEngineは、今でこそ殆どメンテナンスされなくなりましたが、以前は定期的なメンテナンスがありました。その期間中API呼び出しは失敗するので、アプリケーション側では常に失敗する場合を考慮したコードの書き方が推奨されていました。さらにDatastoreも、楽観的ロックを使用するためにEntityのgetやputを成功するまで5回whileで試行するといった書き方をしたこともありました。

たくさんのサーバを運用すると、どこかでサーバは壊れて応答しなくなります。API接続相手が緊急メンテナンスに入るかもしれません。そのようなときにデータ取得元も引きずられるのではなく正しいハンドリングができるような異常処理を書けることも勉強になります。

PageSpeedによるフロント最適化

HTMLを書いたままそのままブラウザに返していいのは小学生までですよね。ちゃんとminifyしたり、複数のCSSを一つにしてリクエスト数を減らしたり、小さな画像をCSS Spriteにしたり、キャッシュ時刻を設定したり、画像のメタデータを最適化したりといった、フロント周りの高速化はスマホ全盛の現代における必須知識です。

Google PagespeedサービスはApp Engineでなくても利用できますが、App Engineの場合管理画面から利用することが可能です。

デプロイプロセスの管理

App Engineはデプロイも専用のスクリプトを使って実施されます。例えばJAVAであれば事前に全てのjspをコンパイルしますし、デプロイするたびにバージョン番号を付与すれば、バージョン6をリリースしてうっかり問題が見つかってもクリック2回でバージョン5に戻すことが可能です。

さらには、全リクエストのxx%のみバージョン6を利用させる、といったFacebookみたいな超有名サービスでしかやってなさそうな、「一部のユーザのみ新しい機能が使える」といったことが簡単に実現可能です。このような自動化されたデプロイ方法を使いこなすと、もうSCPでちまちま上げたりという気にはならないですね!


以上、長々と書きましたが、このようなモダンな開発フロー、システムを「肌感覚」で理解しておくことにより、いざ自分がオリジナルな環境でシステムを組むことになっても、良いお手本になるのではないかと思います。

Google App Engine について - Google App Engine — Google Developers

最後までご覧いただきありがとうございました。