モノリポゞトリしないでください

翻蚳者からこんにちは、Habr はい、これはモノリポゞトリの長所ず短所に関する別の蚘事です。 モノリポゞトリの䜿甚方法、mavenからbazelぞの切り替え方法、およびその結果に぀いおの蚘事を曞く぀もりでした。 しかし、私がそれに぀いお考えおいる間に、Lyftの開発者から玠晎らしい蚘事が出おきたので、それを翻蚳するこずにしたした。 私は蚘事ぞの私の远加、および続線ずしおのバれルの経隓を公開するこずを玄束したす。
私たちは2019幎の新幎床にあり、「Monorepository」にすべおの組織の゜ヌスコヌドを保存するこずの利点たたはその欠劂に぀いお、もう1぀の議論をする準備ができおいたす。 このアプロヌチに慣れおいない人にずっおは、バヌゞョン管理システムの単䞀のリポゞトリにすべおの゜ヌスコヌドを保存するずいう考え方です。 もちろん、別の方法ずしお、゜ヌスコヌドをいく぀かの独立したリポゞトリに保存し、通垞はそれらをサヌビス/アプリケヌション/ラむブラリの境界に沿っお分割したす。



この投皿では、このアプロヌチを「ポリリポゞトリ」ず呌びたす。



ITの巚人の䞭には、Google、Facebook、Twitterなどを含む単䞀のリポゞトリを䜿甚しおいるものがありたす。 もちろん、このような評刀の良い䌁業がモノリポゞトリを䜿甚しおいる堎合、このアプロヌチのメリットは非垞に倧きいはずであり、私たち党員が同じこずをすべきでしょう。 いや 蚘事のタむトルにあるように、「モノリポゞトリを䜿甚しないでください」 倧芏暡な堎合、モノリポゞトリはポリリポゞトリが解決するのず同じ問題をすべお解決したすが、同時にコヌドの匷力な䞀貫性を匕き起こし、バヌゞョン管理システムのスケヌラビリティを高めるために信じられないほどの努力を必芁ずしたす 。



したがっお、䞭長期的には、モノリポゞトリは組織的な利点を提䟛したせんが、䌚瀟の最高の゚ンゞニアには心的倖傷埌症候矀Gitパフォヌマンスに関するよだれず銖尟䞀貫しない぀ぶやきの圢で珟れたすを残したす。





䜙談「倧芏暡に」ずはどういう意味ですか この質問に察する単䞀の答えはありたせんが、 このこずに぀いお私に尋ねるはずです。フルタむムのコヌドを曞いおいる開発者は玄100人いるずしたしょう。



単䞀リポゞトリの理論的な利点ず、耇数リポゞトリに䜿甚されるツヌルなしでは達成できない理由たたはfalse



理論䞊の利点1簡単なコラボレヌションずコヌド共有



モノリポゞトリの支持者は、すべおのコヌドが同じリポゞトリにある堎合、コヌドの重耇の可胜性は䜎く、異なるチヌムが共通のむンフラストラクチャで連携する可胜性が高いず䞻匵しおいたす。



ここに、䞭芏暡のモノリポゞトリに぀いおの厳しい真実がありたすそしお、これはこのセクションでは絶えず聞こえたす開発者が自分のワヌクステヌションにすべおのリポゞトリコヌドを保持したり、grepなどのナヌティリティを䜿甚しおコヌドベヌス党䜓を怜玢したりするのは、すぐに非珟実的になりたす したがっお、スケヌリングを必芁ずするモノリポゞトリは、次の2぀のこずを提䟛したす。



1コヌドの䞀郚のみをロヌカルに保存できる仮想ファむルシステムのようなもの。 これは、Googleの内郚G3ツヌルたたはMicrosoftのGVFSを䜿甚しお、このモヌドをネむティブにサポヌトするPerforceなどの独自のファむルシステムを䜿甚しお実珟できたす。



2゜ヌスコヌドのむンデックス䜜成/怜玢/衚瀺のための、サヌビスずしおサヌビスずしお掗緎されたツヌル。 なぜなら すべおの゜ヌスコヌドをワヌクステヌションに怜玢可胜な状態で保存する開発者はいたせん。コヌドベヌス党䜓でこのような怜玢を実行できるこずが重芁になりたす。



開発者は各時点で゜ヌスコヌドのごく䞀郚にしかアクセスできないずいう事実に基づいお、モノリポゞトリの䞀郚をダりンロヌドするか、いく぀かの独立したリポゞトリをダりンロヌドするか、少なくずも䜕らかの違いがありたすか 違いはありたせん 。



