スマホアプリ開発者のための  
Web  API開発⼊入⾨門の⼊入⾨門
Agenda
⾃自⼰己紹介など  
Web  APIとは  
なぜWeb  APIが必要か  
Web  API開発の基本  
パフォーマンス
Talknoteとは?
社内コミュニケーションサービス
Talknoteとは?
「共通の価値観が浸透した「いい会社」をつくる。」

ことをミッションに、サービス運営をしています。
⾃自⼰己紹介
ミウラ  @mxxxxkxxxx  
雑⾷食型情報処理理技術者  
2014/02にTalknoteへJoin  
前職:グリーにて内製プロダクトの企画・開発  
最近の趣味:何でもかんでもAWSのマネージドサービスにのっ
けて勝⼿手にスケールしてくれたらいいなと妄想をすること
Web  APIとは
Web  API  =    インターネット経由で利利⽤用できるAPI  
API(Application  Programming  Interface)  
ソフトウェアコンポーネントが互いにやりと
りするのに使⽤用するインタフェースの仕様  
例例えばsocket  
listen(),  accept(),  recv(),  send(),  etc.
Web  APIとは
Web  APIにはSOAPやRESTなどがあ
る  
今回はREST  APIのお話  
Web  APIとは
iPhoneアプリ
MV
C
サーバ
C
V M DBユーザ
サーバアプリ
なぜWeb  APIが必要か
データの妥当性  
コミュニケーションの正当性  
マルチデバイス対応
なぜWeb  APIが必要か
データの妥当性
iPhone  
アプリ
サーバ
ユーザ
商品  
購⼊入
トランザクション
購⼊入履履歴  
データ作成
https://hoge.io/purchase
POST
いずれかで失敗したら  
ロールバック
成功  or  失敗
購⼊入履履歴  
データ作成
購⼊入履履歴  
データ作成
サーバ
なぜWeb  APIが必要か
コミュニケーションの正当性
ユーザ
ゲーム  
アプリ
ユーザ
ユーザ
ランキング  
データ
妥当なデータが担保する  
コミュニケーションの  
正当性
https://hoge.io/ranking
ゲーム  
アプリ
ゲーム  
アプリ
なぜWeb  APIが必要か
マルチデバイス対応
サーバ
ユーザ
iPhone  
アプリ
ユーザ
Android  
アプリ
ユーザ
PC  
Web
新  
ロジック
ビジネスロジックに変更更が
あってもWeb  APIは影響を受
けず、クライアントアプリケー
ションを改修する必要がない。
旧  
ロジック
Web  
API
Web  API開発の基本
URL  
ドメインモデル
Web  API開発の基本
REST  API  -‐‑‒  HTTPメソッドでCRUD操作  
POST  -‐‑‒  Create  
例例)POST  /article  …  記事を作成する  
GET  -‐‑‒  Read  
例例)GET  /article/1  …  ID=1の記事を参照
する
URL
Web  API開発の基本
REST  API  -‐‑‒  HTTPメソッドでCRUD操作  
PUT  -‐‑‒  Update  
例例)PUT  /article/1  …  ID=1の記事を更更新する  
DELETE  -‐‑‒  Delete  
例例)DELETE  /article/1  …  ID=1の記事を削除
する
URL
Web  API開発の基本
URL
iPhone  
アプリ
サーバアプリ
ユーザ
記事作成 Controller
/article[/1]
POST
GET
PUT
DELETE
成功
記事
成功
成功
View
JSON
記事参照
記事更更新
記事削除
Model
Article
RDBMS
articles
Web  API開発の基本
URL
iPhone  
アプリ
サーバアプリ
ユーザ
記事作成 Controller
/article
①POST
⑥成功  
id=1
View
JSON
Model
Article
RDBMS
articles
②Article  
作成
  ③articlesテーブル  
