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

Post on 31-May-2015

3.182 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

appengine 活用事例( Slim3,Scenic3,PirkaEngine,

TDD,etc

sue445

@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 のことなら何でも聞いてください!

jubeat (ユビート)beatmania, DDR, ポップンミュージックに代表されるいわゆる KONAMI の音ゲー

jubeat plus

• jubeat の iPad/iPhone アプリ版

• アプリ本体は無料• 楽曲パックが 4 曲入り 450 円• 現在まで 30 パック以上配信

(ユビートプラスプラス)

• http://jubeatplusplus.appspot.com/ • jubeat plus のスコア登録サイト• iPhone Explorer で抽出した sqlite ファイルをサイトにアッ

プロードしてスコア登録(厳密には CSV ファイルを経由)• 登録したスコアを web に公開したり、平均スコアからの差

分を見ることができます

jubeat++ のアーキテクチャ

• Google App Engine• Slim3 (+ ktrwjr)• Scenic3• PirkaEngine• Twitter4j• jQuery• Maven2• etc...

Google App Enginehttp://code.google.com/intl/ja/appengine/

• Google が提供している PaaSo Python/Java/Go があるけど最終的には Ajaxにいきつくのでどの言語を使っても一緒

o 無料で始められて無料で続けられるのがウリだった(過去形)。料金体系の変更 (11/1 〜 ) により無料枠では厳しいか

o 他の PaaS や IaaS に比べて学習コストが多少高いのがネックか?

• 提供されている機能の一部o UserService, Datastore(BigTable), Memcache, cron,

TaskQueue, URL Fetch, Mail, Channel, etc...o http://code.google.com/intl/en/appengine/docs/java/overvi

ew.html

appengine のサーバ構成

静的コンテンツにアクセスがあった場合

• 静的コンテンツへのアクセスは FrontEnd Server だけ見に行くので爆速

• Google の過去の歴史からも FrontEnd Serverが落ちたことはほとんどないらしい

動的コンテンツにアクセスがあった場合

• App Server は一定時間アクセスがないとインスタンスが落ちるため (spin off) 、起動に時間がかかる (spin up)

• 素の Servlet だけで spin up は 600ms くらい• 30 秒ルールがあるため spin up は速ければ速い方がいい• appengine 自体が 1 秒で処理する用に最適化されていて、スケール

アウトもされやすくなる

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 は初期化の速い物だけを使う

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を劇的に改善する方法

Slim3https://sites.google.com/site/slim3appengine/

• メインコミッタは Seasar2 の @higayasuo さん • appengine に特化した FW で appengine で Java ならこれが

デファクトスタンダード• spin up に強い( 1000ms前後) • Datastore周りだけでも使う価値あり

o S2JDBC のような流れるコーディング• テストの時は Datastore や Memcache のデータが setUp/

tearDown で初期化されるのが便利

Kotori Web JUnit Runner (ktrwjr)http://code.google.com/p/ktrwjr/wiki/KotoriWebJUnitRunner

• @bufferings さん作 • appengine サーバ用の JUnit ランナー • slim3 にバンドルされている• 本番サーバやローカルサーバでテストケースを実行できる• 本番とローカルで挙動が違うのはよくあることなので本番

サーバでテストケースを動かせるのは嬉しい• テストとはいえ Datastore のデータは共通なので update 系

は要注意o 本番環境上では動かさないようにするか、ステージング

用にアプリを1つ作るのが吉

Scenic3http://sites.google.com/site/aboutscenic3/

• @shuji_w6e さん作• Slim3 の Controller を薄くラップしたライブラリ• Controller クラスを複数集めた Page クラスを扱うのでクラ

スが増えすぎない。 Struts感覚で使えるo jubeat++ だと Page は全 17 クラス、 Controller に換算す

ると全部で 37個o 同じクラスにあった方がリファクタリングはしやすい

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(){  }}

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){  }}

PirkaEnginehttp://docs.pirkaengine.org/

• @shuji_w6e さん作• scenic3 と連携することができるテンプレートエンジン• 普通の HTML ファイルをテンプレートとして使える

o モックとして作った HTML をそのままソースに組み込める (JSP に組み込む手間が省ける )

• レスポンスをアプリ側で管理できるのもメリットo 画面生成が重いページは HTML を Memcache に入れてお

くことで速くできるo 例 ) jubeat++のスコアページ

キャッシュ非使用時 : 7000ms キャッシュ使用時 : 100ms前後

その他• Twitter4j

o Java 用 Twitter ライブラリで、 Java で Twitter やるなら定番

o appengine 用の jar を使えば appengine の非同期 API を使うのでかなり速い

• Maven2o appengine や slim3 は頻繁にアップデートされるため

pom を編集するだけですぐに jar を差し替えることができるのは便利

o アーキタイプもあるのでプロジェクト作成も楽々

参考文献(スターターキット)

プログラミング Google App Engine

• 2009 年 11月出版ということで若干情報は古いが、 appengineについて広く深く網羅していて詳しい

• Java と Python についてほぼ半々記載されているので Pythonな人にもおすすめ

参考文献(スターターキット)

オープンソース徹底活用 Slim3 on Google App Engine for Java

• Slim3 といいつつも Datastoreのインデックスの説明が中心なのでどの言語であっても有用

• Datastore はインデックスの構造が一番のキモなのでこれを読めばだいたい理解できる

参考文献(実践編)オープンソース徹底活用 Slim3 による Web アプリケーション開発

• FW として Slim3 を使う実用的な 1冊

• Slim3+GWT を用いた実際のアプリ開発を元にしているのでEntity設計が参考になる

• Slim3 でのテスト手法についてあまり言及されてなかったのが難点 (´ ・ ω ・ `)

参考文献(実践編)作ればわかる! Google App Engine for Java プログラミング

• Mashup 系中心で TwitterAPI, Google Maps, OpenID など周辺技術との連携が豊富なのでサンプルが非常に実用的

• appengine の機能に関しても一通り網羅している

• Servlet や JSP の基礎から書いてあるので新卒研修にも最適w

分からないことがあったら

Twitter で #gaeja や #slim3 をつけて質問すれば誰か教えてくれるハズ

おまけ (S3 Tiger)

• S3 Tigero Slim3 用のテスティングユーティリティを作りましたo https://github.com/sue445/s3tiger

Slim3 だとpublic class SomeTest{    @Test    public void ignoreOnlyProduction(){        if(AppEngineUtil.isProduction()){            return;        }        // 本番サーバだけでは動かしたくないテスト    }

    @Test    public void ignoreOnlyDevelopment(){        if(AppEngineUtil.isDevelopment()){            return;        }        // 開発サーバだけでは動かしたくないテスト    }}

S3 Tiger だとimport net.sue445.s3tiger.Slim3;@RunWith(Slim3.class)public class SomeTest{    @IgnoreProduction    @Test    public void ignoreOnlyProduction(){        // 本番サーバだけでは動かしたくないテスト    }

    @IgnoreDevelopment    @Test    public void ignoreOnlyDevelopment(){        // 開発サーバだけでは動かしたくないテスト    }}

クラスにも OK

import net.sue445.s3tiger.Slim3;

// 本番サーバでは動かしたくないテストクラス@RunWith(Slim3.class)@IgnoreProductionpublic class OtherTest{    @Test    public void someTest(){ 〜    }}

アノテーションで DRY を排除

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

top related