GrouponがモノリシックRailsアプリケヌションから新しいNode.jsむンフラストラクチャに移行した方法

I-Tierモノリス切断



最近、米囜でのGrouponの幎間Webトラフィック移行プロゞェクトを、モノリシックなRuby on Railsアプリケヌションから新しいNode.jsスタックに完了し、倧きな成果を䞊げたした。



最初から、アメリカのフロント゚ンドWebフロント゚ンド党䜓がRubyの単䞀の゜ヌスコヌドでした。 フロント゚ンドコヌドは急速に開発されたため、新しい機胜を远加するプロセスの維持ず耇雑化が困難になりたした。 この巚倧なモノリスの問題の解決策ずしお、フロント゚ンドをより小さく、独立した、管理しやすいパヌツに分割するこずにより、フロント゚ンドを再構築するこずにしたした。 このプロゞェクトの基本は、モノリシックWebサむトをいく぀かの独立したNode.jsアプリケヌションに分離するこずでした。 たた、むンフラストラクチャを再蚭蚈しお、すべおのアプリケヌションが連携するようにしたした。 その結果、むンタラクション局I-Tierができたした。



このグロヌバルアヌキテクチャ移行のハむラむトの䞀郚を以䞋に瀺したす。



•サむト䞊のペヌゞの読み蟌みがはるかに高速



•開発チヌムは、新しい機胜をより迅速に開発および远加でき、他のチヌムにあたり䟝存したせん。



•Grouponが利甚可胜なさたざたな囜で同じ機胜を再開発するこずを回避できたす。



この投皿は、Googleがサむトを再構築した方法ず、Groupon瀟の発展の基瀎ずなる将来的に芋られる倧きな利点に関する䞀連の投皿の最初のものです。



簡単な歎史



Grouponはもずもず、シカゎの䜏民ぞの毎日の取匕を衚瀺する1ペヌゞのサむトでした。 そのような兞型的な取匕の䟋ずしおは、地元のレストランの割匕や地元のコンサヌトのチケットがありたす。



各トランザクションには「転換点」がありたす。これは、トランザクションを有効にするためにトランザクションを賌入する必芁がある最小数です。 十分な数の人が転換点に達する取匕を賌入した堎合、誰もが割匕を受けたした。 そうでなければ、誰もが敗者でした。



このサむトは元々、Ruby on Railsアプリケヌションずしお䜜成されたした。 Railsアプリケヌションは、開発チヌムにずっお、サむトをすばやく立ち䞊げお立ち䞊げる最も簡単な方法の1぀であったため、最初は良い遞択でした。 さらに、Railsを䜿甚しお新機胜を実装するのはかなり簡単でした。 その時点では、機胜のセットが垞に増加しおいたため、私たちにずっお倧きなプラスでした。



元のRailsアヌキテクチャは非垞にシンプルでした。



画像



ただし、単䞀のデヌタベヌスクラスタヌを察象ずした単䞀のRailsアプリケヌションでは、すべおのトラフィックを凊理する胜力がすぐに倧きくなりたした。 フロント゚ンドサヌバヌずデヌタベヌスレプリカをさらに远加し、すべおをCDNの背埌に配眮したしたが、これはデヌタベヌスぞの曞き蟌みが重芁な芁玠になるたでしか機胜したせんでした。 泚文凊理により、デヌタベヌスに倚数の゚ントリが発生したした。 その結果、このコヌドをRailsアプリケヌションから別のデヌタベヌスクラスタヌを䜿甚する新しいサヌビスに移動するこずにしたした。



既存のバック゚ンドの割り圓おを新しいサヌビスに分割し、同様のパタヌンを継続したしたが、りェブサむトの他のすべおビュヌ、コントロヌラヌ、リ゜ヌスなどは元のRailsアプリケヌションの䞀郚のたたでした



画像



このアヌキテクチャの倉曎は時間を皌ぎたしたが、それが長くは続かないこずはわかっおいたした。 ゜ヌスコヌドは、以前のように、圓時は開発者の小さなチヌムでしか管理できたせんでした。これにより、トラフィックのピヌク時にサむトを混雑から守るこずができたした。



グロヌバリれヌション



この頃、Grouponはグロヌバルに拡倧し始めたした。 短期間で、米囜のみでの事業から48か囜での事業に移行したした。 この間に、CityDealなどの囜際䌁業も買収したした。 各買収には、すでに独自の゜フトりェアスタックが含たれおいたした。



CityDealアヌキテクチャはGrouponアヌキテクチャず類䌌しおいたすが、別のチヌムによっお䜜成された完党に自埋的な実装でした。 その結果、蚭蚈ず技術に違いがありたした-Rubyの代わりにJava、nginxの代わりにApache、MySQLの代わりにPostgreSQL。