レコード作成
④作成したレ
コードのid取得
⑤レンダリング
Web  API開発の基本
URL
iPhone  
アプリ
サーバアプリ
ユーザ
Controller
/article/1
①GET  
id=1
⑤記事  
id=1 View
JSON
記事参照
Model
Article
RDBMS
articles
②Article  
取得
③articlesテーブル  
レコード取得
④レンダリング
Web  API開発の基本
最近APIバージョニングが話題  
https://api.talknote.com/hoge  
https://api.talknote.com/1/hoge  
参考:APIのバージョニングは限局分岐でや
るのが良良い  -‐‑‒  http://kenn.hatenablog.com/
entry/2014/03/06/105249
URL
Web  API開発の基本
トランザクションスクリプトとは?  
アクションより起動される⼀一連の⼿手続き  
引⽤用元:ひがやすを  blog  -‐‑‒  http://
d.hatena.ne.jp/higayasuo/20080519/
1211183826  
要はいわゆる「⼿手続き型」なプログラム  
次で述べるドメインモデルの対義語(みたいな感じ)
ドメインモデル
Web  API開発の基本
ドメインモデルとは?  
オブジェクト指向と親和性の⾼高い概念念  
ドメイン内の名詞によって体系化されたモデル  
引⽤用元:ひがやすを  blog  -‐‑‒  http://
d.hatena.ne.jp/higayasuo/20080519/
1211183826
ドメインモデル
Web  API開発の基本
ドメイン内の名詞って?  
ECを⼀一つのドメインとして例例えると…
ドメインモデル
EC
ユーザ
認証
商品
購⼊入
Web  API開発の基本
Web  APIはドメインモデルで設計しよう  
ドメインモデルのメリット  
DRY  
疎結合  
ってことは変更更に強い。
ドメインモデル
Web  API開発の基本
Web  APIはドメインモデルで設計しよう  
ドメインモデルのデメリット  
トランザクションスクリプトより設計が難
しい  
ドメインモデル貧⾎血症に陥る可能性
ドメインモデル
パフォーマンス
• 基本はIO  
• 病は気から  
• 性能劣劣化はIOから  
• クソシステムはデータ設計から
パフォーマンス
ということでRDBMSでパフォーマン
ス稼ぐお話をちょこっと  
Web  APIというよりサーバのお話
ですが…  
MySQL前提
パフォーマンス
アプリが発⾏行行するクエリはとにかくexplainしよう  
ActiveRecordやその他ORM経由でもデバッグロ
グ等にSQLを吐かせるように  
漢のコンピュータ道でexplainの⾒見見⽅方を詳解して
います。  
http://nippondanji.blogspot.jp/2009/03/
mysqlexplain.html
パフォーマンス
アプリが発⾏行行するクエリはとにかくexplainしよう  
index効いていないクエリがないように  
サービスが成⻑⾧長してくると、index効いてい
ないクエリのせいでDBサーバのCPUが100%
に張りつきはじめます。  
indexが効いていてもフルスキャンしている
ようじゃダメ
パフォーマンス
パフォーマンス
パフォーマンス
パフォーマンス
すでにサービス上で動いているクエリの
性能が⼗十分に稼げていない場合  
張れるのであればindex張る  
⾼高トラフィックでindex張った瞬間にア
ラートが⾶飛びそうで怖いのであれば…  
ヒントを駆使してみる
パフォーマンス
ヒントの例例  
MySQLの結合は原則ネスティッドループ結合  
結合順序によっては効いてほしいindexが効かなかったり等の
原因により、⾛走査するレコード数が⾮非常に多くなる。  
結合順序はオプティマイザが決定する。  
開発者が結合順序を制御したい場合、STRAIGHT_̲JOIN
で制御可能。  
合わせてindexを制御するUSE|IGNORE|FORCE  INDEX構⽂文
も有効な場合がある  
他にもいろいろ
パフォーマンス
クエリの発⾏行行数が無駄に多くて性能劣劣化を招く
ケースもあります。  
N+1問題  
①userテーブルから10レコード取得する  
②user.idをキーとしてuser_̲profileテーブル
からレコードを逐次取得する  
①=1回,  ②=10回クエリを発⾏行行することに
なる
パフォーマンス
クエリの発⾏行行数が無駄に多くて性能劣劣化を招くケースもあり
ます。  
N+1問題  
ActiveRecordでLazy  Loadingする場合などに発⽣生  
防⽌止策  
結合して1クエリで取得する  
select  *  from  user  u  inner  join  user_̲profile  
up  on  u.id  =  up.user_̲id  
Eager  Loading
パフォーマンス
⾼高トラフィックになってくると…  
drop  tableしただけでサービスに影響で
たり  
ハードリンク張らずにdrop  tableする
とファイルシステム的にすぐデータを
消そうとするためにIOが発⽣生し、終わ
るまでメタデータをロックしてしまう
パフォーマンス
そういうときはハードリンク絡めて
drop  tableしてみよう
1テーブル1ibd/frm前提
パフォーマンス
MySQL ファイルシステム
データ
/var/mysql/data/messages.ibdmessages
①ibd/frmにハードリンク張る  
$  ln  /var/mysql/data/messages.ibd  /home/admin/messages.ibd
パフォーマンス
MySQL ファイルシステム
データ
/var/mysql/data/messages.ibd
/home/admin/messages.ibd
messages
②drop  table  
mysql>  drop  table  messages;
パフォーマンス
MySQL ファイルシステム
データ
/var/mysql/data/messages.ibd
/home/admin/messages.ibd
messages
drop  table  
messages;
ハードリンクが残っているので  
まだ物理理削除されない
③作成しておいたハードリンクを穏やかに削除  
$  ionice  -‐‑‒c  3  rm  -‐‑‒f  /home/admin/messages.ibd
パフォーマンス
MySQL ファイルシステム
データ
/home/admin/messages.ibd
④完了了  
パフォーマンス
MySQL ファイルシステム
ご清聴ありがとうございました

スマホアプリ開発者のためのWeb api開発入門の入門