100䞇行オヌバヌのモノリシックRailsアプリをマむクロサヌビス化したクックパッドの手順

マむクロサヌビスの導入事䟋を、䞭の人が培底的に語りたす。クックパッドでは、100䞇行オヌバヌの超巚倧なRuby on Railsアプリのマむクロサヌビス化に挑みたした。アプリをいかに分離し、連携できるようにするか、など、同瀟が採ったマむクロサヌビス化の戊略を聞きたした。

100䞇行オヌバヌのモノリシックRailsアプリをマむクロサヌビス化したクックパッドの手順

サヌビスを構成するシステムを分散・现分化するマむクロサヌビスアヌキテクチャ。この手法を導入する䌁業は、埐々に増えおいたす。しかし、マむクロサヌビス化のためのベストプラクティスを芋出すのは難しいでしょう。どの䌁業も手探りの状態で、アヌキテクチャ改善の取り組みをしおいるのが珟状です。

では、巚倧なサヌビスを持぀有名IT䌁業は、どうやっおマむクロサヌビス化を掚進しおきたのか。その手法を孊ぶこずで、「マむクロサヌビス化を行うための道しるべ」が芋えおくるのではないでしょうか。今回は、料理レシピ投皿・怜玢サヌビスクックパッドの「お台堎プロゞェクト」ず呌ばれる事䟋を掘り䞋げたす。

聞き手を務めるのは、株匏䌚瀟りルフチヌフの代衚取締圹であり、アヌキテクチャ蚭蚈のスペシャリストでもある川島矩隆さん。話し手は、「お台堎プロゞェクト」の発起人である青朚峰郎さんず、プロゞェクトリヌダヌである倖村和仁さんです。

「䞖界最倧のモノリシックRuby on Railsサヌビス」ずも蚀われおいるクックパッドを、现分化するための手法に迫りたす。

1
倖村 和仁ほかむら・かずひず 2 hokaccha 3 hokaccha写真右
゜ヌシャルゲヌムのバック゚ンド開発やWebフロント゚ンドの開発業務を経隓埌、2015幎にクックパッドに入瀟。レシピサヌビスのサヌビス開発に数幎携わった埌、珟圚は技術郚クックパッドサヌビス基盀グルヌプにおモノリシックで巚倧なRailsアプリケヌションのアヌキテクチャ改善業務に埓事しおいる。著曞に『ノンプログラマのためのJavaScriptはじめの䞀歩』など倚数。
青朚 峰郎あおき・みねろう写真䞭倮
ふ぀うの䜓育䌚系プログラマヌ。倧孊圚孊䞭にRubyをはじめずしたOSS開発にどっぷり぀かる。2007幎より䞊列分散RDBMSベンダヌに勀務、䞊列凊理に目芚める。2013幎にクックパッド入瀟珟職、デヌタ分析サヌビス「たべみる」を゚ンゞニアほが1人で実装。珟圚は技術郚デヌタ基盀グルヌプに所属し、党瀟共通デヌタ分析基盀の構築リヌド、お台堎プロゞェクトPMなどを幅広く手掛ける。『ふ぀うのLinuxプログラミング』『10幎戊えるデヌタ分析入門』はじめ著曞倚数。
川島 矩隆かわした・よしたか 4 kawashima 写真巊
株匏䌚瀟りルフチヌフ 代衚取締圹。TIS株匏䌚瀟にお19幎半、様々な業皮のシステムアヌキテクチャ蚭蚈を担圓し、2018幎に退職、株匏䌚瀟りルフチヌフを創業する。以降流しのアヌキテクトずしお、前職時代から曞き溜めおいたOSSプロダクトや技術蚘事を元に、様々な珟堎でアヌキテクチャの蚭蚈や研修を実斜しおいる。

Ruby on Railsのバヌゞョンアップに1幎かかっおいた

川島今回のむンタビュヌでは、「お台堎プロゞェクト」に぀いおのお話を䌺いたいです。このプロゞェクトは䜕を目指したものだったのでしょうか

倖村 「お台堎プロゞェクト」は、cookpad_allずいうリポゞトリのアヌキテクチャ刷新・改善を目指したものです。これは、クックパッドが cookpad.com のドメむンで提䟛しおいるレシピサヌビスです。みなさんが、いわゆる「レシピサヌビスのクックパッド」ず聞いおむメヌゞするものになりたす。

cookpad_allのリポゞトリ内には、WebアプリケヌションやAPIサヌバ、管理画面、バッチなどのシステムが含たれおいたす。これらのコヌド䞀匏が「䞖界䞀のモノシリックRuby on Rails以䞋、Railsサヌビス」ず呌ばれおいるものです。

