Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

1. そもそも保存とは? 2. リニューアル前の保存体験: MYフォルダ 3. リニューアル後の保存体験: クリップ 4. クリップ機能を作っていく a. MYフォルダという資産を流用したい...が 5. clip_backend a. 実現したいこと b. DynamoDBを採用 c. DynamoDBのテーブル設計 d. 捨てやすいように使う 目次

Slide 6

Slide 6 text

そもそも保存とは?

Slide 7

Slide 7 text

そもそも保存とは? ● 美味しかったのでまた作りたい! ● 作ったことはないけど、美味しそうだったので! ● 今日作る予定で、スーパーで材料を確認するため ● 同じようなレシピを比較するため ○ e.g. ハンバーグのレシピがたくさんあるけれど、どのレシ ピがよいだろうか...

Slide 8

Slide 8 text

リニューアル前の保存体験: MYフォルダ

Slide 9

Slide 9 text

リニューアル前の保存体験: MYフォルダ ● 好きなレシピを保存できる ○ 「未整理のレシピ」に保存される ○ 保存後は任意の名前のフォルダに分 類することができる ● 無料会員: 20件, 有料会員: 3000件 の保 存制限がある

Slide 10

Slide 10 text

リニューアル前の保存体験: MYフォルダ ● 保存数に制限がある ● 保存後にフォルダ分けしないと上手に使うことができない → 手軽に保存することができない

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

リニューアル後の保存体験: クリップ ● 保存制限なし ● 保存後にフォルダ分けする必要もなし ● 一日でクリップトレイに保存したレシピが消える → 気兼ねなく保存できる

Slide 15

Slide 15 text

リニューアル後の保存体験: クリップ ● ちょっとでも気になったレシピを保存してもらうことで、料理を楽しみにしてもらい たい ○ リニューアル前だと気に入ったレシピに出会っても保存することさえできな い場合があった ● Cookpadを開いてもらう回数自体を増やしたい ○ 新しいレシピを探す時だけではなく、前つくったレシピとかを思い出す時に も使ってほしい なぜ「気兼ねなく保存」という体験に...?

Slide 16

Slide 16 text

リニューアル前後の比較 クリップ なし 有料会員機能に 分類する必要はない (可能ではある) 保存制限 検索 フォルダ分け MYフォルダ 無料会員: 20件 有料会員: 3000件 制限無し (保存制限があるので実質有料会員機能 ) 分類することが前提の デザインになっている

Slide 17

Slide 17 text

クリップ機能を作っていく

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

MYフォルダという資産を流用したい...が ● DBはMySQL ○ id, user_id, recipe_id などをもっていて割とシンプル ● ただしApplication側がカオス... ○ あるユーザの1ページ目を取得しようとすると、そのユーザのMY フォルダが全件cacheに乗る ○ MYフォルダ内で”鶏肉”と検索すると, 1. cookpadの全レシピから “鶏肉” のレシピを検索する 2. ユーザの持つMYフォルダのレシピとの積集合を取る

Slide 20

Slide 20 text

MYフォルダという資産を流用したい...が 歴史の長い機能であまりに複雑... あまりに密結合....

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

myfolder clip_backend }クリップ機能 clip_backendというマイクロサービスを作る clip_backend + myfolder をあわせてクリップ機能を実現する

Slide 23

Slide 23 text

clip_backend

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

● 時系列データを扱う ● あるレシピの存在確認 ただし ● (気兼ねなくクリップしてほしいので) 書き込みがたくさん来ても耐えら れる ● (保存制限がなくなったので) 保存数が多くても性能低下しない という条件つき! 実現したいこと

Slide 26

Slide 26 text

● 運用コストが低い ● 大量のデータの書き込み, 読み込みにも耐えられる ● clip_backendを使うユースケースが限られていた ○ レシピをクリップしたことがあるのか確認する ■ Key-Value型のためO(1) ○ 時系列順に表示する ■ テーブル設計を工夫するとことで実現できる DynamoDBを採用

Slide 27

Slide 27 text

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のテーブル設計

Slide 28

Slide 28 text

DynamoDBを採用した結果 ● 運用という運用をしたことは一度もない ● 書き込み自体は今のところ 約2百万 / day くらい ○ リニューアル前と比べて保存数が約25%上がったけれど全 然だいじょうぶ ‍♂ ● (3000件制限だったが、制限がなくなり)最大で, 約4万件保存し ている人が存在しているが, 読み込みも問題なし

Slide 29

Slide 29 text

捨てやすいように使う

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

完 ご清聴ありがとうございました