Upgrade to Pro — share decks privately, control downloads, hide ads and more …

YAPC::Hokkaido

papix
December 10, 2016

 YAPC::Hokkaido

papix

December 10, 2016
Tweet

More Decks by papix

Other Decks in Programming

Transcript

  1. papix
 Perl/Go/Infra Engineer
 @ _ _ p a p i

    x_ _ https://twitter.com/__papix__ papix https://github.com/papix Masteries (TECH) http://papix.hatenablog.com/ adish •  Engineer Perl Entrance (Headmaster)
 Mackerel User Group (Founder) 346 Production (Producer / 渋⾕凛担当) 絶対笑顔でまだまだ いっぱい夢みるブログ (LIFE) http://papix.hatenablog.jp/
  2. もくじ •  はじめに •  あらすじ 〜 今回の題材 •  そもそもAPIって? • 

    PerlでAPIを作ろう! •  APIの仕様を定める •  APIをドキュメント化する •  さいごに
  3. あらすじ •  Gaiax/adishの場合, 中⼩規模のサービスが多い •  Ruby, PHP, Perlを使ったMonolithic App • 

    Perlであれば, Amon2で… Xslateで描画… •  そこまでしっかりAPIを作る機会はなかった •  そんな⼈達がMicroservice… のようなもの… に⼿を出したら? •  その体験や失敗談をお話します •  是⾮他⼭の⽯に…
  4. 題材: hitobo •  adishの新サービス •  adishの強み(⼈⼒運⽤)とBotの連携によるCS •  問い合わせの最初はBotが対応 •  必要に応じて,

    ⼈間に切り替わる •  Botの導⼊によって, 次のような効果を狙う •  対応までの速度の向上 •  CSを提供するコストの低減
  5. hitobo開発チーム •  9⼈チーム •  プロダクトオーナー 兼 営業 x1 •  営業

    x1 •  運⽤担当 x3 (CS対応) •  エンジニア x3 •  スクラムマスター x1
  6. こうして… •  各Componentが連携する必要がある •  APIを使って連携!!! •  結果として… •  名状し難いMicroserviceのようなものが… • 

    とはいえ, そもそも, APIの実装や連携は難しい •  Monolithicに作れるならその⽅が良かった!!!!!
  7. 「そうだ! APIではなくDBを介して連携しよう!」 •  やめろ!!! ⾟いぞ!!!!!!!! •  RDBMSのSchemaのMigrationが⾮常に難しい •  Component A/Bともに新しいSchemeに対応

    しなければならない •  → 同時にデプロイする必要がある •  → Component分ける意味がないじゃん •  MonolithicなApplicationで良い!!!!!
  8. 外部向けAPIと内部向けAPI •  「内部向けAPI」を作る機会は増えてきている •  Single Page Application, スマホアプリ… •  MicroserviceによるComponent連携

    •  Monolithicに作れるならその⽅が良いが… •  うまくAPIでComponentを分割することで, 実装をシンプルに出来る場合もある
  9. 例: はてなブックマーク •  ScalaのAPI ServerとPerlのView Server •  後段のAPI Serverでデータを扱う • 

    Scalaの特徴を活かして堅牢に •  前段のView ServerでHTMLの描画 •  ユーザー向けのViewを提供 •  双⽅の良さを活かした開発ができそう!
  10. APIを作る難しさ •  APIの更新は難しい •  「外部向けAPI」は, 利⽤者に変更へ追随して もらう必要がある •  当然, 変更を強いれないのでVersioning

    しなければならない •  「内部向けAPI」も同様... •  内部の開発者が使うので変更への対応は し易いとはいえ, コストは必要
  11. APIの仕様を決める時に役⽴つもの •  既存のAPIとその仕様 •  「Web API: The Good Parts」にも書かれてる • 

    以前外部APIを設計したときは, GitHubや QiitaのAPI仕様を参考にしたり… •  とはいえ, APIごとの特徴, 癖もある •  完全にコピーせず, 開発しているServiceに 適したものを組み上げていくのが⼤事
  12. WAFやORMは? •  ぶっちゃけ何でも… •  WAFなら, Amon2, Mojolicious, Catalyst… •  ORMなら,

    Teng, Aniki, DBI… •  個⼈的には, Amon2 + Anikiをよく使います •  どちらもHackしやすくて楽しい!!!
  13. ①APIを定義する仕組みを使う •  いろいろ提供されている •  Swagger •  JSON Schema •  APISchema

    •  Swagger/JSON Schemaはよく知られている •  ググればQiitaとかで無限にサンプルがある •  ので, 今回はAPISchemaを紹介します!
  14. APISchema •  hitode909さん製 •  PerlのDSLでAPIの仕様を定義 •  次の機能を提供 •  Routerの⾃動⽣成 • 

    Request/Responseに対するValidation •  Schemeから仕様のMarkdown⽣成 •  PlackのMiddlewareとして提供
  15. メリデメ •  メリット •  ちゃんと仕様が定められている •  エコシステムが整っている •  デメリット • 

    初期の学習コストが若⼲⾼い •  …が, 最終的にしっかりやっていく必要が あるので, 最初から頑張っておいて良さそう!
  16. メリデメ •  メリット •  テストを書けばドキュメントが出来る •  デメリット •  逆に⾔えば実装を先にしなければならない • 

    実装前に仕様案をドキュメント化して, 共有 したり相談するのは難しい •  「テストファースト」でテストを先に作り, 共有するという⼿はあるが…
  17. メリデメ •  メリット •  導⼊はしやすい(理解しやすい) •  最初の⼀歩はこれ? •  デメリット • 

    Machine Readableではない •  ドキュメントの書きやすさがSaaS/ツールに 左右されてしまう
  18. ドキュメントを更新し続ける •  APIの「仕様」と「実装」が⼀致しているかを確認 •  これを確認するテストを書ければ… •  そのためには, 仕様をMachine Readableに するのが必須になってくる

    •  APIのドキュメントを更新するチーム作り •  若⼲精神論っぽい…! •  とはいえ, これを作るのが最優先 •  確認する仕組みは, あくまでこれの補助
  19. さいごに •  APIに関する様々な話題について紹介しました •  APIを利⽤したServiceの構築例 •  APIについての簡単な紹介 •  APIを作る為に有⽤なライブラリの紹介 • 

    「内部向けAPI」は毒にも薬にもなる •  うまく役割/機能を分離できるかもしれない •  しかし, 異様に複雑にしてしまう可能性も…