lift on gae_j

15
Lift on GAE/J

Upload: pomu-takeuchi

Post on 08-Jul-2015

2.473 views

Category:

Documents


6 download

TRANSCRIPT

Lift on GAE/J

自己紹介

竹内歩夢(ぽむ) Twitter: @pomu0325

• Scala/Lift 歴 8 ヶ月

• Lift + GAE/J でガラケー向け foursquare クライアント  「モバイルフォースクエア」公開中

http://mb4sq.jp

1. GAE だと使えない Lift の機能

Mapper

• lift-mapper は ORM ライブラリo JDBC に依存しているため KVS では使用不可

• Record っていうライブラリもあるo こっちは JPA とか使えるので GAE でたぶん動く

• GAE では DataStore の Low Level API を使うのが簡単

Comet

• HTTP コネクションを保持し、サーバからプッシュで更新を通知

• GAE の制限o 1 リクエスト 30 秒までo Thread の生成は許可されない

• Lift の Comet ライブラリは Actor を用いて実装されているo Actor は Thread 使う→ GAE では使えない

2. spin-up

spin-up とは?

• デプロイ後、リクエストが来なければサーバのインスタンスは立ち上がらずに寝ている状態

• ブラウザからのリクエストが来てから始めてサーバが起動する

z z zclass Boot { def boot { ...

• しばらく( 2-3 分)アクセスがないとまたスリープ状態になる (spin-down)

spin-up 時間比較

• Lift の spin-up 時間は 7 秒弱

• 他の jar 追加するとさらに遅い

• 他の FW と比較→

出典: (*1) http://d.hatena.ne.jp/yuroyoro/20100321/1269128061 JRuby 系はネット検索での噂情報のため参考値

対策

• 使わない jar を除去するo デフォルトの archetype だと lift-mapper からの依存関係で Lift 関係の jar が追加されてる

• scala-library.jar からも使えない actor を除去

• spin-down が発生しないよう、アクセス数を増やす

<artifactId>lift-mapper</artifactId>  ↓<artifactId>lift-webkit</artifactId>にすると mapper 除去できる

アクセス数が増えると…

• spin-down はしにくくなるが…

• 1 インスタンスでリクエストを捌ききれなくなると…

• スケールアウトして別インスタンスが立ち上がる…(これも spin-up )

やあ!助けに来たよ!

もう無理ぽ…

アクセスいっぱい

3. Function Mapping

Function Mapping とは?

• Lift はコールバックで実行されるクロージャをインメモリのLiftSession に保持

Snippet での処理

bind("e", in, "submit" -> SHtml.submit(" 送信 ", () => {// ごにょごにょ }))html の input タグにはランダムでユ

ニークな name が出力される<input type="submit" name="F123456789"/>

ランダムでユニークなキーで、 Map にFunction が保持される "F123456789" -> () => {// ごにょごにょ }※イメージです

リクエストパラメータをキーに、 Mapから Function がとりだ s

GAE での問題は?

• リクエストがさっきと同じインスタンスで処理されるとは限らない( sticky session ではない)

1 号

2 号

F123456789で、 " ごにょごにょ " するね。

たまたま別のインスタンスで処理されてしまうと…

F123456789 ?なにそれ、知らないよ。

何が(時々)動かない?

• SHtml のフォーム要素 /AJAX 系o 対策:普通に input 要素等をバインドして、 S.param でパラメータを受け取って処理

o 欠点: CSRF 対策

• S.notice 等でメッセージを設定後、 redirectTo で飛ばした場合o いわゆる Redirect-after-Post

• StatefulSnippeto State が切れてもいいように、 LiftSession ではなく

HttpSession に状態を保持するなど

まとめ• Lift を GAE で動かすには数々の制限があるのであまり向いていません

• Lift 作者の David さんもおススメしていませんo というか、最悪 ("GAE is the worst of all possible worlds")とも言ってますw

o Lift 2.0. Scala 2.8, and AppEngine http://groups.google.co.jp/group/liftweb/browse_thread/thread/24b36f157f8ea6d2/11660a1e44965d77?#11660a1e44965d77

• sticky session とか、 Channel API とかが GAE に実装されれば改善するかも…o   ぜひ Issue 1320 に☆付けてくださいo http://code.google.com/p/googleappengine/issues/detail?id=1320