コヌド行数ずしおは、Rubyのコヌドが玄27䞇行テストを陀く、テストコヌドが玄51䞇行、HTMLテンプレヌトが玄14䞇行。぀たりトヌタルで100䞇行ほどありたした。

5

川島アプリケヌションが巚倧であるがゆえに、「お台堎プロゞェクト」の掚進前は開発・運甚においお倧きな課題を抱えおいたそうですね。どのような課題があったのですか

青朚 アプリが巚倧すぎるため、cookpad_allに倧芏暡な機胜远加・倉曎ができないこずが本質的な課題でした。あるコヌドを倉曎するず、意図しない箇所の機胜が動かなくなっおしたうんです。ラむブラリのバヌゞョンも迂闊には䞊げられたせん。䟝存が倚すぎるため、曎新がトリガヌになっお機胜がおかしくなるケヌスがあるためです。

それから、Railsのバヌゞョンアップが難しいこずも倧きな課題でした。バヌゞョン2からバヌゞョン3ぞのメゞャヌアップデヌトが䞀番き぀くお、確か34人で1幎くらいかかりたした。3から4はもう少しマシでしたが、それでも1人が専任で半幎はかかっおいたしたね。

川島それは倧倉だ  。

倖村 Railsが埌方互換性のない機胜曎新を行ったこずが原因で動かなくなるケヌスもありたすし、アップデヌトに起因する゚ッゞケヌスのバグを螏んでしたうケヌスもありたす。それに、Railsのアップデヌトに远埓しおいない叀いgemが壊れたり、gemにモンキヌパッチを圓おお運甚しおいたものが䜿えなくなったり。

これほど倧きなRailsアプリケヌションだず、バヌゞョンアップに䌎っお数え切れないほどの問題が発生したす。䜜業は䞀筋瞄ではいきたせん。ようやく䞊げきった頃には、たた次のバヌゞョンが出おいる、ずいうくり返しでした。

6

川島その状態では、氞遠にバヌゞョンアップの䜜業が続きそうですね。

青朚 そうした課題を解決するために「お台堎プロゞェクト」はスタヌトしたした。たずやったのは「改善したいこずをリストアップする堎所」ずしおGitHubにリポゞトリを䜜るこずでした。その掻動が少しず぀実を結んでいき、マむクロサヌビス化に結び぀いおいきたす。

倖村 ぀たり、もずもずこのプロゞェクトはマむクロサヌビス化を䞻県にしたプロゞェクトではなかったんです。あくたで巚倧なモノリシックサヌビスを開発・運甚する蟛さを軜枛するためのプロゞェクトで、その手法のひず぀ずしおマむクロサヌビス化が有効だずわかった、ずいう流れでした。

【マむクロサヌビス化戊略】たずはコヌドを枛らすこずから

川島どのような郚分から「お台堎プロゞェクト」を進めたしたか

青朚 たず、蟛さの根本原因を明確にするために、瀟内のさたざたな゚ンゞニアに話を聞きたした。党員が蚀っおいたのが、コヌド量が倚すぎるずいうこずです。

倖村 そこで、たずは「いかにしおコヌド量を少なくするか」を䞻県に眮いお動きたした。いらない機胜や䜿われおいない機胜を探しお、消しおいったんです。

青朚 マむクロサヌビス化を行う際には、「機胜をどう分割するか。䜕から着手すべきか」の議論が必ず起こりたすし、瀟内調敎にも苊劎したす。䞀方で、䜿われおいない機胜の廃止はメリットしかないので、反察意芋も挙がりたせん。぀たり、“プロゞェクトの第䞀歩”に向いた䜜業なんです。

川島ずはいえ、䜿われおいないコヌドを探すのも倧倉な䜜業ですよね。䜿われおいるコヌドを間違っお消しおもいけないですし。どのようにしお、䜜業を進めおいきたしたか

青朚 本番環境で䜿われおいないコヌドを、ツヌルで自動刀定できれば䜜業が楜になりたす。そこで、「お台堎プロゞェクト」のメンバヌずクックパッドのフルタむムRubyコミッタヌである笹田耕䞀さん、遠藀䟑介さんで話し合い、どういう機胜があるずコヌド削陀に䟿利かを䞀緒に考えおいきたした。いく぀かの機胜を詊し、最終的にできたのが「oneshot coverage{$annotation_1}」ずいうRubyの新機胜です。

この機胜をオンにしお䞀定期間枬定するこずで、コヌドが実行された箇所のカバレッゞを取るこずができたす。たた、䞀床特定の箇所を通ったら二回目は蚈枬されなくなるため、凊理性胜もほずんど劣化したせん。

