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

Cookpad TechConf 2022 - About PJ Takanawa (Hiro...

Hiromu Miyazaki
December 02, 2022
3.4k

Cookpad TechConf 2022 - About PJ Takanawa (Hiromu Miyazaki)

Cookpad TechConf 2022 の資料です。

Hiromu Miyazaki

December 02, 2022
Tweet

Transcript

  1. レシピサービスとは:サービス的概要 • 料理レシピサービス • 複数プラットフォームで提供 ◦ Web (PC・スマートフォン) ◦ Android・iOS

    アプリ • 歴史の長いサービス ◦ 技術的負債やレガシーも多い 7 1. レシピサービスの歴史と課題
  2. 8

  3. 11

  4. 12

  5. 13

  6. BFF (Backend For Frontend) • フロントエンドのため API を集約し、UI/UX 上のデータ整形を行うオーケス トレーション層の1種

    15 • クライアント ↔ サーバ間に BFF を用意 ◦ クライアントから無数のマイクロサービスに 直接アクセスしたくなかった • マイクロサービスにおける BFF の活躍 ◦ リソースの集約・クライアントへの API の提供を行う ◦ 集約時に発生するロジックや必要なデータを扱う 1. レシピサービスの歴史と課題
  7. 19

  8. 20

  9. なんか開発がつらい 21 /search_result って どんなレスポンス 返すんでしたっけ? nullable じゃないはずの image フィールドに

    null が返ってきた… サービス多すぎて どこに何書けばいいか分 からん (よく分からないけど コピペで動いたので) レビューお願いします 2.レシピサービスのアーキテクチャを最高にしたい
  10. 22

  11. 25

  12. 34

  13. • リソースサーバーから返ってきたリソースの visible フィールドが false だっ た場合に、クライアントに null を返す 37

    クライアントを振り回す BFF ロジック • ユーザーが有料会員のときだけ マイフォルダのレシピを検索結果に埋め込む • マイクロサービス化で分割されてしまったデータの結合処理 2.レシピサービスのアーキテクチャを最高にしたい
  14. 38 • 現状、クックパッドの BFF はロジックてんこもり ◦ 一部のハードコードされたデータも持っている ▪ 例)季節キャンペーンデータとか BFF

    ってロジック持って良いんだっけ? • BFF がロジックを持たない方が複雑性は小さい • 特にルールがないまま運用されている 2.レシピサービスのアーキテクチャを最高にしたい
  15. • アプリ向け BFF ◦ どんなレスポンスが返ってくるか実装を読まないと分からない ◦ スキーマなどの約束事がない ◦ コミュニケーションコストが高い ◦

    フロントエンドが壊れやすい 40 ある API がどういった API なのか分からない 2.レシピサービスのアーキテクチャを最高にしたい
  16. 42 • バックエンドは で、アプリの BFF は で、 Web の BFF

    は   で…… 技術スタックの分散 • 元々アプリ向け BFF はアプリエンジニアが書く想定だった ◦ 実際はサーバーサイドエンジニアが書くことが多かった • コンテキストスイッチと学習のコストが高い 2.レシピサービスのアーキテクチャを最高にしたい
  17. ここまでのおさらい • レシピサービスはクソデカモノリスからマイクロサービス化した • マイクロサービス化によって開発・保守しやすくなった側面もある • でも最近なんか開発がつらい ◦ アプリケーションごとの責務が不明瞭 ◦

    フロントエンドとサーバーサイドのエンジニアが 双方の実装状況を意識する必要がある ◦ 技術スタックの分散 43 2.レシピサービスのアーキテクチャを最高にしたい
  18. 44

  19. プロジェクト Takanawa とは? • レシピサービスにおける「何かつらくね?」を解消するプロジェクト 46 • レシピサービス全体のアーキテクチャをいい感じにして、 開発しやすい状態にする •

    やること ◦ レシピサービスへの Gateway 層の導入 ◦ アプリケーションごとの責務の整理 ◦ 周辺負債の返済・機能の削減 2.レシピサービスのアーキテクチャを最高にしたい Photo by: https://dime.jp/genre/869047/
  20. プロジェクト Takanawa とは? • レシピサービスにおける「何かつらくね?」を解消するプロジェクト 47 • レシピサービス全体のアーキテクチャをいい感じにして、 開発しやすい状態にする •

    やること ◦ レシピサービスへの Gateway 層の導入 ◦ アプリケーションごとの責務の整理 ◦ 周辺負債の返済・機能の削減 2.レシピサービスのアーキテクチャを最高にしたい Photo by: https://dime.jp/genre/869047/
  21. レシピサービスへの Gateway 層の導入 • BFF がしんどい 48 • API Gateway

    層(api4-gateway)を導入する • フロントエンドは api4-gateway 経由でリソースを取得する ◦ Web、iOS、Android 全てのプラットフォーム 2.レシピサービスのアーキテクチャを最高にしたい
  22. api4-gateway:概要 • API Gateway パターン • クライアントからのリクエストは必ずここを通る • 責務 ◦

    GraphQL のスキーマに基づく共通のインターフェースを提供 ◦ 複数のサーバーからのリソースを集約する 51 2.レシピサービスのアーキテクチャを最高にしたい
  23. 52

  24. api4-gateway のここが違うよ • プラットフォームごとに共通の GraphQL によるスキーマを提供 53 • ロジック・データを持たせない! ◦

    オーケストレーション層はロジックを持ちがちでつらくなる ◦ api4-gateway はあくまで透過的にバックエンドを扱うだけの 薄い層にする ◦ ロジックを書けないような構成にする ◦ むずかしいことは全部バックエンドにやらせる 2.レシピサービスのアーキテクチャを最高にしたい
  25. むずかしいことは全部バックエンドにやらせる • 処理を各バックエンドサーバーに返還する 54 • レシピサービスにおけるメインとなるバックエンドを決めた ◦ 置き場所がなかったものに明確な置き場所を与えた (そしてそれは BFF

    ではない) • メリット ◦ ロジック・データの責任の所在がはっきりする ◦ オーケストレーション層がすっきりする ◦ 手慣れた Ruby でロジックが書ける 2.レシピサービスのアーキテクチャを最高にしたい
  26. api4-gateway は何を解決する? • アプリケーションごとの責務が不明瞭 ◦ api4-gateway にロジック・データは置かないで、 各リソースサーバーに返還する ◦ 既存の

    BFF を改善していくだけだと不十分 • フロントエンドとサーバーサイドのエンジニアが 双方の実装状況を意識する必要がある ◦ 共通の GraphQL スキーマでコミュニケーションが取れる • 技術スタックの分散 ◦ 難しいロジックを Ruby で書ける ◦ アプリ用 BFF を捨てることで利用言語を1つ減らせる 56 2.レシピサービスのアーキテクチャを最高にしたい