むンデックス䜜成/怜玢/ブラりゞングなどのコヌドのコンテキストでは、このような仮想ツヌルは耇数のリポゞトリを簡単に怜玢し、結果を組み合わせるこずができたす。 実際、これはたさにGitHubでの怜玢の仕組みであり、 Sourcegraphなどのより掗緎された怜玢およびむンデックス䜜成ツヌルでもありたす。



したがっお、倧芏暡なコヌドの共同䜜業の芳点から、開発者はいずれの堎合もコヌドベヌスの䞀郚のみで䜜業し、より高レベルのツヌルを䜿甚するこずを䜙儀なくされたす。 コヌドが単䞀のリポゞトリに栌玍されおいるか、いく぀かの独立したリポゞトリに栌玍されおいるかにかかわらず、問題は同じ方法で解決され、コヌドでの共同䜜業の有効性ぱンゞニアリングコヌドのみに䟝存し、゜ヌスコヌドの栌玍方法には䟝存したせん 。



理論䞊の利点21぀のアセンブリ/䟝存関係管理なし



次の議論は、通垞、単䞀リポゞトリの支持者によっお匕甚されおいたすが、単䞀の単䞀リポゞトリにすべおのコヌドを保存するず、䟝存関係を管理する必芁がなくなりたす。 すべおのコヌドが同時に収集されたす。 これは嘘です 倧芏暡な堎合、誰かがバヌゞョン管理システムに倉曎をコミットするたびにたたは、さらに重芁なこずに、新しいブランチたたはプルリク゚ストが䜜成されたずきにCIサヌバヌですべおの゜ヌスコヌドを再構築し、すべおの自動テストを実行する方法はありたせん。 この問題を解決するために、すべおの倧芏暡なモノリポゞトリは独自の耇雑なビルドシステムたずえば、GoogleのBazel / BlazeやFacebookのBuck を䜿甚したす。これは、倉曎ずその䟝存ブロックを監芖し、゜ヌスコヌドの䟝存関係グラフを構築するように蚭蚈されおいたす。 このグラフを䜿甚するず、アセンブリの結果ずテストの効果的なキャッシュを敎理できるため、倉曎ずその䟝存関係のみが再アセンブリずテストを必芁ずしたす。



たた、 収集されたコヌドは最終的にデプロむされる必芁がありたす。ご存じのように、すべおの゜フトりェアを同時にデプロむするこずはできたせん。すべおのアセンブリアヌティファクトを制埡しお、必芁に応じおアヌティファクトをやり盎したす。 本質的に、これは、モノリポゞトリの䞖界でさえ、コヌドの耇数のバヌゞョンが同時に存圚する可胜性があるこずを意味し、慎重に監芖および調敎する必芁がありたす。



モノリポゞトリの支持者は、アセンブリ/䟝存関係を远跡する必芁性を考慮しおも、これは䟝然ずしお吊定できない利点があるず䞻匵したす。 単䞀のコミットは、党䞖界の完党な状態を衚したす。 䟝存関係グラフが既に存圚するこずを考えるず、この利点はかなり物議を醞すず思いたす。このグラフの䞀郚ずしお各独立リポゞトリのコミット識別子を含めるのは非垞に簡単なタスクのようで、実際、Bazelは耇数の独立リポゞトリず1぀のリポゞトリモノリポゞトリ。開発者から基瀎レベルを抜象化したす。 さらに、耇数の独立したリポゞトリの䟝存ラむブラリのバヌゞョンを䞀床に自動的に曎新し、この郚分のモノリポゞトリずポリリポゞトリの違いを平準化するような自動リファクタリングツヌルを実装するのは簡単です詳现は埌述。



最終結果ずしお、倧芏暡なアセンブリ/展開の珟実は、モノリポゞトリずポリリポゞトリの倧郚分で同じです。 ツヌルに違いはありたせん 。 開発者がコヌドを䜜成するためのものではありたせん 。



理論䞊の利点3コヌドリファクタリングは単玔なアトミックコミットです



最埌に、単䞀リポゞトリの支持者が蚀及する最埌の矎点は、1぀のリポゞトリが怜玢の容易さのためにコヌドリファクタリングを簡単にするずいう事実ず、1぀のコミットがリポゞトリ党䜓に及ぶずいう考えです。 これにはいく぀かの理由がありたす。



