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

20200821_CookpadTechKitchen_24_.pdf

6d973f7399cb5a9f6091e7f67245cc39?s=47 hyoga
August 21, 2020
340

 20200821_CookpadTechKitchen_24_.pdf

「CookpadTechKitchen#24 5800万人が使うサービスのリニューアルとその技術」
でお話させて頂いた「気兼ねなく「レシピを保存」するために」の資料です

https://cookpad.connpass.com/event/183385/

6d973f7399cb5a9f6091e7f67245cc39?s=128

hyoga

August 21, 2020
Tweet

Transcript

  1. 気兼ねなく 「レシピを保存」するために クリエイション開発部 Hyoga Yoshida (@cd_glacier) 2020/08/21 CookpadTechKitchen#24 ハッシュタグ: #cookpad_tech_kitchen

  2. • 2019年に新卒入社(2年目) • レシピ事業でサーバーサイドエンジニアとして働く • 現在: 駄々をこねて, 全く触ったことのないAndroidアプリ 開発に入門中(楽しい) •

    趣味はスマブラ 自己紹介
  3. 今日話すこと 探す 投稿 保存 Cookpadでできること

  4. 今日話すこと 探す 投稿 保存 Cookpadでできること

  5. 1. そもそも保存とは? 2. リニューアル前の保存体験: MYフォルダ 3. リニューアル後の保存体験: クリップ 4. クリップ機能を作っていく

    a. MYフォルダという資産を流用したい...が 5. clip_backend a. 実現したいこと b. DynamoDBを採用 c. DynamoDBのテーブル設計 d. 捨てやすいように使う 目次
  6. そもそも保存とは?

  7. そもそも保存とは? • 美味しかったのでまた作りたい! • 作ったことはないけど、美味しそうだったので! • 今日作る予定で、スーパーで材料を確認するため • 同じようなレシピを比較するため ◦

    e.g. ハンバーグのレシピがたくさんあるけれど、どのレシ ピがよいだろうか...
  8. リニューアル前の保存体験: MYフォルダ

  9. リニューアル前の保存体験: MYフォルダ • 好きなレシピを保存できる ◦ 「未整理のレシピ」に保存される ◦ 保存後は任意の名前のフォルダに分 類することができる •

    無料会員: 20件, 有料会員: 3000件 の保 存制限がある
  10. リニューアル前の保存体験: MYフォルダ • 保存数に制限がある • 保存後にフォルダ分けしないと上手に使うことができない → 手軽に保存することができない

  11. リニューアル後の保存体験: クリップ

  12. リニューアル後の保存体験: クリップ • クリップするとクリップトレイに保存される • クリップトレイに保存されたレシピは横スワ イプでレシピを切り替えることができる • クリップトレイに保存されたレシピは1日で 消える

    }クリップトレイ
  13. リニューアル後の保存体験: クリップ • 以前にクリップしたレシピは時系列順に閲 覧することができる • 無料会員も有料会員も保存制限なし • (検索, フォルダなども使えます)

    • (ただし検索が有料会員機能に)
  14. リニューアル後の保存体験: クリップ • 保存制限なし • 保存後にフォルダ分けする必要もなし • 一日でクリップトレイに保存したレシピが消える → 気兼ねなく保存できる

  15. リニューアル後の保存体験: クリップ • ちょっとでも気になったレシピを保存してもらうことで、料理を楽しみにしてもらい たい ◦ リニューアル前だと気に入ったレシピに出会っても保存することさえできな い場合があった • Cookpadを開いてもらう回数自体を増やしたい

    ◦ 新しいレシピを探す時だけではなく、前つくったレシピとかを思い出す時に も使ってほしい なぜ「気兼ねなく保存」という体験に...?
  16. リニューアル前後の比較 クリップ なし 有料会員機能に 分類する必要はない (可能ではある) 保存制限 検索 フォルダ分け MYフォルダ

    無料会員: 20件 有料会員: 3000件 制限無し (保存制限があるので実質有料会員機能 ) 分類することが前提の デザインになっている
  17. クリップ機能を作っていく

  18. MYフォルダという資産を流用したい せっかくMYフォルダという機能が存在してるので、 MYフォルダを使用、改善してクリップ機能をつくっていきたい!

  19. MYフォルダという資産を流用したい...が • DBはMySQL ◦ id, user_id, recipe_id などをもっていて割とシンプル • ただしApplication側がカオス...

    ◦ あるユーザの1ページ目を取得しようとすると、そのユーザのMY フォルダが全件cacheに乗る ◦ MYフォルダ内で”鶏肉”と検索すると, 1. cookpadの全レシピから “鶏肉” のレシピを検索する 2. ユーザの持つMYフォルダのレシピとの積集合を取る
  20. MYフォルダという資産を流用したい...が 歴史の長い機能であまりに複雑... あまりに密結合....

  21. • MYフォルダに機能追加は複雑すぎて難しい... • MYフォルダ自体のリプレイスも別threadで行われていたの で, 変更がconflictしそう • 保存制限がなくなるので, MySQLで時系列データを扱ってパ フォーマンスを出すのも難しい

    MYフォルダという資産を流用したい...が
  22. myfolder clip_backend }クリップ機能 clip_backendというマイクロサービスを作る clip_backend + myfolder をあわせてクリップ機能を実現する

  23. clip_backend

  24. 時系列順に 表示される 検索結果にクリップしたこ とがあるか 表示される 実現したいこと

  25. • 時系列データを扱う • あるレシピの存在確認 ただし • (気兼ねなくクリップしてほしいので) 書き込みがたくさん来ても耐えら れる •

    (保存制限がなくなったので) 保存数が多くても性能低下しない という条件つき! 実現したいこと
  26. • 運用コストが低い • 大量のデータの書き込み, 読み込みにも耐えられる • clip_backendを使うユースケースが限られていた ◦ レシピをクリップしたことがあるのか確認する ▪

    Key-Value型のためO(1) ◦ 時系列順に表示する ▪ テーブル設計を工夫するとことで実現できる DynamoDBを採用
  27. PartitionKey SortKey other info user_id CLIP_LOG_#{created_at} user_id recipe_id created_at CLIP_SMR_#{recipe_id}

    user_id recipe_id created_at modified_at clipped _count # 時系列データの取得 → query(pk = user_id, begins_with = “CLIP_LOG_”) # あるレシピをクリップしたことがあるか → get_item(pk = user_id, sk = “CLIP_SMR_#{recipe_id}”) DynamoDBのテーブル設計
  28. DynamoDBを採用した結果 • 運用という運用をしたことは一度もない • 書き込み自体は今のところ 約2百万 / day くらい ◦

    リニューアル前と比べて保存数が約25%上がったけれど全 然だいじょうぶ ‍♂ • (3000件制限だったが、制限がなくなり)最大で, 約4万件保存し ている人が存在しているが, 読み込みも問題なし
  29. 捨てやすいように使う

  30. 捨てやすい...とは? 別に捨てたいわけではない • 捨てようと思った時にすぐ消せる状態になっている という状態を目指すことで、マイクロサービス同士が疎結合にな り、依存が明らかになっている のを目指そうというものです

  31. 捨てやすい...とは? クライアント clip_backend myfolder cookpadでは昔のversionのアプリケーションもサポートし ているため、 clip_backendは簡単には消せない

  32. 捨てやすい...とは? クライアント clip_backend myfolder cookpadでは昔のversionのアプリケーションもサポートし ているため、 clip_backendは簡単には消せない →捨てにくい

  33. クライアント BFF clip_backend myfolder 捨てやすいように使う ref: モダンBFFを活用した既存APIサーバーの再構築

  34. 捨てやすい様に使う クライアント BFF clip_backend myfolder 時系列データがほしい時

  35. 捨てやすい様に使う クライアント BFF clip_backend myfolder フォルダを表示したい

  36. 捨てやすい様に使う クライアント BFF clip_backend myfolder レシピをクリップする

  37. 捨てやすい様に使う • BFFが問い合わせ先を変更するだけでclip_backendは削除 できる • 実際にレシピの存在確認の問い合わせ先をMYフォルダに 変更したり、戻したりということをした

  38. • 機能ごとにclip_backendとmyfolderを使いわけている • 検索: 何も変わっていない • 保存制限が無限になったことでMYフォルダが寿命を迎え始 めている(けっこうヤバい) • MYフォルダのリプレイスは徐々に進んでいる

    そして今...
  39. 完 ご清聴ありがとうございました