Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
クックパッドの巨大 Rails アプリケーションの改善
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
hogelog
September 12, 2018
Technology
12k
12
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クックパッドの巨大 Rails アプリケーションの改善
hogelog
September 12, 2018
More Decks by hogelog
See All by hogelog
スマホでゲームをするか、漫画を読むか、開発をするか / Gaming, Reading or Coding on my phone.
hogelog
1
130
dentaku - Ruby製の電卓CLI / dentaku - A Ruby CLI Calculator
hogelog
0
55
"複雑なデータ処理 × 静的サイト" を両立させる、楽をするRails運用 / A low-effort Rails workflow that combines “Complex Data Processing × Static Sites”
hogelog
3
6.2k
Javaアプリケーションの配布とパッケージング / Distribution and packaging of Java applications
hogelog
4
990
RubyのWebアプリケーションを50倍速くする方法 / How to Make a Ruby Web Application 50 Times Faster
hogelog
3
1.3k
なぜ Rack を理解すべきかプレトーク / Why should you understand Rack - Pre-talk
hogelog
0
450
ruby/irbへのコントリビュートと愉快な仲間たち / RubyKaigi 2024 Wrap Party
hogelog
0
250
RubyKaigi 2024 LT: Visualize the internal state of ruby processes in Real-Time
hogelog
0
330
Talk about CI and testing of the STORES
hogelog
2
630
Other Decks in Technology
See All in Technology
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
170
作る力から、見極める力へ — AI時代に広がるエンジニアの価値と役割
rince
0
360
【FinOps】データドリブンな意思決定を目指して
z63d
2
490
AI時代における最適なQA組織の作り方
ymty
3
170
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.6k
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
1
1.9k
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
230
5分でわかる Amazon Connect_20260608
hwangbyeonghun
0
130
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.1k
元・セキュリティ学習経験0大学生による業務紹介 / An Introduction to the Job by a Former College Student with Zero Security Training Experience
nttcom
0
950
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
150
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
140
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
420
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Accessibility Awareness
sabderemane
1
140
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
200
Code Reviewing Like a Champion
maltzj
528
40k
Google's AI Overviews - The New Search
badams
0
1k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Utilizing Notion as your number one productivity tool
mfonobong
4
330
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Why Our Code Smells
bkeepers
PRO
340
58k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Transcript
クックパッドの巨大 Rails アプリケーションの改善 クックパッド株式会社 技術部開発基盤 @hogelog (小室直)
hogelog (小室 直) • 2013/8 クックパッド株式会社 入社 ◦ レシピ投稿関連の開発等(Web, Android)
◦ 会員事業関連、OEM 向け API 開発等 (Web, Android) ◦ 技術部開発基盤(いろいろ)
大きな Rails アプリケーション 開発してますか?
クックパッドでは 巨大 Rails アプリケーションを どう改善しているか
巨大 Rails アプリケーション リポジトリ cookpad_all の今昔
cookpad_all とは • cookpad.com を支える複数の Rails アプリと共有ロジック をまとめた shared gem
を含むリポジトリ • cookpad_all 内の各アプリはほとんど共有 DB
一昔前のクックパッドの開発風景 • 大多数の社内エンジニアが cookpad_all で開発する状況 • 開発基盤、インフラのリソースも cookpad_all に集中 ◦
強いモノリシック Rails アプリの時代 ◦ The Recipe for the World's Largest Rails Monolith by @a_matsuda https://speakerdeck.com/a_matsuda/the-recipe-for-the-worlds-largest-rails-monolith
2016 年頃のクックパッドの開発風景 • Microservices が進み cookpad_all 以外の開発が増える • cookpad_all は巨大だし辛い
• cookpad_all は基盤からレガシーな部分が多く整備コストも 高い ◦ Microservices 基盤は整っていく ◦ クックパッドにおける最近のMicroservices事例 by @adorechic https://techlife.cookpad.com/entry/2016/03/16/100043
2017 年、お台場プロジェクト発足 • @aamine により立ち上げられた cookpad_all 改善プロ ジェクト • 裏の目標は「開発基盤」というチームの解散
◦ cookpad_all はもうサービス開発チームが高い意識による片手間程度でメ ンテナンスできる規模ではない ◦ cookpad_all を徹底的に改善し、普通の開発チームでメンテナンスできる 状態にする
お台場プロジェクト やったこと
お台場プロジェクトでやったこと • 開発メトリクスの定点観測 • システム削除 • システム分割 • コード削除 •
その他
開発メトリクスの定点観測 • コード量、起動時間などの開発メトリクスを InfluxDB に記 録、Grafana のダッシュボードで定点観測 ◦ 大きな Rails
アプリケーションをなんとかしよう。まずは計測と可視化からは じめよう。 by @hogelog https://techlife.cookpad.com/entry/2018/06/08/080000
CI Duration • CI にかかった時間
App Load Time • アプリのロードにかかった時間
Code Statistics • rails stats を記録
2017-07-01 時点の stats +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC
| Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 55217 | 44464 | 619 | 4505 | 7 | 7 | | Helpers | 16853 | 13810 | 21 | 1582 | 75 | 6 | | Models | 95824 | 75336 | 1892 | 8854 | 4 | 6 | | Mailers | 2011 | 1612 | 45 | 199 | 4 | 6 | | Workers | 841 | 712 | 25 | 40 | 1 | 15 | | Chanko units | 8656 | 7160 | 2 | 169 | 84 | 40 | | Libraries | 50869 | 42003 | 660 | 3779 | 5 | 9 | | Feature specs | 58694 | 47269 | 0 | 189 | 0 | 248 | | Request specs | 56536 | 48938 | 0 | 24 | 0 | 2037 | | Routing specs | 544 | 437 | 0 | 0 | 0 | 0 | | Controller specs | 63233 | 52246 | 6 | 123 | 20 | 422 | | Helper specs | 5318 | 4389 | 1 | 10 | 10 | 436 | | Model specs | 91372 | 75504 | 5 | 85 | 17 | 886 | | Worker specs | 1150 | 954 | 0 | 1 | 0 | 952 | | Chanko unit specs | 7845 | 6293 | 0 | 8 | 0 | 784 | | Library specs | 26156 | 21905 | 23 | 123 | 5 | 176 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 541119 | 443032 | 3299 | 19691 | 5 | 20 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 185097 Test LOC: 257935 Code to Test Ratio: 1:1.4
2018-09-12 時点の stats +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC
| Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 32080 | 25883 | 305 | 2690 | 8 | 7 | | Helpers | 13212 | 10739 | 17 | 1214 | 71 | 6 | | Models | 73703 | 58028 | 1282 | 6540 | 5 | 6 | | Mailers | 1663 | 1336 | 38 | 165 | 4 | 6 | | Workers | 0 | 0 | 0 | 0 | 0 | 0 | | Chanko units | 6154 | 5142 | 2 | 147 | 73 | 32 | | Libraries | 33604 | 28014 | 373 | 2449 | 6 | 9 | | Feature specs | 43505 | 34908 | 0 | 176 | 0 | 196 | | Request specs | 809 | 637 | 0 | 0 | 0 | 0 | | Routing specs | 406 | 328 | 0 | 0 | 0 | 0 | | Controller specs | 48137 | 39729 | 2 | 76 | 38 | 520 | | Helper specs | 4151 | 3430 | 0 | 9 | 0 | 379 | | Model specs | 63788 | 52339 | 2 | 52 | 26 | 1004 | | Worker specs | 0 | 0 | 0 | 0 | 0 | 0 | | Chanko unit specs | 2961 | 2359 | 0 | 1 | 0 | 2357 | | Library specs | 16383 | 13588 | 17 | 86 | 5 | 156 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 340556 | 276460 | 2038 | 13605 | 6 | 18 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 129142 Test LOC: 147318 Code to Test Ratio: 1:1.1
Dependent Gem Count • 依存 gem 数
GemCollector Up-to-date Point • 依存 gem の最新度 ◦ この gem
を使っているアプリケーションを探す by @eagletmt https://techlife.cookpad.com/entry/2018/06/08/080000
システム削除 • cookpad_all 内の不要なシステムを削除する ◦ 工夫はとくになし
2017 年当初の cookpad_all 構成 • cookpad というアプリが特に厳しい(1アプリでデプロイ先4つ)
api の削除 • cookpad 内のレガシー HTTP API 機能を削除 ◦ 社内でも動作確認不可能な古いモバイルアプリだけから使われていた
◦ 関係者、責任者と話を詰めて削除
api の削除 • cookpad のデプロイ先が1個減る(デプロイ先3つ)
background worker の削除 • cookpad 内のレガシー非同期処理システムを削除 ◦ resque 製非同期処理基盤 ◦
モダン非同期処理基盤としては barbeque が整備されていたので移行 ▪ ECS を利用したオフラインジョブの実行環境 by @k0kubun https://techlife.cookpad.com/entry/2016/09/09/235007
background worker の削除 • cookpad のデプロイ先が1個減る(デプロイ先2つ)
システム分割 • システムを正しく分割する • DB 共有はしない。アプリ間は API でやりとりする
pantry の分割 • cookpad と pantry を分割 (cookpad_all 内で) ◦
デプロイ先により挙動が変わる不思議なアプリを分割 ◦ 本質的に共有するものは多くなかった (切り離しはもちろん大変だった)
pantry の分割 • 1アプリ1デプロイ先という自然な状態に
様々な Microservices アプリへの切り出し • 検索機能、料理きろく API、モバイルアプリ AB テスト用 API、ユーザ認証関連機能、など数々なアプリを cookpad_all
から切り出し ◦ 切り出す単位は組織構造にフィットする、それでいてひとまとまりになってい て細かすぎないサイズ ▪ つまり「ちょうどいいサイズに」
様々な Microservices アプリへの切り出し • 色んな機能群を Microservices アプリ として切り出し
mobile の作り直し • ガラケー向けサイトモバれぴバックエンドのmobile ◦ アクティブに開発していないので作り直しのブロッカーがいない ◦ モダンな基盤で作り直す ▪ Hako
(ECS) 環境, gRPC, Service Mesh, ...
mobile の作り直し(移行中) • cookpad_all 内の アプリが4つに
コード削除 • 不要コードを削除する ◦ がんばって不要コードを探して削除 ◦ Gemfile をジッと眺めて不要 gem を探す
◦ lazy loading を利用し不要 gem を検出 ◦ 棚卸し Issue の自動作成 ◦ Iseq 実行処理を記録し不要コードを探す
がんばって不要コードを探して削除 • 不要コードをがんばって探して削除する • Code Cleaning Contest を開催 ◦ 期間一ヶ月のコード削除コンテスト
◦ 掃除にちなんだ豪華景品も
棚卸し Issue の自動作成 • 棚卸し Issue 作成、コード削除うながす作業を(半)自動化 ◦ 不要そうなコードを検出しコミッタからランダムにアサインしてコード削除か 必要なコードであるか記録するよう促す
◦ 元データはアクセスログ、バッチ処理実行ログ等 • 削除可否だけ聞いてお台場プロジェクトメンバーが削除する ことも
Gemfile をジッと眺めて不要 gem を探す • Gemfile を見て不要そうな gem を削除 ◦
jquery-rjs, aws-sdk-v1, …… • 工夫特になし
lazy loading を利用し不要 gem を検出 • ruby に手を加え lazy loading
利用し不要 gem を検出 ◦ Ruby の lazy loading の仕組みを利用して未使用の gem を探す by @riseshia https://techlife.cookpad.com/entry/2018/04/04/080000
Iseq 実行処理を記録し不要コードを探す • ruby に手を加え Iseq 実行ログを記録し不要コードを探す ◦ 本番で記録したログを Redshift
に蓄積 ◦ 詳細は近日中に @riseshia から techlife かどこかで発表など ◦ ruby 2.6 では素の ruby で可能になるかも ▪ Feature #15022 Oneshot coverage by @mame https://bugs.ruby-lang.org/issues/15022
その他 • gem の更新 ◦ rails, rspec など様々な gem のアップグレード
◦ Machinist 1 -> FactoryBot 移行 ◦ リポジトリに埋め込まれていた改造 gem を捨てて OSS 最新版に更新 ◦ bootsnap の導入 • ruby アップグレード • EC2 インスタンスの式年遷宮 (CentOS 6 -> Ubuntu 16)
うまく進んでいる要因? • 「お台場プロジェクト」という名前をつけた ◦ 名前があると自分も他人も認識する • 人をアサインしている ◦ メインタスクとして稼働している優秀なエンジニアが何人もいる •
すぐ近くに ruby コミッタが二人いる ◦ Iseq 実行ログの記録や lazy loading の活用なんかはガッツリサポートして もらいました
まとめ
まとめ • とにかく不要なコードを消したり分割したり、やっていってま す • まだまだ「ふつうの Rails アプリケーション」とは言えないの でチャレンジはいっぱい残されている