azusaar!でのappengine活用事例 #ajn19
DESCRIPTION
appengine ja night #19 (http://atnd.org/events/25386 )で使った発表資料ですTRANSCRIPT
AZusaar! での appengine 活用事例チューニングとかいろいろ
sue445
Agenda
• Mashup Awards について• AZusaar! について• やった工夫• FAQ
自己紹介とか• 末吉 剛(すえよし ごう) @sue445
o Goって名前ですが Go言語は全然分かりませんw• レッドフォックス株式会社所属
o SI で web アプリ中心に 1 人 TDD をやっています• appengine 歴は 2 年くらい
o (一応) Slim3 コミッタo Twitter ボットとかゲームのスコア登録サイトとかいろい
ろ作ってますo https://twitter.com/#!/sue445/mybot o jubeat++ : http://jubeatplusplus.appspot.com/ o s3tiger: https://github.com/sue445/s3tiger
Slim3 用のテストユーティリティ
突然ですが質問です!
質問 1:ATND を使ったことがある人
質問 2:Zusaar を使ったことがある人
質問 3: こくちーずを使ったことがある人
質問 4:PARTAKE を使ったことがある人
質問 5:2 つ以上使ったことがある人
イベントをバラバラに探すのは面倒ですよね?
ということで
AZusaar! (http://azusaar.appspot.com/)
Mashup Awards 7 でジオどす賞受賞!
http://www.ustream.tv/recorded/19071855 (1:36:00 付近 )http://mashupawards.tumblr.com/post/15436635038/12-11-ma7-4-3
アーキテクチャ ( イベント検索 )
アーキテクチャ ( ホテル検索 )
やったこと
1. Ajax で作る2. Frontend cache control3. Memcache で quota を抑える4. Datastore で半静的コンテンツ化5. appengine で全文検索6. Production 環境から Urlfetch できなかった件について7. 別 app-id でステージング
工夫 1. Ajax で作る• サーバサイドではスレッドを生成できないが Ajax でアクセ
スすれば実質的にマルチスレッドで動かせる• サーバサイドは最低限の JSON だけ返すようにすることで
処理も速くなるし、 1 つのインスタンスで多くの処理を捌けるo AZusaar! では 2 インスタンス以上立ったことない
• 静的ファイルは Frontend Server で処理されるので spin upの影響を受けない
• Java/Python/Go のどれを使おうが最終的には JavaScript に行き着く
• 詳しくはひがさんのブログ参照o AppEngine/J の spin-up を劇的に改善する方法o http://d.hatena.ne.jp/higayasuo/20101109/1289290143
工夫 2. Frontend cache control
• Frontend cache control を使うことで動的コンテンツを自由に Frontend Server でキャッシュさせることができる(要 Billing on )
• 詳しくは @bluerabbit777jp さんの資料参照o http://www.slideshare.net/bluerabbit777jp/appengine-ja-ni
ght-16-bt-frontend-cache-control
• jQuery だと勝手に乱数がつくため注意が必要• $.ajax({cache: true, dataType: "json"})
o cache:true でパスの末尾に乱数がつかないようになるo jsonp だとコールバック関数の関係でパスが同一にならな
い
工夫 2. Frontend cache control
工夫 3. Memcache で quota を抑える
• [Zusaar]Urlfetch のアクセスを減らすためレスポンスをMemcache でキャッシュ
• Memcache にはキーワードで絞り込む前のデータを保持し、絞り込みは取得後に実施
工夫 3. Memcache で quota を抑える
• [ こくちーず ][PARTAKE] Memcache に 1 ヶ月分の全件数を乗せ、アプリで絞り込んでいる
• イベント 1600 件で 1.3MB になって Memcache に乗り切らないため gzip かけて put ( 1.3MB→286KB, 圧縮は 100ms前後)o http://blog.sue445.net/archives/2011/11/30-2300.html
工夫 4. Datastore で半静的コンテンツ化• 生成コストの高いコンテンツは生成済のものをあらかじめ
Datastore に入れておくo 生成時間とか Datastore read ops とかo トップの注目のキーワードは 1 日 1 回集計して json にし
たものを Datastore に保存• Frontend cache control と Memcache も併用してるため
Datastore read ops は微々たるもの
工夫 5. appengine で全文検索• Zusaar の検索方式は N-gram ではなく形態素
o appengine の仕様上 Datastore への全文検索はできないo Full Text Search マダー (AA 略o 形態素だと不便なので N-gram 検索できる API を
AZusaar! で実装• 用途を限定すればなんとかなる
o AZusaar! ではキーワード , 年月 , 年月日だけに特化• イベント名、概要、場所などを全部連結させて
String#contains してるイメージ o 実際には英数字を半角小文字統一したりタグを削ったり
前処理実施o Datastore でイベント情報を保持しているこくちーずと
PARTAKE に関しても同様の検索方式を採用
工夫 6. Production 環境から Urlfetch できなかった件について• 去年 9~ 10 月くらい
o 特定の API に対して Production 環境から Urlfetch すると常にタイムアウトになる(ローカルや Production のktrwjr からなら OK )
o とある googler さんに聞いても分からなかったため、しょうがないから proxy 用のアプリを Heroku で立てた
工夫 6. Production 環境から Urlfetch できなかった件について• 先々週oLT 用にサンプルコード作ってた
ら Production 環境から Urlfetch叩けた( ´∀`)
工夫 7. 別 app-id でステージング
• 本番 app-id の Production 環境上で ktrwjr する場合の問題点o テストケース内で Datastore#put すると既存データを上書きしてしまうと tearDown でロールバックする時にdelete されてしまう
o Production でだけテストを無効化すればいいが、面倒だし人がやることなので 100% ではない
o 場合によっては quota を一気に使い切るw• しかしステージングにデプロイする度に app-id を書きなお
すのは面倒o 毎回手作業でやると間違える可能性もあるo そこで画期的な方法を考えた!
工夫 7. 別 app-id でステージング
• git で staging 用の branch を作れば簡単に切り替えられるo master で変更が入った時も branch を rebase するだけで
OK
工夫 7. 別 app-id でステージング
master で普通にコミット
工夫 7. 別 app-id でステージング
ステージング用に branch を作成
工夫 7. 別 app-id でステージング
更に master でコミット
工夫 7. 別 app-id でステージング
rebase して枝を付け替えるだけでステージングも更新される
FAQ
• Q. 開発体制についてkwsko 基本は全部自分 1 人。ロゴとデザイン調整にそれぞれ 1
人ずつ• Q. 開発期間は?
o A. がっつり開発してたのは半月くらい(去年の盆前には完成してたはず)
o 完成後、実際に応募するまで 3 ヶ月くらいあったのでデザインを待ちつつ、思いつきベースで機能追加
FAQ• ランニングコストは?
o A. appengine の minimum 分の $2.1/week のみ Billing on していないと FrontEnd Cache control が使え
ないため
FAQ
• Q. このキャラってオリジナル?o A. 「けいおん」でググッてくださいwo サービス名( ATND+Zusaar=AZusaar )と、このキャラ
の名前(あずさ)をかけています
Special Thanks!
• appengine チーム• appengine ja night コミュニティ• Slim3 コミッタの皆さん• Zusaar の @knj77 さん• Frontend cache control を紹介してくれた @bluerabbit777jp
さん
のおかげで AZusaar! は出来ました!
ご清聴ありがとうございました!
質問することを強いられているんだ!