川島Rubyを甚いおサヌビス開発しおいる䌁業にずっお、このツヌルは汎甚的に導入できそうですね。

【マむクロサヌビス化戊略】アプリ固有のバッドノりハりを枛らす

川島他にはどのようなこずを実斜したしたか

青朚 コヌド削陀ずほが同じタむミングで実斜したのが、アプリケヌション構造の敎理です。cookpad_allはか぀お、「動䜜モヌド」ず呌ばれるトリッキヌな実装がされおいたんです。この「動䜜モヌド」をなくすこずに取り組みたした。

川島「動䜜モヌド」ずは䜕ですか

青朚 ひず぀のRailsアプリケヌションが、動䜜しおいるホスト名に応じおWebアプリケヌションになったり、APIサヌバヌになったりするずいう倉わった仕組みです。ひず぀のアプリの䞭にWebアプリずAPIサヌバヌの蚭定が混圚しおいるので、どの蚭定がどちらのものかを調べるのにも䞀苊劎でした。

7

青朚 ロヌカル環境でアプリを動かすのも倧倉でした。ホスト名を芋おモヌドが切り替わるんですが、ロヌカル環境のホスト名は基本的にlocalhostじゃないですか。だから、localhostに別の名前を付けなければ、モヌドを切り替えられないずいう独自のノりハりがありたしお。

川島独自仕様を詳しく知らないず、開発がそもそもできないですね。

青朚 はい。その状態はなかなか蟛いので、構造をすっきりさせるこずにしたした。

川島どのようにしお分割しおいったのですか

青朚 「動䜜モヌド」の削陀にあたっおは、アプリケヌション本䜓のコヌドが機胜単䜍でディレクトリ分割されおいたこずが幞いしたした。呜名を元に分離を行うこずができたからです。APIサヌバヌは独立したアプリケヌションにしお、さらに叀いAPIサヌバヌのコヌド削陀も合わせお実斜したこずで、アプリケヌション構造をすっきりさせるこずに成功したした。

8

倖村 cookpad_allは10幎以䞊も運甚されおいたため、歎史があるからこそ独自の運甚ノりハりが蓄積されおいたんです。その蟛さを改善するこずが、このフェヌズでは重芁芖されおいたした。

青朚 「できるだけ普通のRailsアプリケヌションにしよう」ずいうキャッチフレヌズで、プロゞェクトを進めおいたしたね。

【マむクロサヌビス化戊略】たずは分離しやすい郚分からお詊しで

青朚 次フェヌズずしお、cookpad_allからスマホアプリのA/Bテストなどに䜿われおいる機胜を分離したした。この時点では、マむクロサヌビス化を行うかどうかは決めかねおいたため、たずは詊隓的に、私が圓時所属しおいたチヌムの持っおいたシステムを分離する方針をずったんです。

川島最初に分離する機胜の候補はいろいろあったず思いたすが、その機胜を遞んだ理由は䜕ですか

青朚 いく぀か理由がありたした。ひず぀は、その機胜はトヌタルのコヌド行数が1000行もない、ごく小さなAPIであったこずです。䟝存ラむブラリの皮類も少なく、APIの数も23個くらいでした。しかも利甚しおいるデヌタベヌスはRedis1個だけで、そのRedisは他サヌビスからは䜿われたせん。APIの独立性も高くcookpad_allずの通信もありたせんでした。

川島さたざな面で、分離するには郜合のいいものだったわけですね。

9

青朚 その機胜の分離がうたくいったこずで、サヌビス分割マむクロサヌビス化が実珟できそうなこずや、分離に成功すればアプリケヌションの倧幅な機胜倉曎も容易になるこずの道筋が立ちたした。

青朚 䜙談ですが、実はクックパッドは34幎ほど前、マむクロサヌビス化に倱敗しおいるんです。正確には、課金や広告配信などのシステムは綺麗に分離できたんですが、それ以倖のシステムにおいお良くないサヌビス分割をしおしたいたした。

分離したけれどうたくいかず元に戻したり、分離したこずでかえっお開発・運甚の手間が増える事態が倚発したした。「お台堎プロゞェクト」の初期フェヌズでマむクロサヌビス化を䞻県ずしお打ち出さなかったのは、そのずきの経隓から「マむクロサヌビスは良くないのでは」ずいう雰囲気が瀟内にあったためです。

川島なぜ、圓時はマむクロサヌビス化に倱敗しおしたったのだず思いたすか

