appengine ja-night-sapporo#1

25
appengine ja night sapporo#1 GAEを効率よく学習するため のポイント shin1ogawa@株式会社トップゲート

Upload: shinichi-ogawa

Post on 01-Nov-2014

1.208 views

Category:

Documents


2 download

Tags:

DESCRIPTION

 

TRANSCRIPT

Page 1: Appengine ja-night-sapporo#1

appengine ja night

sapporo#1GAEを効率よく学習するため

のポイントshin1ogawa@株式会社トップゲート

Page 2: Appengine ja-night-sapporo#1

自己紹介...shin1ogawaです!Google AppEngine, Google Apps, Eclipse, Wicket, Maven, Hudson, 構成管理...などなどが大好きです。

東京のappengine ja nightから来ました。appengine ja nightの記念すべき第一回目にスピーカーとして登壇して以来、皆勤賞で参加しています。Twitterで#appengineタグを見守ったりしています。

株式会社トップゲート(http://www.topgate.co.jp)で、GoogleAppEngine, GoogleApps, Androidを使った開発の仕事をしています。

Page 3: Appengine ja-night-sapporo#1

【宣伝】執筆しました!通称Slim3本が先月末に刊行されました。全然Slim3本では無い気がしますが、本格的にApp Engineを触る方は是非お買い求めください。

Page 4: Appengine ja-night-sapporo#1

【勝手に宣伝】あわせて読みたいappengine ja nightにもよく参加される @hidemotoNakada 先生が執筆されました。Slim3本だけだとデータストアの話ばかりですので、その他サービスも網羅したい入門者の方にはこちらも合わせてお薦めします。

Page 5: Appengine ja-night-sapporo#1

AppEngineとは?簡単におさらい

Page 6: Appengine ja-night-sapporo#1

Google App Engineとは?

• JavaやPythonで構築したWebアプリケーションを配置・運営することが出来る、 Googleが無料で提供しているプラットフォーム。

• 自動でスケールアウトして負荷に対応。スケールアウトサーバの管理は不要(アプリケーションのデプロイがメイン)

• PaaSに分類される

Page 7: Appengine ja-night-sapporo#1

使いどころ• 自社サイト (静的サイトも可)• コンシューマ向け自社サービス• 特定期間・特定の時間帯のみ負荷がかかるようなサイト

• Google Appsとの連携アプリケーション• 「規模が小さい」業務アプリケーション• 「規模が大きい」業務アプリケーション…?• 基幹系等のクリティカルなシステム

Page 8: Appengine ja-night-sapporo#1

使いどころ• 自社サイト (静的サイトも可)• コンシューマ向け自社サービス• 特定期間・特定の時間帯のみ負荷がかかるようなサイト

• Google Appsとの連携アプリケーション• 「規模が小さい」業務アプリケーション• 「規模が大きい」業務アプリケーション…?• 基幹系等のクリティカルなシステム

Page 9: Appengine ja-night-sapporo#1

事例• オバマ大統領: 質問投票サイト• 2009年衆院選公式サイト• スポーツSNS LaBOLA• Chan-Toru beta• mixiアプリ: ふにゃもらけ等• iPhoneアプリ”HANDS Xmas”• TweetDeckのバックエンド• 弊社の事例• 社内に閉じたSFAとかApps拡張などなど。

Page 10: Appengine ja-night-sapporo#1

効率よく学習するためのポイント

Page 11: Appengine ja-night-sapporo#1

AppEngine/Javaを使うにはGoogle App Engine/Javaの環境向けの「単純なWebアプリケーション」を構築する場合は、基本的には従来のJ2EE(JavaEE)と似た様な感覚で構築することができます。Servletを作って、返却したいデータをHttpServletResponseに書き込むだけです。しかし、実際はそんな単純なアプリケーションはなく、データベース等の外部機能を使う事が殆どで、そうなってくると従来のWebアプリケーションと同じ感覚で構築できるとは限りません。

Page 12: Appengine ja-night-sapporo#1

Platformの仕組み

Page 13: Appengine ja-night-sapporo#1

Platformの仕組みの注意点(1)•今のところ、AppServerは一台(1インスタンス)につき同時にひとつのリクエストのみ処理できる。•複数のリクエストが並行して1インスタンスで実行されることは無い。•インスタンス数=同時に処理可能な数。•アプリケーションは常にシングルスレッドで実行されると思っても良い。•公式ドキュメントにもない情報だが、Googlerが暗に認めていました。

Page 14: Appengine ja-night-sapporo#1

Platformの仕組みの注意点(2)

•FrontEndに到着したリクエストは、処理を行っていないAppServerを探し、振り分ける。AppServerがひとつも空いていない時はリクエストをキューに放り込んでしばらく待つか、新しいAppServerを起動する。•リクエストキュー内で待たされたリクエストは10秒待たされた段階でエラーとしてレスポンスが返される!

Page 15: Appengine ja-night-sapporo#1

Spin-up, Spin-down(1)

•リクエスト数に対してAppServerのインスタンスが足りなくなってきた場合は、新しいAppServerを起動する。これをSpin-upと呼ぶ。•平均レスポンス時間が1000msを下回るアプリのみ、インスタンス数の上限が30を超えることができる。•性能が良い実装を心がけ、努力しましょう!

Page 16: Appengine ja-night-sapporo#1

Spin-up, Spin-down(2)•逆に、リクエストが少なくてAppServerが暇になってきたり、一定のリクエスト数を処理した場合はAppServerが終了する。これをSpin-downと呼ぶ。•30秒制限の解釈•インスタンスが存在しない状態で、リクエストが二つ来た。ひとつ目がSpinup開始で、もうひとつはキューで待つ。Spinupに15秒かかるフレームワークだと…?•実質10秒制限、と考えおくのが安全です!

Page 17: Appengine ja-night-sapporo#1

Java的な注意点•スケールアウトするという事は、複数のVMで実行されるということ。•変更が前提の変数をstaticに使うと…?•Memcacheサービスを使いましょう!•ファイルアクセスやスレッド、ソケットの使用等が禁止されているしJDK内でも使用できないクラスがある。•依存するフレームワークやライブラリが使っているかもしれない。•whitelistも参考にしましょう!

Page 18: Appengine ja-night-sapporo#1

常に発生する可能性がある例外•Datastore*Exception•データストアへのアクセスの際など•OverQuotaException•リソースの上限に達したとき•DeadlineExceededException•リクエストの30秒制限に達した時•各種サービスの時間制限に達した時•他にもいくつか。•コントローラの大本などでも念のためまとめてハンドルしておきましょう!

Page 19: Appengine ja-night-sapporo#1

リソース使用量的な注意点•一定期間内の制限•月単位、日単位、分単位の上限がある。•日単位で問題なくても分単位の上限にかかるとダメ。案外気づかない人が多いです。

•API的な制限•各サービスへのリクエストサイズは1MBまで•30秒制限などなど•課金を有効にしても、上限がまったく変わらないものもあります。金でなんでも解決できるわけではありません!

Page 20: Appengine ja-night-sapporo#1

データベースの注意点•RDBとは違う。以下のふたつが重要なキーワード•インデックス、スキャン•エンティティグループ、トランザクション•「パターン」が存在する。•非正規化、Insertがんばれ•更新対象の分散•自動で作成されるインデックスもあり、それらもデータストアの容量を消費する。•データストアについてはSlim3本を読んでくry

Page 21: Appengine ja-night-sapporo#1

TaskQueueの活用•TaskQueueは単なるバックグラウンド(非同期)処理ではない。•「成功するまで何度でもリトライが行われる」という特徴がある。

•例)カウンタがあったとしましょう。•「メンテナンス状態=読み込み専用状態」中にはデータストアの更新ができない。•常にTaskQueueからカウンタを更新する仕様にすると…?

•TaskQueueは工夫次第でかなり便利かも!?

Page 22: Appengine ja-night-sapporo#1

SDKのバージョンアップ•EclipsePlugin経由でSDKを更新して、それをデフォルトに設定する。ここまでは問題ない。•その設定はコンパイル時には適用されている。•しかし、実行時に参照されるのは「WEB-INF/lib配下のjar」である。•コンパイルが通っているのに、実行するとメソッドやクラスが見つからないとかでハマる。

•SDKのバージョンアップを行ったときは、WEB-INF/lib配下のjarをよく確認しましょう!

Page 23: Appengine ja-night-sapporo#1

情報収集•冒頭で紹介した書籍•機能がどんどん増えるので、新しい方が良い。•Twitterで「#appengine」タグ•appengine ja night•#ajnX タグ•関連する人たち•Googleの公式ML(Google Group)•googleappengine•appengine-java•特に強力なのはTwitterです。

Page 24: Appengine ja-night-sapporo#1

何か質問はありませんか?

•せっかく札幌に来ましたので、何かあれば質問してみてください!

Page 25: Appengine ja-night-sapporo#1

ご清聴ありがとうございました!

shin1ogawa@株式会社トップゲート