azusaar!でのappengine活用事例 #ajn19

38
AZusaar! でで appengine でででで でででででででででででで sue445

Upload: go-sueyoshi-aka-sue445

Post on 31-May-2015

2.594 views

Category:

Technology


9 download

DESCRIPTION

appengine ja night #19 (http://atnd.org/events/25386 )で使った発表資料です

TRANSCRIPT

Page 1: AZusaar!でのappengine活用事例 #ajn19

AZusaar! での appengine 活用事例チューニングとかいろいろ

sue445

Page 2: AZusaar!でのappengine活用事例 #ajn19

Agenda

• Mashup Awards について• AZusaar! について• やった工夫• FAQ

Page 3: AZusaar!でのappengine活用事例 #ajn19

自己紹介とか• 末吉 剛(すえよし ごう) @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 用のテストユーティリティ

Page 4: AZusaar!でのappengine活用事例 #ajn19

突然ですが質問です!

Page 5: AZusaar!でのappengine活用事例 #ajn19

質問 1:ATND を使ったことがある人

Page 6: AZusaar!でのappengine活用事例 #ajn19

質問 2:Zusaar を使ったことがある人

Page 7: AZusaar!でのappengine活用事例 #ajn19

質問 3: こくちーずを使ったことがある人

Page 8: AZusaar!でのappengine活用事例 #ajn19

質問 4:PARTAKE を使ったことがある人

Page 9: AZusaar!でのappengine活用事例 #ajn19

質問 5:2 つ以上使ったことがある人

Page 10: AZusaar!でのappengine活用事例 #ajn19

イベントをバラバラに探すのは面倒ですよね?

Page 11: AZusaar!でのappengine活用事例 #ajn19

ということで

Page 12: AZusaar!でのappengine活用事例 #ajn19

