ぎんざRuby会議01にて、「マイクロサービス指向 Rails API 開発ガイド」という発表をしました
技術開発本部の qsona です。
先日、 ぎんざRuby会議01 というミートアップが開かれました。これは、弊社の技術顧問のwillnetさんを含む3人の方によって運営されている Ginza.rb というコミュニティの50回目を記念して開かれたものです。
このミートアップにCFPを投稿し、採択いただきました。かなりの高倍率の中、目にとどめていただけたこと、また普段お世話になっているコミュニティの節目の会での発表の機会を頂けるということで、非常に有り難いことでした。
発表資料
以下がその発表資料です。また、引用した文献をこの下に列挙したので、適宜ご参照ください。
引用文献
p3 マイクロサービス時代に捧ぐ、Railsでの中規模APIサーバ開発のための技術構成 — qsona (Qiita)
p27 step-by-step BFF — Yosuke Furukawa (Speaker Deck)
p29 Richardson Maturity Model — Martin Fowler
p48 active_model_serializers (GitHub)
p55 How DHH Organizes His Rails Controllers — Jerome Dalbert
p55 DHHはどのようにRailsのコントローラを書くのか (POSTD)
p75 Best Practices for Designing a Pragmatic RESTful API — Vinay Sahni
p75 翻訳: WebAPI 設計のベストプラクティス — mserizawa(Qiita)
p76 RESTful API の設計のキホン — Cside
p84 committee + prmd でJSON Schemaをいい感じに運用する — ota42y
p84 FiNCのWeb API開発事情 — Fumiya Shinozuka
補足
特に多く意見をいただいたのは、2章後半で、 pathからリソースを取得するコードをController間で共通化をする部分でした。
個人的な気持ちは「このpathに対してはこうリソースを取得する」というのを共通化したかった、というもので、もう少し丁寧に考えると以下の2つになります。
- path paramの捉え方 (例えば users/:id の idに
'me'
が来たら、認証されたユーザを取得する、 events/:id の idに'current'
が来たら、今開催中のイベントを取得する、など) - リソースの絞り方 (例えば、 events/:id/xxx のAPIで、返してよいイベント(催し物)は、開催中のものなのか、開催前のものも含めるのか)
このリソースの取り方・絞り方は基本的にModel 側にもスコープやメソッドで定義するのですが、pathの解釈の仕方自体はModelに持たせたくないので、Controller側で共通化させたい、というものでした。
ただ、頂いた意見を見ると、Modelにメソッドを定義すれば良いのではというものや、共通化する場所ではないのでは(もちろんDRYには功罪があります)というものが多かったです。自分としても考えると、直近の開発でここをDRYにしたいという欲求が強かっただけで、普段そうというわけでもない気がしています。また、共通化のさせ方でも、クエリオブジェクトを作る方法もあるという意見があり、そこは参考にしたいと思いました。
反省など
今回はテーマの性質上、なるべく網羅的に話したいという気持ちがあり、25分にしては詰め込み気味の内容にしました。しかし終わってみると18分で話しきってしまい、ちょっと時間を意識しすぎて早口になってしまったかなというのが反省点です。(前日の練習だと25分ちょうどくらいで、そこから10枚くらいスライド足したはずなのに・・)
というわけで、当日聴いてくださった方もそうでない方も、疑問やご意見等あればなんなりと Twitter (qsona) にリプいただければ返答させていただきます。
最後に
スライドの前半でも触れましたが、FiNCではWeb APIの設計を重視しています。その理由は大きく分けて2つあると考えています。
1つ目は、リッチなクライアントアプリケーションを開発するためです。もちろん動的HTMLではないので、必然的にWeb APIが必要になります。また、リッチになればなるほど、ドメインの考察やよく定義されたAPIが必要になると感じています。
2つ目は、多角的なビジネスに対応するため、マイクロサービスの開発手法を取り入れていることです。
FiNCでは、ヘルスケアの予防領域に特化し、プラットフォームを提供しています。日本中・世界中の人を健康にし、FiNCでなければ救えなかった人を一人でも増やしていくため、この分野に対して様々な形でサービスを提供していきます。
その各々のビジネスを素早く進化させるために、FiNCではマイクロサービスのアーキテクチャを採用しています。また、多角的でありながらもゴールは一つなので、ビジネスが緻密に連携し、そのためにマイクロサービスを連携させていく必要があります。
そして、マイクロサービスはAPIを通して連携するため、必然的に良いAPI設計が必要になってくるのです。
と、少々熱く語ってしまいましたが、FiNCのエンジニアは、このように大きなビジョンに対して技術でリードしていきたいと考えています。少しでも興味を持って下さった方、ぜひ気軽にお話させてください。お待ちしています!