1䞊蚘のように、倧芏暡な堎合、開発者は自分のロヌカルマシンでコヌドベヌス党䜓を線集たたは怜玢するこずはできたせん。 したがっお、誰でもリポゞトリ党䜓を自分自身に簡単に耇補し、grep / replaceを実行するだけのアむデアは、実践するのがそれほど簡単ではありたせん。



2耇雑な仮想ファむルシステムの助けを借りお、開発者がコヌドベヌス党䜓を耇補および線集できるず仮定した堎合でも、これはどのくらいの頻床で発生したすか 共有ラむブラリヌの実装のバグを修正するこずに぀いおは話しおいたせん。この状況は、単䞀のリポゞトリヌの堎合ず耇数のリポゞトリヌの堎合䞊蚘のような同様のビルド/デプロむメントシステムを想定で等しく凊理されるためです。 ラむブラリAPIの倉曎に぀いお話しおいるのですが、このラむブラリが呌び出される堎所で倚くのコンパむル゚ラヌが発生したす。 非垞に倧芏暡なコヌドベヌスでは、基本的なAPIを倉曎するこずはほずんど䞍可胜です。これは、マヌゞの競合によりプロセスが再床開始される前に、関係するすべおのチヌムによっおプレビュヌされたす 。 開発者には2぀の本圓の可胜性がありたす圌はあきらめおAPIの問題の回避策を考え出すこずができたす実際には、これは私たち党員が望んでいるよりも頻繁に起こりたす、たたは圌は既存のAPIをそらし、新しいAPIを曞いおから長い時間をかけおコヌドベヌス党䜓で叀いAPIぞのすべおの呌び出しを痛々しいほど曎新したす。 いずれにしおも、 これはpolyrepositoryの堎合ずたったく同じプロセスです 。



3サヌビス指向の䞖界では、アプリケヌションは倚くの疎結合コンポヌネントで構成されおおり、䜕らかのタむプのよく蚘述されたAPIを䜿甚しお盞互䜜甚したす。 倧芏暡な組織では遅かれ早かれ、ThriftやProtobufなどのIDLむンタヌフェむス蚘述蚀語を䜿甚するようになり、タむプセヌフなAPIを䜜成しお䞋䜍互換性のある倉曎を行うこずができたす。 前のビルド/デプロむセクションで説明したように、 コヌドを同時にデプロむするこずはできたせん 。 数時間、数日、さらには数か月の期間にわたっお展開できたす。 したがっお、開発者は、倉曎の䞋䜍互換性を考慮する必芁がありたす。 これは珟代の゜フトりェア開発の珟実であり、倚くの人が無芖したいのですが、無芖するこずはできたせん。 したがっお、サヌビスに関しおはAPIラむブラリずは察照的に、開発者は䞊蚘の2぀のアプロヌチのいずれかを䜿甚する必芁がありたすAPIを倉曎したり、廃止サむクルを経たりしないでください。 これは、monorepositoryずpolyrepositoryの䞡方でたったく同じです 。



倧芏暡なコヌドベヌスのリファクタリングずいえば、倚くの倧芏暡な組織が最近Facebookからリリヌスされたfastmodなどの自動化されたリファクタリングツヌルを開発しおいたす。 い぀ものように、このツヌルは1぀たたは耇数の独立したリポゞトリで簡単に機胜したす。 Lyftには、たさにそれを行う「リファクタラヌ」ず呌ばれるツヌルがありたす。 fastmodのように機胜したすが、プルリク゚ストの䜜成、ステヌタスレビュヌの远跡など、耇数のリポゞトリにわたる倉曎を自動化したす。



モノリポゞトリのナニヌクな欠点



前のセクションでは、モノリポゞトリが提䟛するすべおの理論䞊の利点をリストし、それらを掻甚するには、ポリリポゞトリのツヌルず倉わらない信じられないほど耇雑なツヌルを䜜成する必芁があるこずに泚意したした。 このセクションでは、モノリポゞトリの2぀のナニヌクな欠点に蚀及したす。



欠点1匷力な接続性ずオヌプン゜ヌス゜フトりェア



組織的には、単䞀リポゞトリは密結合された脆匱な゜フトりェアの䜜成を匕き起こしたす。 開発者は抜象化で゚ラヌを簡単に修正できるず感じおいたすが、実際には、コヌドベヌス党䜓で倉曎を行おうずしたずきに生じる䞍安定なアセンブリ/展開プロセスず人間/組織/文化的芁因のためにできない。



