appengine活用事例資料@TDDBC札幌2.1

3,493 views

Published on

2011/9/24開催「TDD BootCamp 札幌 2.1」での発表資料です

Published in: Technology
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
3,493
On SlideShare
0
From Embeds
0
Number of Embeds
1,098
Actions
Shares
0
Downloads
10
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

appengine活用事例資料@TDDBC札幌2.1

  1. 1. appengine活用事例(Slim3,Scenic3,PirkaEngine, TDD,etc sue445
  2. 2. @sue445 (すえよんよんご/末吉 剛)• 避暑のため東京から参戦 o ただし福岡出身なので寒いのは苦手w• レッドフォックス株式会社所属 o SIでwebアプリ中心に1人TDDやってます• Google App Engine/Slim3クラスタ o appengineは1年半くらい触ってます o appengine ja nightには半分くらい参加 o (一応)Slim3のコミット権限所持w• TDD歴は1年くらい o 福岡、東京1.5に続き3回目の参加 o 今回は(も)JavaのTA JavaやSlim3のことなら何でも聞いてください!
  3. 3. jubeat(ユビート)beatmania, DDR, ポップンミュージックに代表されるいわゆるKONAMIの音ゲー
  4. 4. jubeat plus• jubeatのiPad/iPhoneアプリ版• アプリ本体は無料• 楽曲パックが4曲入り450円• 現在まで30パック以上配信
  5. 5. (ユビートプラスプラス)• http://jubeatplusplus.appspot.com/• jubeat plusのスコア登録サイト• iPhone Explorerで抽出したsqliteファイルをサイトにアップ ロードしてスコア登録(厳密にはCSVファイルを経由)• 登録したスコアをwebに公開したり、平均スコアからの差分 を見ることができます
  6. 6. jubeat++のアーキテクチャ• Google App Engine• Slim3 (+ ktrwjr)• Scenic3• PirkaEngine• Twitter4j• jQuery• Maven2• etc...
  7. 7. Google App Enginehttp://code.google.com/intl/ja/appengine/ • Googleが提供しているPaaS o Python/Java/Goがあるけど最終的にはAjaxにいきつくの でどの言語を使っても一緒 o 無料で始められて無料で続けられるのがウリだった(過 去形)。料金体系の変更(11/1〜)により無料枠では厳しい か o 他のPaaSやIaaSに比べて学習コストが多少高いのがネッ クか? • 提供されている機能の一部 o UserService, Datastore(BigTable), Memcache, cron, Task Queue, URL Fetch, Mail, Channel, etc... o http://code.google.com/intl/en/appengine/docs/java/overvi ew.html
  8. 8. appengineのサーバ構成
  9. 9. 静的コンテンツにアクセスがあった場合• 静的コンテンツへのアクセスはFrontEnd Serverだけ見に行くので爆速• Googleの過去の歴史からもFrontEnd Serverが 落ちたことはほとんどないらしい
  10. 10. 動的コンテンツにアクセスがあった場合• App Serverは一定時間アクセスがないとインスタンスが落ちるため (spin off)、起動に時間がかかる(spin up)• 素のServletだけでspin upは600msくらい• 30秒ルールがあるためspin upは速ければ速い方がいい• appengine自体が1秒で処理する用に最適化されていて、スケール アウトもされやすくなる
  11. 11. spin upと戦うために• ライブラリへの依存は極力減らす o jarがたくさんあるとClassLoaderで読み込む時に時間が かかりボトルネックになる o WEB-INF/libにあるだけなら無害(JUnitとか) o commons系もできれば使わない方がいい• JSPは使わない o Jasperの初期化だけで5000~6000msかかるため• オンプレで使ってるようなFWは使わない o この手のFWは初期化に時間がかかるため o Springだと最低限の初期化だけで10000ms以上かかる o FWは初期化の速い物だけを使う
  12. 12. spin upと戦う方法【結論】Ajaxを使う• 画面はモックhtmlを返し動的コンテンツはjsで処理する• htmlならFrontEnd Serverから返されるので速く,spin upに影 響されない• Server Sideはjsonを返すだけにすれば純粋なデータだけを 返すのでspin upの時間もそんなにかからない(素のServletと 同じくらい)• appengineではThread生成はできないがAjaxから非同期で呼 ぶことにより実質的にマルチスレッドで動かせる参考資料:@higayasuo さんのブログ• App Engineではどの言語を使えばいいのか• AppEngine/Jのspin-upを劇的に改善する方法
  13. 13. Slim3https://sites.google.com/site/slim3appengine/ • メインコミッタはSeasar2の @higayasuo さん • appengineに特化したFWでappengineでJavaならこれがデ ファクトスタンダード • spin upに強い(1000ms前後) • Datastore周りだけでも使う価値あり o S2JDBCのような流れるコーディング • テストの時はDatastoreやMemcacheのデータが setUp/tearDownで初期化されるのが便利
  14. 14. Kotori Web JUnit Runner (ktrwjr)http://code.google.com/p/ktrwjr/wiki/KotoriWebJUnitRunner • @bufferings さん作 • appengineサーバ用のJUnitランナー • slim3にバンドルされている • 本番サーバやローカルサーバでテストケースを実行できる • 本番とローカルで挙動が違うのはよくあることなので本番 サーバでテストケースを動かせるのは嬉しい • テストとはいえDatastoreのデータは共通なのでupdate系は 要注意 o 本番環境上では動かさないようにするか、ステージング 用にアプリを1つ作るのが吉
  15. 15. Scenic3http://sites.google.com/site/aboutscenic3/• @shuji_w6eさん作• Slim3のControllerを薄くラップしたライブラリ• Controllerクラスを複数集めたPageクラスを扱うのでクラス が増えすぎない。Struts感覚で使える o jubeat++だとPageは全17クラス、Controllerに換算すると 全部で37個 o 同じクラスにあった方がリファクタリングはしやすい
  16. 16. 1画面をSlim3で作るとこんな感じpackage net.sue445.jubeatplusplus.controller.home.user.update;// 入力フォーム初期化public class InputController extends Controller{ public Navigation run(){ }}// 確認ボタンpublic class ConfirmController extends Controller{ public Navigation run(){ }}// 登録ボタンpublic class ExecuteController extends Controller{ public Navigation run(){ }}
  17. 17. Scenic3だとこんな感じpackage net.sue445.jubeatplusplus.page.home.user;// ユーザ情報変更ページ@Page("/home/user/update")public class UpdatePage extends ScenicPage{ // 入力フォーム初期化 @ActionPath("input") public Navigation input(){ } // 確認ボタン @ActionPath("confirm") public Navigation confirm( @RequestParam("userId") String userId, @RequestParam("userName") String userName){ } // 登録ボタン @ActionPath("execute") public Navigation execute( @RequestParam("userId") String userId, @RequestParam("userName") String userName){ }}
  18. 18. PirkaEnginehttp://docs.pirkaengine.org/• @shuji_w6eさん作• scenic3と連携することができるテンプレートエンジン• 普通のHTMLファイルをテンプレートとして使える o モックとして作ったHTMLをそのままソースに組み込め る(JSPに組み込む手間が省ける)• レスポンスをアプリ側で管理できるのもメリット o 画面生成が重いページはHTMLをMemcacheに入れておく ことで速くできる o 例) jubeat++のスコアページ  キャッシュ非使用時: 7000ms  キャッシュ使用時: 100ms前後
  19. 19. その他• Twitter4j o Java用Twitterライブラリで、JavaでTwitterやるなら定番 o appengine用のjarを使えばappengineの非同期APIを使う のでかなり速い• Maven2 o appengineやslim3は頻繁にアップデートされるためpom を編集するだけですぐにjarを差し替えることができるの は便利 o アーキタイプもあるのでプロジェクト作成も楽々
  20. 20. 参考文献(スターターキット)プログラミングGoogle App Engine• 2009年11月出版ということで若 干情報は古いが、appengineに ついて広く深く網羅していて詳 しい• JavaとPythonについてほぼ半々 記載されているのでPythonな人 にもおすすめ
  21. 21. 参考文献(スターターキット)オープンソース徹底活用 Slim3 onGoogle App Engine for Java• Slim3といいつつもDatastoreの インデックスの説明が中心なの でどの言語であっても有用• Datastoreはインデックスの構 造が一番のキモなのでこれを読 めばだいたい理解できる
  22. 22. 参考文献(実践編)オープンソース徹底活用 Slim3によるWebアプリケーション開発• FWとしてSlim3を使う実用的な 1冊• Slim3+GWTを用いた実際のア プリ開発を元にしているので Entity設計が参考になる• Slim3でのテスト手法について あまり言及されてなかったのが 難点(´・ω・`)
  23. 23. 参考文献(実践編)作ればわかる!Google App Enginefor Javaプログラミング• Mashup系中心で TwitterAPI, Google Maps, OpenID など周辺技術との連携が豊富なの でサンプルが非常に実用的• appengineの機能に関しても一通 り網羅している• ServletやJSPの基礎から書いてあ るので新卒研修にも最適w
  24. 24. 分からないことがあったらTwitterで #gaeja や #slim3 をつけて質問すれば誰か教えてくれるハズ
  25. 25. おまけ(S3 Tiger)• S3 Tiger o Slim3用のテスティングユーティリティを作りました o https://github.com/sue445/s3tiger
  26. 26. Slim3だとpublic class SomeTest{ @Test public void ignoreOnlyProduction(){ if(AppEngineUtil.isProduction()){ return; } // 本番サーバだけでは動かしたくないテスト } @Test public void ignoreOnlyDevelopment(){ if(AppEngineUtil.isDevelopment()){ return; } // 開発サーバだけでは動かしたくないテスト }}
  27. 27. S3 Tigerだとimport net.sue445.s3tiger.Slim3;@RunWith(Slim3.class)public class SomeTest{ @IgnoreProduction @Test public void ignoreOnlyProduction(){ // 本番サーバだけでは動かしたくないテスト } @IgnoreDevelopment @Test public void ignoreOnlyDevelopment(){ // 開発サーバだけでは動かしたくないテスト }}
  28. 28. クラスにもOKimport net.sue445.s3tiger.Slim3;// 本番サーバでは動かしたくないテストクラス@RunWith(Slim3.class)@IgnoreProductionpublic class OtherTest{ @Test public void someTest(){ ~ }}
  29. 29. アノテーションでDRYを排除
  30. 30. ご清聴ありがとうございました!

×