Lift on gae_j

2,993 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,993
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
13
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Lift on gae_j

  1. 1. Lift on GAE/J
  2. 2. 自己紹介 <ul><ul><ul><ul><li>竹内歩夢(ぽむ) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Twitter: @pomu0325 </li></ul></ul></ul></ul><ul><ul><li>Scala/Lift 歴 8 ヶ月 </li></ul></ul><ul><ul><li>Lift + GAE/J でガラケー向け foursquare クライアント  「モバイルフォースクエア」公開中 </li></ul></ul><ul><li>http://mb4sq.jp </li></ul>
  3. 3. 1. GAE だと使えない Lift の機能  
  4. 4. Mapper <ul><ul><li>lift-mapper は ORM ライブラリ </li></ul></ul><ul><ul><ul><li>JDBC に依存しているため KVS では使用不可 </li></ul></ul></ul><ul><ul><li>Record っていうライブラリもある </li></ul></ul><ul><ul><ul><li>こっちは JPA とか使えるので GAE でたぶん動く </li></ul></ul></ul><ul><ul><li>GAE では DataStore の Low Level API を使うのが簡単 </li></ul></ul>
  5. 5. Comet <ul><ul><li>HTTP コネクションを保持し、サーバからプッシュで更新を通知 </li></ul></ul><ul><ul><li>GAE の制限 </li></ul></ul><ul><ul><ul><li>1 リクエスト 30 秒まで </li></ul></ul></ul><ul><ul><ul><li>Thread の生成は許可されない </li></ul></ul></ul><ul><ul><li>Lift の Comet ライブラリは Actor を用いて実装されている </li></ul></ul><ul><ul><ul><li>Actor は Thread 使う-> GAE では使えない </li></ul></ul></ul>
  6. 6. 2. spin-up  
  7. 7. spin-up とは? <ul><ul><li>デプロイ後、リクエストが来なければサーバのインスタンスは立ち上がらずに寝ている状態 </li></ul></ul><ul><ul><li>ブラウザからのリクエストが来てから始めてサーバが起動する </li></ul></ul>z  z  z class Boot {    def boot {      ... <ul><ul><li>しばらく( 2-3 分)アクセスがないとまたスリープ状態になる (spin-down) </li></ul></ul>
  8. 8. spin-up 時間比較 <ul><ul><li>Lift の spin-up 時間は 7 秒弱 </li></ul></ul><ul><ul><li>他の jar 追加するとさらに遅い </li></ul></ul><ul><ul><li>他の FW と比較-> </li></ul></ul>出典: (*1) http://d.hatena.ne.jp/yuroyoro/20100321/1269128061    JRuby 系はネット検索での噂情報のため参考値
  9. 9. 対策 <ul><ul><li>使わない jar を除去する </li></ul></ul><ul><ul><ul><li>デフォルトの archetype だと lift-mapper からの依存関係で Lift 関係の jar が追加されてる </li></ul></ul></ul><ul><ul><li>scala-library.jar からも使えない actor を除去 </li></ul></ul><ul><ul><li>spin-down が発生しないよう、アクセス数を増やす </li></ul></ul><artifactId>lift-mapper</artifactId>   ↓ <artifactId>lift-webkit</artifactId> にすると mapper 除去できる
  10. 10. アクセス数が増えると… <ul><ul><li>spin-down はしにくくなるが… </li></ul></ul><ul><ul><li>1 インスタンスでリクエストを捌ききれなくなると… </li></ul></ul><ul><ul><li>スケールアウトして別インスタンスが立ち上がる…(これも spin-up ) </li></ul></ul>やあ! 助けに来たよ! もう無理ぽ… アクセスいっぱい
  11. 11. 3. Function Mapping  
  12. 12. Function Mapping とは? <ul><ul><li>Lift はコールバックで実行されるクロージャをインメモリの LiftSession に保持 </li></ul></ul>Snippet での処理 bind(&quot;e&quot;, in,     &quot;submit&quot; -> SHtml.submit(&quot; 送信 &quot;,       () => {// ごにょごにょ }) ) html の input タグにはランダムでユニークな name が出力される <input type=&quot;submit&quot; name=&quot;F123456789&quot;/> ランダムでユニークなキーで、 Map に Function が保持される   &quot;F123456789&quot; -> () => {// ごにょごにょ } ※ イメージです リクエストパラメータをキーに、 Map から Function がとりだ s
  13. 13. GAE での問題は? <ul><ul><li>リクエストがさっきと同じインスタンスで処理されるとは限らない( sticky session ではない) </li></ul></ul>1 号 2 号 F123456789 で、 &quot; ごにょごにょ &quot; するね。 たまたま別のインスタンスで処理されてしまうと… F123456789 ? なにそれ、知らないよ。
  14. 14. 何が(時々)動かない? <ul><ul><li>SHtml のフォーム要素 /AJAX 系 </li></ul></ul><ul><ul><ul><li>対策:普通に input 要素等をバインドして、 S.param でパラメータを受け取って処理 </li></ul></ul></ul><ul><ul><ul><li>欠点: CSRF 対策 </li></ul></ul></ul><ul><ul><li>S.notice 等でメッセージを設定後、 redirectTo で飛ばした場合 </li></ul></ul><ul><ul><ul><li>いわゆる Redirect-after-Post </li></ul></ul></ul><ul><ul><li>StatefulSnippet </li></ul></ul><ul><ul><ul><li>State が切れてもいいように、 LiftSession ではなく HttpSession に状態を保持するなど </li></ul></ul></ul>
  15. 15. まとめ <ul><ul><li>Lift を GAE で動かすには数々の制限があるのであまり向いていません </li></ul></ul><ul><ul><li>Lift 作者の David さんもおススメしていません </li></ul></ul><ul><ul><ul><li>というか、最悪 (&quot;GAE is the worst of all possible worlds&quot;) とも言ってますw </li></ul></ul></ul><ul><ul><ul><li>Lift 2.0. Scala 2.8, and AppEngine </li></ul></ul></ul><ul><ul><ul><ul><li>http://groups.google.co.jp/group/liftweb/browse_thread/thread/24b36f157f8ea6d2/11660a1e44965d77?#11660a1e44965d77 </li></ul></ul></ul></ul><ul><ul><li>sticky session とか、 Channel API とかが GAE に実装されれば改善するかも… </li></ul></ul><ul><ul><ul><li>  ぜひ Issue 1320 に☆付けてください </li></ul></ul></ul><ul><ul><ul><li>http://code.google.com/p/googleappengine/issues/detail?id=1320 </li></ul></ul></ul>

×