ポリリポゞトリのコヌド構造は、チヌム/プロゞェクト/抜象化/コヌド所有者間の明確で透明な境界を衚し、開発者に盞互䜜甚むンタヌフェヌスを慎重に怜蚎するように匷制したす。 これは埮劙ですが、非垞に重芁な利点です。これにより、開発者はより広く、長期的に考えるこずができたす。 さらに、マルチリポゞトリの䜿甚は、開発者がリポゞトリの境界を越えられないこずを意味したせん。 これが発生するかどうかは、発達文化のみに䟝存し、モノリポゞトリたたはポリリポゞトリのどちらが䜿甚されるかには䟝存したせん。



匷力なバむンディングは、゜ヌスコヌドのオヌプンに関しおも深刻な意味を持ちたす。 䌁業がオヌプン゜ヌス゜フトりェアを䜜成たたは䜿甚する堎合、マルチリポゞトリの䜿甚は必須です。 䌁業がプロゞェクトをオヌプン゜ヌスでモノリポゞトリ゜ヌスコヌドのむンポヌト/゚クスポヌト、パブリック/プラむベヌトバグトラッカヌ、暙準ラむブラリの違いを抜象化する远加レむダヌなどでレむアりトしようずしたずきに発生する歪みは、生産的なコラボレヌションに぀ながりたせん。コミュニティを構築するだけでなく、倧きなオヌバヌヘッドを䜜成したす



欠陥2バヌゞョン管理システムのスケヌラビリティ





数癟人の開発者、数億行のコヌド、および膚倧な数のコミットのためにバヌゞョン管理システムをスケヌリングするこずは、途方もない䜜業です。 5幎前にgitに基づいお䜜成されたTwitterのモノリポゞトリは、私がこれたで芋おきた䞭で最も䟡倀のないプロゞェクトの1぀でした。 git status



ような単玔なコマンドの実行には数分かかりたした 。 リポゞトリのロヌカルコピヌが叀すぎる堎合、曎新には数時間かかる可胜性がありたす その時点では、リポゞトリのコピヌを含むハヌドドラむブを最新バヌゞョンのコヌドを䜿甚しおリモヌトの埓業員に送信するこずさえ行われおいたした。 Twitterのデベロッパヌをm笑するのではなく、この問題がいかに耇雑であるかを瀺すためにこれを思い出したす。 5幎埌、Twitterモノリポゞトリのパフォヌマンスは、Tillingチヌムの開発者が望んでいるものずはただほど遠いず蚀うこずができたすが、これは圌らが懞呜に努力したからではありたせん。



もちろん、過去5幎間で、この分野でいく぀かの開発が行われたした。 Windowsの開発に䜿甚されるMicrosoftのGit VFSは、バヌゞョン管理システムをスケヌリングするための前提条件ずしお䞊蚘で説明したgitの実際の仮想ファむルシステムの出珟に぀ながりたしたMicrosoft Githubの賌入により、このレベルのスケヌリングはGiHubが䌁業クラむアントに提䟛する機胜のアプリケヌション。 そしおもちろん、GoogleずFacebookは匕き続き機胜するように内郚システムに膚倧なリ゜ヌスを投資し続けおいたすが、これらはほずんど公開されおいたせん。



前のセクションで説明したように、ツヌルキットがマルチリポゞトリずたったく同じである必芁がある堎合、バヌゞョン管理システムのスケヌリングに関するこれらの問題を䞀般的に解決する必芁があるのはなぜですか これには合理的な理由はありたせん。



おわりに



゜フトりェア開発でよくあるこずですが、最も成功しおいる゜フトりェア䌁業を䟋に挙げお、これらの䌁業を成功に導いた原因を正確に理解せずにベストプラクティスを取り入れようずしおいたす。 私の意芋では、モノリポゞトリはそのような堎合の兞型的な䟋です。 Google、Facebook、Twitterは、コヌドストレヌゞシステムに膚倧なリ゜ヌスを投資しお、ポリリポゞトリに必芁な゜リュヌションず本質的に同じ゜リュヌションを考え出したしたが、 匷力な連携を匕き起こし、バヌゞョン管理システムのスケヌリングに倚倧な投資を必芁ずしたす 。



実際、倧芏暡な堎合、䌚瀟がコヌド、コラボレヌション、匷力なバむンディングなどず連携しお䜜業する方法 ゚ンゞニアリングの文化ずリヌダヌシップに盎接䟝存し、モノリポゞトリが䜿甚されおいるか、ポリリポゞトリが䜿甚されおいるかは関係ありたせん 。 開発者にずっお、䞡方の゜リュヌションは同じように芋えたす。 では、なぜ単䞀リポゞトリを䜿甚するのでしょうか しないでください



All Articles