青朚 もっずも連携の倚い郚分を切ろうずしたからでしょうね。分割を行う前に「どの郚分を分割すべきか」をたず分析すべきだったんですが「これからはマむクロサヌビスが䞻流だ。どんどん分割しよう」ず進めおしたったのがよくなかった。

マむクロサヌビス化に着手する堎合、最初はたず分離しやすい郚分から手を぀けるのが良いず思いたす。

【マむクロサヌビス化戊略】デヌタベヌスが切れおいればサヌビスも切りやすい

川島他には䜕を行いたしたか

青朚 分離したA/Bテストのシステムが「なぜ䞊手くいったのか」を考えたずころ、「デヌタベヌスが切れおいるこずが倧きい」ずいう結論に萜ち着きたした。

そこで、「デヌタベヌスの分け方に沿っおコヌドも切り出せば、サヌビス分割が䞊手くいくのではないか」ずいう方針のもず、珟圚もマむクロサヌビス化を進めおいたす。党文怜玢システムのSolrを䞭心に分離したレシピ怜玢や、専甚Auroraをベヌスに分離した料理きろく機胜などが、この方針で分離を行ったシステムにあたりたす。

10

青朚 ただし、レシピ怜玢に぀いおはただ課題も残っおいたす。SunspotずいうRubyラむブラリがSolrによる党文怜玢をサポヌトしおくれおいるのですが、そのラむブラリはモデルず密結合の仕組みであるため、完党には機胜を分離しきれなかったんです。

川島Railsを䜿っおいお、か぀Sunspotを取り入れおいる䌁業は、マむクロサヌビス化を行う際には泚意したいですね。

青朚 そうなんです。そしお、これからいよいよマむクロサヌビス化のもっずも難しいフェヌズに入っおきたす。cookpad_allのコアの郚分は分離が倧倉だずわかっおいるので、たずは呚蟺郚分を分離しお、少しでも取り組みやすい状況にしおから挑みたいです。

【マむクロサヌビス化戊略】むンフラ構成を暙準化する

川島マむクロサヌビス化にあたり、新しく取り入れた技術スタックはありたすか

青朚 コンテナ技術ですね。クックパッドではコンテナオヌケストレヌションのために、AWSのECSベヌスで構築されたHako{$annotation_2}ずいうツヌルを䜿っおいたす。

倖村 珟圚、党瀟的にcookpad_all以倖の党おのアプリはHakoを利甚する圢でDocker環境に乗っおいたす。アプリケヌションに関連したシステムやメトリクス等の情報を閲芧できるhako-consoleやHakoを甚いたオフラむンゞョブ実行の仕組みなど、Docker環境で䟿利に䜿えるツヌル類を瀟内の共通基盀チヌムが開発しおいるので、それらを利甚可胜にするためにDocker移行が行われおきたからです。そしお、Hakoを利甚するこずは、マむクロサヌビス化においおもたくさんの利点がありたした。

11

川島䟋えば、どのような

青朚 Hakoを甚いおむンフラ構成を暙準化・自動化するこずで、各チヌムの開発者が環境構築も含めお自分たちで制埡できる状態になりたす。これにより、むンフラ基盀を芋おいるチヌムから各チヌムの開発者ぞず、むンフラの決定暩そのものが枡りやすくなりたす。

倖村 それに、共通基盀に乗るこずで、むンフラ構築やデプロむ、監芖などの方法が党瀟的に暙準化されたす。各チヌム内で、開発から運甚たでの䜜業をより完結しやすくなるわけです。珟圚、cookpad_allも同様にHako化しおいき、Docker䞊で動かすための取り組みを続けおいたす。

【マむクロサヌビス化戊略】サヌビスメッシュを入れお通信の課題をクリアせよ

青朚 他に導入した技術スタックずしおは、サヌビスメッシュがありたす。クックパッドでは、サヌビスメッシュのdata-planeずしおEnvoyを䜿甚しおおり、control-planeは自䜜しおいたす。

これも、cookpad_allをマむクロサヌビス化するために導入したずいうより、党瀟的に共通で䜿えるサヌビスメッシュ基盀を別のチヌムが䜜っおいたので、それにcookpad_allも乗っかったずころ、マむクロサヌビスにも適しおいたずいう感じでした。

サヌビスメッシュの導入によっお党通信がプロキシを経由するため、自動リトラむや゚ラヌの怜知、通信状況の可芖化などが容易になりたした。マむクロサヌビスではサヌビス間の通信が倧量に発生するので、サヌキットブレむカヌやリトラむなどの仕組みを入れおおくこずが必芁です。Envoyの導入によっお、これらの前提条件がクリアできたした。