AZusaar! (http://azusaar.appspot.com/)

Page 13: AZusaar!でのappengine活用事例 #ajn19

Mashup Awards 7 でジオどす賞受賞!

http://www.ustream.tv/recorded/19071855 (1:36:00 付近 )http://mashupawards.tumblr.com/post/15436635038/12-11-ma7-4-3 

Page 14: AZusaar!でのappengine活用事例 #ajn19
Page 15: AZusaar!でのappengine活用事例 #ajn19

アーキテクチャ ( イベント検索 )

Page 16: AZusaar!でのappengine活用事例 #ajn19

アーキテクチャ ( ホテル検索 )

Page 17: AZusaar!でのappengine活用事例 #ajn19

やったこと

1. Ajax で作る2. Frontend cache control3. Memcache で quota を抑える4. Datastore で半静的コンテンツ化5. appengine で全文検索6. Production 環境から Urlfetch できなかった件について7. 別 app-id でステージング

Page 18: AZusaar!でのappengine活用事例 #ajn19

工夫 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 

Page 19: AZusaar!でのappengine活用事例 #ajn19

工夫 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 

Page 20: AZusaar!でのappengine活用事例 #ajn19

• jQuery だと勝手に乱数がつくため注意が必要• $.ajax({cache: true, dataType: "json"})

o cache:true でパスの末尾に乱数がつかないようになるo jsonp だとコールバック関数の関係でパスが同一にならな

工夫 2. Frontend cache control

Page 21: AZusaar!でのappengine活用事例 #ajn19

工夫 3. Memcache で quota を抑える

• [Zusaar]Urlfetch のアクセスを減らすためレスポンスをMemcache でキャッシュ

• Memcache にはキーワードで絞り込む前のデータを保持し、絞り込みは取得後に実施

Page 22: AZusaar!でのappengine活用事例 #ajn19

工夫 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 

Page 23: AZusaar!でのappengine活用事例 #ajn19

工夫 4. Datastore で半静的コンテンツ化• 生成コストの高いコンテンツは生成済のものをあらかじめ

Datastore に入れておくo 生成時間とか Datastore read ops とかo トップの注目のキーワードは 1 日 1 回集計して json にし

たものを Datastore に保存• Frontend cache control と Memcache も併用してるため

Datastore read ops は微々たるもの

Page 24: AZusaar!でのappengine活用事例 #ajn19

工夫 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 に関しても同様の検索方式を採用

Page 25: AZusaar!でのappengine活用事例 #ajn19

工夫 6. Production 環境から Urlfetch できなかった件について• 去年 9~ 10 月くらい

o 特定の API に対して Production 環境から Urlfetch すると常にタイムアウトになる(ローカルや Production のktrwjr からなら OK )

o とある googler さんに聞いても分からなかったため、しょうがないから proxy 用のアプリを Heroku で立てた

Page 26: AZusaar!でのappengine活用事例 #ajn19

工夫 6. Production 環境から Urlfetch できなかった件について• 先々週oLT 用にサンプルコード作ってた

ら Production 環境から Urlfetch叩けた(  ´∀`)

Page 27: AZusaar!でのappengine活用事例 #ajn19

工夫 7. 別 app-id でステージング

• 本番 app-id の Production 環境上で ktrwjr する場合の問題点o テストケース内で Datastore#put すると既存データを上書きしてしまうと tearDown でロールバックする時にdelete されてしまう

o Production でだけテストを無効化すればいいが、面倒だし人がやることなので 100% ではない

o 場合によっては quota を一気に使い切るw• しかしステージングにデプロイする度に app-id を書きなお

すのは面倒o 毎回手作業でやると間違える可能性もあるo そこで画期的な方法を考えた!

Page 28: AZusaar!でのappengine活用事例 #ajn19

工夫 7. 別 app-id でステージング

• git で staging 用の branch を作れば簡単に切り替えられるo master で変更が入った時も branch を rebase するだけで

OK

Page 29: AZusaar!でのappengine活用事例 #ajn19

工夫 7. 別 app-id でステージング

master で普通にコミット

Page 30: AZusaar!でのappengine活用事例 #ajn19

工夫 7. 別 app-id でステージング

ステージング用に branch を作成

Page 31: AZusaar!でのappengine活用事例 #ajn19

工夫 7. 別 app-id でステージング

更に master でコミット

Page 32: AZusaar!でのappengine活用事例 #ajn19

工夫 7. 別 app-id でステージング

rebase して枝を付け替えるだけでステージングも更新される

Page 33: AZusaar!でのappengine活用事例 #ajn19

FAQ

• Q. 開発体制についてkwsko 基本は全部自分 1 人。ロゴとデザイン調整にそれぞれ 1

人ずつ• Q. 開発期間は?

o A. がっつり開発してたのは半月くらい(去年の盆前には完成してたはず)

o 完成後、実際に応募するまで 3 ヶ月くらいあったのでデザインを待ちつつ、思いつきベースで機能追加

Page 34: AZusaar!でのappengine活用事例 #ajn19

FAQ• ランニングコストは?

o A. appengine の minimum 分の $2.1/week のみ Billing on していないと FrontEnd Cache control が使え

ないため

Page 35: AZusaar!でのappengine活用事例 #ajn19

FAQ

• Q. このキャラってオリジナル?o A. 「けいおん」でググッてくださいwo サービス名( ATND+Zusaar=AZusaar )と、このキャラ

の名前(あずさ)をかけています

Page 36: AZusaar!でのappengine活用事例 #ajn19

Special Thanks!

• appengine チーム• appengine ja night コミュニティ• Slim3 コミッタの皆さん• Zusaar の @knj77 さん• Frontend cache control を紹介してくれた @bluerabbit777jp

さん

のおかげで AZusaar! は出来ました!

Page 37: AZusaar!でのappengine活用事例 #ajn19

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

Page 38: AZusaar!でのappengine活用事例 #ajn19

質問することを強いられているんだ!