web api のすすめ
DESCRIPTION
TRANSCRIPT
![Page 1: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/1.jpg)
Web API のすすめ~巨人にさらなる力を~
2010/10/16 YAPC::Asia 2010@xaicron
![Page 2: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/2.jpg)
自己紹介
名前Yuji Shimada嶋田裕二
仕事DeNA
CPANXAICRON
twitter@xaicron
blog http://blog.livedoor.jp/xaicron/
![Page 3: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/3.jpg)
謝罪
![Page 4: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/4.jpg)
サブタイトルはただのあおり文句です
![Page 5: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/5.jpg)
今日は Web API の話をします
![Page 6: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/6.jpg)
が、コードとかはほとんど出てきません
![Page 7: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/7.jpg)
15時から講堂でやるやつはコードいっぱい出てきますので
見に来てね!!
![Page 8: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/8.jpg)
一口に Web API と言ってもいろいろありますね
![Page 9: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/9.jpg)
public に使えるものGoogle Map とか
認証が必要なものtwitter
内部的に使ってるものGmail
![Page 10: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/10.jpg)
それぞれの特徴
![Page 11: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/11.jpg)
public なもの
ユーザー登録とかなしで、http(s) 経由で直接使えるどれくらいのアクセスがくるのか予想をつけ辛い
![Page 12: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/12.jpg)
認証が必要なもの
ユーザー登録が必要AccessToken とかがもらえて、それを使ってアクセスユーザー数からアクセスがある程度わかる
不正なユーザーとか BAN できる
![Page 13: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/13.jpg)
内部的に使ってるもの
自分のところのページを非同期にするために同一ドメイン内とかで Ajax 通信ユーザーは自分ではつかわないアクセス数は、ユーザー数でわかる
![Page 14: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/14.jpg)
いろいろなものがある
![Page 15: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/15.jpg)
全体に共通して言えること
![Page 16: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/16.jpg)
速さが重要
![Page 17: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/17.jpg)
Web API は速くないと全く使う気が起きない
![Page 18: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/18.jpg)
内部 API の場合は非同期でページを表示してるだけだから、そんなに速くなくてもよくね?
![Page 19: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/19.jpg)
ページの描画が 10% 遅くなるだけでアクセス数が(ry
![Page 20: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/20.jpg)
というのは置いておいても
![Page 21: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/21.jpg)
速いに越したことはないよね!
![Page 22: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/22.jpg)
正直、Web API はもう流行ってないんじゃないか疑惑
![Page 23: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/23.jpg)
参考:http://yusukebe.com/archives/10/10/04/210341.html
![Page 24: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/24.jpg)
引用:“実際に「使える」Web APIは限られていることからマッシュ
アップはツンダ”
![Page 25: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/25.jpg)
その API が流行るかどうかは誰にもわからない
![Page 26: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/26.jpg)
もしかしたら何かで流行るかもしれないし
![Page 27: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/27.jpg)
とりあえず作ってみようぜ!
![Page 28: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/28.jpg)
高速な Web API の実現方法
![Page 29: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/29.jpg)
既存の WAF を使わない
![Page 30: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/30.jpg)
前夜祭で @tokuhirom が言っていたこと
![Page 31: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/31.jpg)
徳永 「WAF は全部コードが読めるものじゃないと使えない」
![Page 32: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/32.jpg)
Agree
![Page 33: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/33.jpg)
自分がわかっていないものを使って、
問題が起こったときにn
![Page 34: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/34.jpg)
速いものを作るには、特化したものを作るしかない
![Page 35: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/35.jpg)
PSGI のおかげで
![Page 36: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/36.jpg)
ここ一年で Web アプリを取り巻く環境は劇的に変わった
![Page 37: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/37.jpg)
いまはツールが充実している
![Page 38: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/38.jpg)
ore-ore WAF を作るのは難しくない
![Page 39: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/39.jpg)
既存の WAF だと機能過多な場合がほとんど
![Page 40: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/40.jpg)
Web API では用件がシンプルなので
![Page 41: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/41.jpg)
Controller をがんばる必要がない
![Page 42: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/42.jpg)
1 : 1
![Page 43: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/43.jpg)
でマッピングできる
![Page 44: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/44.jpg)
detach とか forward みたいな機能すら不要
![Page 45: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/45.jpg)
Web API に限ったことではないけど
![Page 46: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/46.jpg)
Web App を作る上では、Controller と Model は完全に分離
すべき
![Page 47: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/47.jpg)
結局はちょっと高機能な dispatcher としてしか使っていない
![Page 48: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/48.jpg)
なら無駄な機能を削ぎ落としたやつを自分で書いた方がいい
![Page 49: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/49.jpg)
さらに、Web API では View らしい View はない
![Page 50: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/50.jpg)
ほとんどすべての場合で、JSON を返せばみんな幸せ
![Page 51: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/51.jpg)
一時期、XMLとか、なぜかYAMLとかを返すものもありました
![Page 52: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/52.jpg)
誰もうれしくない
![Page 53: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/53.jpg)
みんなで幸せになりましょう
![Page 54: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/54.jpg)
ここまでのまとめ
![Page 55: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/55.jpg)
PlackRouter::SimpleJSON
![Page 56: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/56.jpg)
あたりを使って、イカしたore-ore WAF を書きましょう
![Page 57: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/57.jpg)
ちょっとしたものなら本当にすぐ書けるよ
![Page 58: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/58.jpg)
第一部 〜完〜
![Page 59: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/59.jpg)
第二部 〜実践編〜
![Page 60: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/60.jpg)
よし、たぶん高速な dispatcher は書けるはずだお!
![Page 61: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/61.jpg)
とはいえ、dispatch にかかる時間は通常は全体の処理の
数%程度!
![Page 62: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/62.jpg)
本当に必要なのは Model のチューニングですね
![Page 63: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/63.jpg)
通常、ちゃんとチューニングされた Perl コードであれば
![Page 64: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/64.jpg)
多くのボトルネックは DB 接続のようなものになる
![Page 65: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/65.jpg)
残念ながらそうならないケースもちらほら
![Page 66: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/66.jpg)
どんな場合にも言えることだけど、最も効果の出やすいチューニング
は
![Page 67: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/67.jpg)
method 呼び出しを減らすこと
![Page 68: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/68.jpg)
ただし、過剰に減らして可読性が下がってもしょうがない
![Page 69: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/69.jpg)
Devel::NTYProf を使ってちゃんとボトルネックを見つける
![Page 70: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/70.jpg)
次に、オブジェクトの生成を減らす
![Page 71: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/71.jpg)
例えば、ORM を使っていて、それがかなりのオブジェクトを生成しているのであれば、使用をやめる
![Page 72: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/72.jpg)
ただし、生の DBI をそのまま使うのはやはり面倒
![Page 73: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/73.jpg)
最近は
![Page 74: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/74.jpg)
DBIx::Connector ->(DBIx::DBHREsolver ->)
DBI
![Page 75: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/75.jpg)
みたいにラップして使うのがいい気がしている
![Page 76: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/76.jpg)
もちろん、ORM でも十分に速度を出すことも可能なので
![Page 77: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/77.jpg)
その辺りはよしなに使い分ければいいと思います
![Page 78: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/78.jpg)
必ず使うクラスがあり、それを毎回 new しているような場合
![Page 79: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/79.jpg)
Object::Container のようなものに入れて singleton にしておくのがい
い
![Page 80: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/80.jpg)
最近の Object::Container は preload オプションとかついたので
![Page 81: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/81.jpg)
さらに使いやすくなっているはず!
![Page 82: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/82.jpg)
run する前に 読み込んでおけば、CoW が効くのでメモリーも抑えら
れて一石二鳥
![Page 83: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/83.jpg)
ここまでのまとめ
![Page 84: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/84.jpg)
PlackRouter::SimpleJSONObject::ContainerDBIx::Connctor (DBIx::Skinny)
![Page 85: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/85.jpg)
当然、ここの部分は API の用件によってかなりぶれがあり、一概にこ
れがいいとはいません
![Page 86: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/86.jpg)
が、一般的に、今言ったことを守っておけば、コード事態がボトルネックになる確立はだいぶ減ると思い
ます
![Page 87: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/87.jpg)
というわけで
![Page 88: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/88.jpg)
第二部 〜未完〜
![Page 89: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/89.jpg)
第三部 〜運用編〜
![Page 90: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/90.jpg)
多分、次で @fujiwara さんが超絶詳しく説明してくれます
![Page 91: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/91.jpg)
第三部 〜期待〜
![Page 92: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/92.jpg)
だけではさすがにあれなので
![Page 93: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/93.jpg)
まぁ基本的なことですが
![Page 94: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/94.jpg)
まぁ基本的なことですが
![Page 95: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/95.jpg)
当然、必要な場所でログはとりましょう
![Page 96: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/96.jpg)
Log::Dispatch がデファクトなので素直に使っておくのがいいです
![Page 97: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/97.jpg)
Syslog n
![Page 98: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/98.jpg)
ここまでのまとめ
![Page 99: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/99.jpg)
PlackRouter::SimpleJSONObject::ContainerDBIx::Connecter (DBIx::Skinny)Log::Dispatch
![Page 100: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/100.jpg)
あたりを使って薄いものをつくればいいですね!
![Page 101: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/101.jpg)
それ Amon2 で出来るよ!
![Page 102: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/102.jpg)
って感じですが、あれは普通に参考になるので一度はソースを読ん
だ方がいいです
![Page 103: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/103.jpg)
まとめ
![Page 104: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/104.jpg)
今の時代、ore-ore WAF を書くのは
別に怖くない
![Page 105: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/105.jpg)
もちろん、なれてないうちは、イケてないものが出来ちゃうかもしれ
ないけど、
![Page 106: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/106.jpg)
新しいものを常に追求した方が楽しいでしょ!!
![Page 107: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/107.jpg)
:-)
![Page 108: Web API のすすめ](https://reader034.vdocuments.site/reader034/viewer/2022052208/548debf1b4795982638b480a/html5/thumbnails/108.jpg)
ご清聴ありがとうございました