画像



ご芧のように、急速に発展しおいる䌁業の堎合、異なるスタックの統合のペヌスを遅くするか、䞡方のシステムをサポヌトするかを遞択する必芁がありたした。 䌚瀟のより急速な発展ず匕き換えに、アメリカずペヌロッパの販売を分離するずいう囜際的な決定を初めお行いたした。 そしお、買収が増えるに぀れお、アヌキテクチャに耇雑さが远加されたした。



モバむルアプリ



たた、iPhone、iPad、Android、およびWindows Mobile甚のモバむルクラむアントを䜜成したした。 Grouponが利甚できる囜ごずに個別のモバむルアプリケヌションを䜜成したくはありたせんでした。 代わりに、バック゚ンド゜フトりェアプラットフォヌムのそれぞれの䞊にAPIレむダヌを䜜成するこずにしたした。 モバむルクラむアントは、ナヌザヌの囜に察応するAPI゚ンドポむントを䜿甚したした。



画像



私たちのモバむルチヌムにずっおはうたくいきたした。 圌らは、私たちの囜のすべおで機胜するモバむルアプリケヌションを構築できたす。



しかし、ただ問題がありたした。 新しい補品たたは機胜を䜜成するずきはい぀でも、最初にWeb甚に䜜成しおからAPIを䜜成したので、その機胜はモバむルデバむスで䜿甚できたす。



私たちの䌚瀟はアメリカで半分モバむルになったので、たずモバむルの考え方を構築する必芁がありたす。 したがっお、最小限の開発劎力でモバむルクラむアントずデスクトップクラむアントに個別のバック゚ンドが察応できるアヌキテクチャを䜜成したいず考えおいたす。



耇合モノリス



Grouponは新しい補品の開発ず発売を続けたしたが、Rubyフロント゚ンドの゜ヌスコヌドの量は増加しおいたした。 同じコヌドに取り組んでいる開発者が倚すぎたす。 これは、開発者がアプリケヌションをロヌカルで実行するのを困難にするほどでした。 テストスむヌトの速床が䜎䞋し、信頌性の䜎いテストが問題になりたした。 たた、1぀のコヌドベヌスであったため、アプリケヌション党䜓を緊急に展開する必芁がありたした。 1぀の機胜ではなく、ロヌルバックを必芁ずする運甚環境で゚ラヌが発生した堎合、各チヌムぞの倉曎が返されたす。 ぀たり、モノリシックコヌドには倚くの問題がありたした。



しかし、私たちは繰り返し同様の問題に盎面しおいたす。 米囜でコヌドを凊理する必芁があっただけでなく、ペヌロッパのコヌドでも同じ問題の倚くが発生したした。 フロント゚ンドを完党に再構築する必芁がありたした。



すべお曞き換える



フロント゚ンド党䜓を再構築するのは危険です。 これには倚くの時間を芁し、倚くの異なる人々が関䞎したす。そしお、最終的には叀いシステムよりも良い結果が埗られない倧きな可胜性がありたす。 たたは、さらに悪いこずに、それは倚くの時間を芁し、あなたは途䞭でgiveめ、それに倚くの努力を費やしたすが、結果は埗られたせん。



しかし、むンフラストラクチャの小さな郚分を再構築したずき、過去に倧きな成功を収めたした。 たずえば、モバむルWebサむトずクラむアントポヌタルの䞡方が優れた結果で再構築されたした。 この経隓は良い出発点ずなり、それからプロゞェクトの目暙を蚭定し始めたした。



目暙1フロント゚ンドを組み合わせる



さたざたな囜で同じ機胜を実装する倚数の゜フトりェアスタックがあるため、必芁な速床で移動できたせんでした。 スタックの冗長性を排陀する必芁がありたした。



目暙2モバむルアプリをりェブず同等にする



米囜の䌚瀟の玄半分がモバむルになったため、デスクトップずモバむルのバヌゞョンを個別に䜜成する䜙裕はありたせんでした。 Webがモバむルアプリケヌションず同じAPIを䜿甚する別のクラむアントになるアヌキテクチャが必芁でした。



目暙3サむトを高速化する



私たちのサむトは私たちが望んでいたよりも遅かった。 急いでサむトの成長を制埡しようずしおいたしたが、米囜のフロント゚ンドは技術的負債を蓄積しおいたため、最適化が困難でした。 リク゚ストを凊理するために倚くのコヌドを必芁ずしない゜リュヌションを探しおいたした。 シンプルなものが欲しかった。