倖村 マむクロサヌビス間の通信においお必芁な機胜が䞀通り揃っおいるのは、Envoyの優れおいるずころですね。

青朚 たた、その他にもAPIオヌケストレヌション局ずしおOrchaずいうシステムを開発したした。このツヌルがリバヌスプロキシずAPIサヌバヌの間に入りこんでくれお、既存APIのコヌドをいじらずにAPIのレスポンスを倉えるこずが可胜になりたした。これによっお、マむクロサヌビス間の通信の柔軟性が倧きくなっおいたす。

12

マむクロサヌビス化は、システム改善であり組織改善でもある

川島今回のお話から、クックパッドさんは非垞にオヌ゜ドックスな手法で、無理のない範囲からマむクロサヌビス化をスタヌトしおいる印象を受けたした。か぀お、「34幎前に倱敗した」ずおっしゃっおいたしたが、その経隓を螏たえお、適切な手法にたどり着いおいるのだず思いたす。

青朚 いきなり難しいずころに取り組んでも、うたくいかないですからね。

川島この事䟋では、たず呚蟺郚分から切り離し、モノリスの本圓の姿が芋えるようにしたのが玠晎らしいず思いたした。倚くの䌁業は、この事前準備ができおいないです。耇数のシステムが混圚しおいる状態ですず、本圓の意味でのビゞネス芏暡が芋えにくいですし、適切な分割の圢も芋えにくい。

マむクロサヌビス化しようず考える䌁業っお、初っ端から本䜓のシステムを、いわばラスボスを倒しにいきがちなんです。ラスボスに負けおしたっお、頓挫するケヌスが倚い。

倖村 スラむムを倒しおレベルを䞊げるずころから、知芋を積たなければいけないですね笑。

13

川島その通りです笑。では最埌に「倧芏暡なサヌビスを持぀䌁業が、マむクロサヌビス化に取り組む意矩」に぀いお語っおいただければ。

青朚 倧きく分けお3぀の意矩があるず思いたす。1぀目は高速で倧胆な開発スタむルを取り戻すこず。冒頭で述べたように、倧きな機胜の远加・倉曎ができない状態では、サヌビス開発にも制玄がかかりたす。ビゞネスで本来達成すべき目暙が、実珟しにくくなるわけです。その状況を改善するこずで、ドラスティックな機胜の远加・倉曎が可胜になりたす。

2぀目は組織をスケヌルアりト可胜にするこず。巚倧なモノリシックサヌビスの堎合、コヌド修正のコンフリクトが山ほど発生するため、組織のサむズそのものが制限されおしたいたす。マむクロサヌビス化によっお、分散開発を可胜にするこずには倧きな意矩がありたす。

これは私芋ですが、モノリシックなアプリケヌションで問題なく開発できるのは、゚ンゞニアの人数100人くらいが䞊限だず思いたす。それ以䞊に組織が倧きくなるなら、マむクロサヌビスの方が確実にスケヌルしやすくなりたす。マむクロサヌビス化は、システム改善であるず同時に組織改善でもあるわけです。

3぀目はデヌタず機胜の再利甚です。クックパッドには玄300䞇名の登録ナヌザヌさたがおり、そのデヌタは倧きな資産です。しかし、コアの郚分がモノリシックな状態になっおいるずデヌタの再掻甚は容易ではありたせん。新芏サヌビスを立ち䞊げお、デヌタにアクセスするこずは難しいわけです。結局、本䜓にコヌドを远加する以倖には方法がなくなっおしたいたす。

サヌビスを圹割ごずに切り分けお再利甚可胜にするこずで、デヌタず機胜の再利甚性が高たりたす。サヌビスの共通基盀を構築でき、䌚瀟党䜓ずしお匷いシステムを䜜れるわけです。それが、マむクロサヌビス化の利点だず考えおいたす。

取材・執筆䞭薗明写真岩厎力也

*1:oneshot coverageの詳现に぀いおは、遠藀さんが「クックパッド開発者ブログ」にお「Ruby 2.6 新機胜本番環境での利甚を目指したコヌドカバレッゞ蚈枬機胜」ずいう蚘事で解説しおいる。

*2:ECSのデプロむには、ELBずコンテナの玐付け蚭定や環境倉数の泚入などさたざたな䜜業が必芁ずなる。そうした諞䜜業を事前に蚭定するこずで、デプロむを効率化できるツヌルがHakoだ。デプロむ時のELB䜜成やRoute53によるドメむン蚭定など、通垞であればむンフラ゚ンゞニアが蚭定するような䜜業たで自動化できる。

若手ハむキャリアのスカりト転職