Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
巨大なRailsアプリケーションを「普通」にするための取り組み
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kazuhito Hokamura
February 06, 2019
Technology
1.1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
巨大なRailsアプリケーションを「普通」にするための取り組み
Kazuhito Hokamura
February 06, 2019
More Decks by Kazuhito Hokamura
See All by Kazuhito Hokamura
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
7
3.5k
TypeScriptとGraphQLで実現する 型安全なAPI実装 / TSKaigi 2024
hokaccha
5
5.2k
Kotlin製のGraphQLサーバーをNode.jsでモジュラモノリス化している話
hokaccha
0
3.8k
GraphQLの負債と向き合うためにやっていること
hokaccha
2
1.7k
ユビーのアーキテクチャに対する取り組み
hokaccha
1
510
RailsエンジニアのためのNext.js入門
hokaccha
7
22k
Cookpad Summer Internship 2021 Web Frontend
hokaccha
0
7.4k
巨大なモノリシック Rails アプリケーションの マイクロサービス化戦略 / 2019 microservices in cookpad
hokaccha
3
4.1k
Web Frontend Improvement in Cookpad
hokaccha
1
1.2k
Other Decks in Technology
See All in Technology
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
260
Tab5をRubyで動くパソコンにする
kishima
2
310
Screen Lens - 今見てる画面を翻訳する
komagata
0
240
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
3
970
AIで仕事のやり方を変える
matsu7874
3
1k
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
1
1.4k
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
600
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
1
300
Reactの設計論
uhyo
14
7.8k
AIとペアプロを始める。人とのペアプロをやめる。ペアプロの良さを改めて知る。もっと好きになった。 / Rediscovering Pair Programming
honyanya
1
330
Sigmaで作る業務アプリ
kazushiro_honma
0
110
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
300
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Technical Leadership for Architectural Decision Making
baasie
3
560
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
440
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
350
So, you think you're a good person
axbom
PRO
2
2.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
How to Talk to Developers About Accessibility
jct
2
540
Transcript
巨大なRailsアプリケーションを 「普通」にするための取り組み 2019/02/06 Repro Tech Meetup @hokaccha
自己紹介 •@hokaccha •Cookpad Inc. •Nodebrew, Adventar, Bdash
None
3BJMTʹͳͬͯҎ্͕ܦա
•コードを変更すると意図しないところが壊れる。例えばウェブサービスをいじるとガラケーの認証が壊れる。 •ライブラリが古かったとしても依存が多すぎて気軽に更新できない。 •実行環境が非常に複雑かつ特殊で、迂闊にデータベースを追加したりできない。 •普通のツールが動かない。例えばコードカバレージが取れない、並列テストが動かない。 •ObjectクラスやStringクラスのような非常に基本的なクラスが改変されており、普通の動きをしない。 •あるコードのオーナーが誰かわからない。例えばuserリソースのAPIを変更したくても誰にも相談できない。 •開発者が多すぎて、改善系のpull requestを作ると頻繁にコンフリクトする •I/Oの激しいシステムを追加するためにDynamoDBを使いたいと思ったとしても、 AWS-SDKのバージョンが古いのでまずは
SDKのバージョンを更新するのに1ヶ月かかる •テストが遅いので検証にも時間がかかり、そのあいだに別のpullreqがマージされてコンフリクト •実装を進めていくと既存のクラスに変更が必要そうなことがわかってきたがオーナーが誰かはわからない •がんばって実装してみたが触ってもいないバッチのCIが通らない •ようやく理由がわかって直してデプロイしたらなぜかガラケーサイトが落ちた •etc................... IUUQTUFDIMJGFDPPLQBEDPNFOUSZPEBJCBTUSBUFHZΑΓൈਮ
普通のRailsに戻りたい
改善プロジェクトの発足 •2017年に @aamine が立ち上げ、お台場プロジェクト と名付けられる •コツコツとやってきてようやく成果が出始めてきた •今年から専任でやるチームとして分離したのでさらに 加速する予定
お台場プロジェクトの取り組み •システム分離 •機能削除 •コード削減 •レガシーシステムからの脱却 ← 今日の話はこれ
ここで言うレガシーとは •社内外問わずクックパッドのレシピサービス以外では ほぼ使われていないシステムやライブラリ •学習コスト、メンテナンスコストともに高い •最新の機能やエコシステムの恩恵を受けられない
今日の話 •Machinist を FactoryBot に置き換えている話 •RRRSpec をやめた話 •hako 化している話
Machinist → FactoryBot
Machinist とは •テストの用のデータを作るためのライブラリ •5、6年前にメンテナンスが止まった •レシピサービスではずっと Machinist 1系に モンキーパッチをあてながら使っていた
@amatsuda 曰く 「断言しますが、Rails 4.2 と一緒に Machinist 1 を使ってい るプロジェクトは世界中でもこのプロジェクトだけのはず」
FactoryBot •テストデータ作成系ではデファクトスタンダード なライブラリ •クックパッドでもレシピサービス以外は FactoryBot(or FactoryGirl)を使っている
移行したいが Machinist で書かれた大量のコードどうすんの...
Machinist Recipe.blueprint do title { 'recipe title' } description {
'recipe description' } user { User.make } end Recipe.make(title: 'foo')
FactoryBot FactoryBot.define do factory :recipe do title { 'recipe title'
} description { 'recipe description' } user end end FactoryBot.create(:recipe, title: 'foo')
‼いけそう‼
移行手順 •FactoryBot が Machinist の文法を喋れるようにする ラッパーを作る •Machinist の定義(blueprints)を FactoryBot の定義
(factories)に置き換える •Machinist 互換レイヤーを撤去
進捗 •@amatsuda がほぼ一人で進めてくれている •新規のテストは FactoryBot で書ける状態 •古い Machinist のコードを順次書き換えていってる中
RRRSpec
背景 •1台のマシンで並列でテストを実行しても数十分かかる (当時の現実的なマシンスペックで) •テストの実行時間を10分以内に抑えたい •コストも最小限に抑えたい
RRRSpec •複数台で並列に RSpec を実行できる 分散テスト実行システム •実行するマシンはスポットインスタンスを使い 自動でスケールされる •スポットインスタンスが途中で落ちたときのための リトライ機構なども備えている
None
時は流れ •高性能なスペックのマシンが安価になってきた •SpotFleet などの環境も整ってきた •コードもがんばって減らしてる •RRRSpec なくしてもいけるんじゃない?
やってみた •c5.2xlarge 8並列: 約22分 •c5.4xlarge 16並列: 約11分 •c5.9xlarge 32並列: 約7分
‼いける‼
というわけで RRRSpec 引退 •c5.9xlarge(スポットインスタンス)で36並列で実行 •並列実行には parallel_tests を利用 •開発環境でのテスト実行は pull-request Builder
で代替 •安定化のために rspec-retry を利用
None
hako化
現在のデプロイ •sorah/mamiya ‣ serf を利用した高速でスケーラブルなデプロイツール ‣ CI 中にパッケージ作成や配布などの処理を行う ‣ CI
が通って開発者がデプロイを実行したときは切り替えを行うのみ
•Dockerの登場によりデプロイのフローは大きく変わった •クックパッドでもほぼすべてのアプリケーションが Docker/ECSで動いている 昨今のデプロイ
None
hako •Dockerコンテナのデプロイツール ‣ 現在は ECS のみに対応 •クックパッドではほとんどのアプリケーションが hako でデプロイされている •ただしレシピサービスを除く
hakoに乗ると • 統合された管理コンソールが使える • Dockerを利用したバッチジョブの実行ができる • 用意されている様々なサイドカーコンテナが利用できる • などなど、他にも便利な機能に乗っかれる ‣
逆にいうとhakoに乗らないとこれらを独自で作る必要がある
hako化への道のり •symlink が大量にあって docker build がつらい ‣ rsync --copy-links で乗り切る
•Spreadsheetで管理されていた秘匿値の移行 ‣ がんばって Parameter Store に移行 •古の fluentd の設定を読み解く •一部のサーバーでcronが動いてたりする
進捗 •バッチが一部 hako で動くようになった •API サーバーがもうすぐ動きそう •今年中には全アプリケーション移行予定
まとめ
None
次回予告 (3/23 Railsdm) •システム分離 •機能削除 •コード削減
We are hiring!