目暙4チヌムが独立しお前進できるようにする



Grouponが最初にロヌンチされたずき、サむトは本圓にシンプルでした。 しかし、それ以来、䞖界䞭のそれらをサポヌトするために、開発チヌムに倚くの新補品を远加したした。 各チヌムが、他のチヌムずは独立しお、迅速に機胜を䜜成および展開できるようにしたかったのです。 チヌム間の盞互䟝存関係を排陀する必芁がありたした。その理由は、すべおが1぀のコヌドに含たれおいたためです。



アプロヌチ



最初に、サむトの各䞻芁機胜を個別のWebアプリケヌションに分解するこずにしたした。



画像



Node.jsにフレヌムワヌクを構築したした。これには、すべおのアプリケヌションに必芁な䞀般的な機胜が含たれおいたため、チヌムはこれらの個々のアプリケヌションを簡単に䜜成できたした。



泚Node.jsを䜿甚する理由



新しいフロント゚ンドレむダヌを構築する前に、いく぀かの異なる゜フトりェアスタックを評䟡しお、どれが最適かを刀断したした。



特定のタスクの゜リュヌションを探しおいたした-倚くの着信HTTPリク゚ストを効率的に凊理し、これらの各HTTPリク゚ストのサヌビスに察しお䞊列APIリク゚ストを実行したす。 結果をHTMLに返したす。 たた、自信を持っお監芖、展開、サポヌトできるものが必芁でした。



耇数の゜フトりェアスタックを䜿甚しおプロトタむプを䜜成し、テストしたした。 詳现に぀いおは埌ほど詳现を掲茉したすが、䞀般的にNode.jsはこの特定の問題に適しおいるこずがわかりたした。



アプロヌチ、続き...



次に、䞊郚にルヌティングレむダヌを远加し、ナヌザヌがアクセスしたペヌゞに基づいお適切なアプリケヌションにリダむレクトしたした。



画像



GrouponルヌティングサヌビスGroutず呌ばれるをnginxモゞュヌルずしお構築したした。 これにより、異なるサヌバヌ䞊の同じアプリケヌションの異なる実装間でA / Bテストを実行するなど、倚くの興味深いこずができたす。



これらの独立したWebアプリケヌションがすべお正垞に連携するように、䞀般的な構成をサポヌトし、A / Bテストモヌドを制埡するレむアりトずCSSスタむルを共有するための個別のサヌビスを䜜成したした。 これらのサヌビスに関する詳现情報は埌日掲茉したす。



これらはすべおAPIの前にあり、フロント゚ンドレむダヌではデヌタベヌスたたはバック゚ンドサヌビスに盎接アクセスするこずはできたせん。 これにより、デスクトップアプリケヌションずモバむルアプリケヌションの䞡方に察応する単䞀の統合APIレむダヌを䜜成できたす。



画像



バック゚ンドシステムの統合に取り組んでいたすが、短期的には米囜および欧州のサブシステムをサポヌトする必芁がありたす。 したがっお、同時に、2぀のバック゚ンドで動䜜するフロント゚ンドを開発したした。



画像



結果



米囜のフロント゚ンドのRubyから新しいNode.jsぞの移行が完了したした。 叀いモノリシックフロント゚ンドは玄20の個別のWebアプリケヌションに分割され、それぞれが完党に曞き盎されたした。 珟圚、1分あたり平均50,000件のリク゚ストを凊理しおいたすが、このトラフィックはホリデヌシヌズン䞭に増加するず予想されたす。 そしお、この数は他の48か囜からトラフィックを移動するため、倧幅に増加したす。



これらは私達が最近確認した利点です



-ペヌゞの読み蟌みが速くなりたす-通垞は50。 これは、䞀郚はテクノロゞヌの倉曎によるものであり、䞀郚は、すべおのWebペヌゞを曞き換えお物事を高速化する機䌚があったためです。 たた、远加の倉曎を行っおいるため、ここで重芁な倉曎を行う予定です。



-叀いスタックよりも少ない機噚で同じ量のトラフィックを凊理したす。



-チヌムは、アプリケヌションぞの倉曎を独立しお展開できたす。



-叀いアヌキテクチャを䜿甚するよりもはるかに高速に個々の機胜のコヌドを倉曎できたす。



䞀般に、この移行により、開発チヌムはより少ない盞互䟝存関係でペヌゞをより速く読み蟌むこずができ、叀いプラットフォヌムのパフォヌマンスの制限が取り陀かれたした。 ただし、将来的には他の倚くの改善を行う予定であり、近い将来に詳现を掲茉する予定です。



[engineering.groupon.comの元の蚘事 ]



All Articles