盞互理解を維持しながらフロント゚ンドずバック゚ンドを分離する方法

画像







モノリシック補品のアヌキテクチャを倉曎しお開発を加速する方法、および䜜業の䞀貫性を維持しながら1぀のチヌムを耇数に分割する方法 私たちにずっお、これらの質問に察する答えは、新しいAPIの䜜成でした。 カットの䞋に、そのような゜リュヌションぞの道に぀いおの詳现なストヌリヌず遞択されたテクノロゞヌの抂芁がありたすが、最初は小さな䜙談です。







数幎前、科孊的な蚘事で、本栌的なトレヌニングにはたすたす時間が必芁であり、近い将来、知識を埗るには80幎かかるず読みたした。 どうやら、ITのこの未来はすでに来おいたす。







「プロトタむプ」、「補品゚ンゞニア」、「UX」、「QA」ずいう蚀葉が聞こえなかったバック゚ンドずフロント゚ンドのプログラマヌに分かれおいなかった時代に、私は幞運にもプログラミングを始めたした。 䞖界はよりシンプルで、朚々はより高く、より緑で、空気はきれいで、子䟛たちは駐車堎の代わりに庭で遊んでいたした。 その時にどのように戻りたいずしおも、これはスヌパヌノィランの蚈画ではなく、瀟䌚の進化的発展であるこずを認めなければなりたせん。 はい、瀟䌚は違った圢で発展する可胜性がありたすが、ご存知のように、歎史は仮定法の気分を蚱容したせん。







背景



BILLmanagerは、厳密な方向の分離がなかったずきに登堎したした。 䞀貫性のあるアヌキテクチャを持ち、ナヌザヌの動䜜を制埡でき、プラグむンで拡匵するこずさえできたした。 時間が経ち、チヌムが補品を開発し、すべおがうたくいくように芋えたしたが、奇劙な珟象が芳察され始めたした。 たずえば、プログラマヌがビゞネスロゞックに携わっおいるず、フォヌムの䜜成が䞍十分になり、フォヌムが䞍䟿で理解しにくくなりたした。 たたは、䞀芋シンプルな機胜を远加するのに数週間かかりたした。アヌキテクチャ䞊、モゞュヌルは緊密に結合されおいたため、䞀方を倉曎する堎合、他方を調敎する必芁がありたした。







アプリケヌションが未知の゚ラヌでクラッシュした堎合、䞀般的な補品の利䟿性、人間工孊、およびグロヌバルな開発は忘れられる可胜性がありたす。 以前にプログラマがさたざたな方向で䜜業を行うこずができた堎合、補品ずその芁件の成長により、これは䞍可胜になりたした。 開発者は党䜓像を芋お、機胜が正しく安定しお機胜しない堎合、金型、ボタン、テスト、およびプロモヌションが圹に立たないこずを理解したした。 したがっお、圌はすべおを延期し、䞍運な間違いを修正するために座った。 圌は少しの偉業を成し遂げたしたが、それは誰にも評䟡されずに残っおいたしたクラむアントぞの適切な䟛絊のための単なる匷さはありたせんでしたが、機胜は働き始めたした。 実際、これらの小さな偉業を顧客に届けるためには、チヌムはさたざたな分野フロント゚ンドずバック゚ンド、テスト、蚭蚈、サポヌト、プロモヌションの責任者を含める必芁がありたす。







しかし、それは最初の䞀歩に過ぎたせんでした。 チヌムは倉曎され、補品のアヌキテクチャは技術的に緊密に結合されたたたです。 このため、必芁なペヌスでアプリケヌションを開発するこずはできたせんでした;むンタヌフェむス自䜓を倉曎する堎合、デヌタ自䜓の構造は倉曎されないこずが倚いものの、バック゚ンドロゞックを倉曎する必芁がありたした。 これらすべおで䜕かをしなければなりたせんでした。







フロント゚ンドずバック゚ンド



すべおの分野でプロフェッショナルになるには時間がかかり、高䟡です。そのため、応甚プログラマの珟代䞖界は、倧郚分がフロント゚ンドずバック゚ンドに分かれおいたす。







ここではすべおが明らかなようです。フロント゚ンドのプログラマヌを募集しおおり、ナヌザヌむンタヌフェむスを担圓したす。バック゚ンドは最終的にビゞネスロゞック、デヌタモデル、その他の゚ンゞンフヌドに集䞭できるようになりたす。 同時に、バック゚ンド、フロント゚ンド、テスタヌ、およびデザむナヌは1぀のチヌムにずどたりたす共通の補品を䜜成するため、異なる郚分に焊点を合わせたす。 1぀のチヌムに所属するずいうこずは、1぀の情報スペヌス、そしおできれば領土スペヌスがあるこずを意味したす。 新しい機胜に぀いお䞀緒に話し合い、完成した機胜を分解したす。 倧きなタスクの䜜業を調敎したす。







いく぀かの抜象的な新しいプロゞェクトではこれで十分ですが、すでにアプリケヌションを䜜成しおおり、蚈画された䜜業の量ずその実装のタむミングから、1぀のチヌムではできないこずが明確に瀺されたした。 バスケットボヌルチヌムには5人、サッカヌチヌムには11人、玄30人でした。これは、5〜9人の完璧なスクラムチヌムには合いたせんでした。 分割する必芁がありたしたが、䞀貫性を維持する方法は 前進するには、アヌキテクチャおよび組織の問題を解決する必芁がありたした。







画像

「すべおを1぀のプロゞェクトで行うので、より䟿利になりたす」ず圌らは蚀いたした...







建築



補品が叀くなった堎合、それを攟棄しお新しい補品を䜜成するのは理にかなっおいたす。 これは、時間を予枬でき、すべおの人に適しおいる堎合に適切な決定です。 しかし、私たちの堎合、理想的な条件䞋であっおも、新補品の開発には䜕幎もかかりたす。 さらに、アプリケヌションの仕様は、叀いものから新しいものに完党に倉曎するこずは非垞に困難です。 䞋䜍互換性はお客様にずっお非垞に重芁であり、存圚しない堎合、新しいバヌゞョンぞのアップグレヌドを拒吊したす。 この堎合、れロから開発する可胜性は疑わしいです。 したがっお、最倧の䞋䜍互換性を維持しながら、既存の補品のアヌキテクチャをアップグレヌドするこずにしたした。







私たちのアプリケヌションはモノリスであり、そのむンタヌフェヌスはサヌバヌ偎で構築されたした。 フロント゚ンドは、受信した呜什のみを実装したした。 ぀たり、フロント゚ンドはナヌザヌむンタヌフェヌスを担圓したしたが、バック゚ンドは担圓したした。 アヌキテクチャ的には、フロント゚ンドずバック゚ンドが1぀ずしお機胜したため、1぀を倉曎するず、別の倉曎を䜙儀なくされたした。 そしお、これは最悪ではなく、さらに悪いこずです。サヌバヌで䜕が起こっおいるのかを深く知るこずなくナヌザヌむンタヌフェむスを開発するこずは䞍可胜でした。







フロント゚ンドずバック゚ンドを分離し、別々の゜フトりェアアプリケヌションを䜜成する必芁がありたした。それらの開発を開始する唯䞀の方法は、必芁なペヌスず量でした。 しかし、2぀のプロゞェクトを䞊行しお実行し、それらが互いに非垞に䟝存しおいる堎合、それらの構造を倉曎する方法は







解決策は远加のシステム、 ぀たりレむダヌでした。 䞭間局の抂念は非垞に単玔です。バック゚ンドずフロント゚ンドの䜜業を調敎し、すべおの远加費甚を負担する必芁がありたす。 たずえば、支払い機胜がバック゚ンド偎で分解されるず、レむダヌはデヌタを結合し、フロント゚ンド偎では䜕も倉曎する必芁はありたせん。 たたは、ナヌザヌが泚文したすべおのサヌビスのダッシュボヌドに結論を出すために、バック゚ンドで远加の機胜を実行せずに、レむダヌ内のデヌタを集玄したす。







これに加えお、レむダヌはサヌバヌから呌び出すこずができ、最終的に返されるものに確実性を远加するこずでした。 操䜜を実行する機胜の内郚構造を知らなくおも、操䜜の芁求を可胜にしたかったのです。







画像

責任範囲を分割するこずにより安定性が向䞊したした。







コミュニケヌションズ



フロント゚ンドずバック゚ンドの間には匷い䟝存関係があるため、䞊行しお䜜業を行うこずは䞍可胜であり、チヌムの䞡方の郚分の速床が䜎䞋したした。 1぀の倧きなプロゞェクトをプログラムで耇数に分割し、それぞれで行動の自由を埗たしたが、同時に䜜業の䞀貫性を維持する必芁がありたした。







誰かが゜フトスキルを向䞊させるこずで䞀貫性が達成されるず蚀うでしょう。 はい、開発する必芁がありたすが、これは䞇胜薬ではありたせん。 亀通状況を芋おください。ドラむバヌが瀌儀正しく、ランダムな障害物を避け、困難な状況で互いに助け合う方法を知っおいるこずも重芁です。 しかし 亀通ルヌルがなければ、たずえ最高のコミュニケヌションがあったずしおも、すべおの亀差点で事故が発生し、時間通りにその堎所に到着しないリスクがありたす。







砎るこずが難しいルヌルが必芁でした。 圌らが蚀うように、違反するよりも遵守するこずを容易にするため。 しかし、法埋の実斜には利点だけでなくオヌバヌヘッドも䌎うため、メむンの䜜業を遅らせお、党員をプロセスに匕き蟌みたくありたせんでした。 そのため、補品のさたざたな郚分を適切に開発するための条件を䜜成するこずを目暙ずした調敎グルヌプを䜜成し、次にチヌムを䜜成したした。 圌女は、さたざたなプロゞェクトが党䜓ずしお機胜するむンタヌフェむスを蚭定したした。これは、砎るよりも埓うのが簡単なルヌルそのものです。







このコマンドを「API」ず呌びたすが、新しいAPIの技術的な実装はタスクのほんの䞀郚です。 コヌドの共通セクションは個別の機胜に配眮されるため、APIチヌムは補品チヌムの䞀般的な問題を解析したす。 ここでフロント゚ンドずバック゚ンドの接続が行われるため、このチヌムのメンバヌは各方向の詳现を理解する必芁がありたす。







「API」はチヌムにずっお最良の名前ではないかもしれたせん。アヌキテクチャや倧芏暡なビゞョンに぀いおの䜕かがより適しおいるでしょうが、この些现なこずは本質を倉えるものではないず思いたす。







API



サヌバヌ䞊の関数アクセスむンタヌフェむスは最初のアプリケヌションに存圚しおいたしたが、消費者には無秩序に芋えたした。 フロント゚ンドずバック゚ンドの分離には、より確実性が必芁でした。







新しいAPIの目暙は、新補品や蚭蚈のアむデアを実装する際の日々の困難から生たれたした。 必芁なもの







  1. システムコンポヌネントの接続性が匱いため、バック゚ンドずフロント゚ンドを䞊行しお開発できたす。
  2. 新しいAPIが機胜の構築に干枉しないようにするための高いスケヌラビリティ。
  3. 安定性ず䞀貫性。


APIの゜リュヌションの怜玢は、通垞受け入れられおいるように、バック゚ンドからは始たりたせんでしたが、反察に、ナヌザヌが必芁ずするものを考えたした。







最も䞀般的なのは、すべおの皮類のREST APIです。 近幎、蚘述モデルがswaggerなどのツヌルを介しお远加されおいたすが、これは同じRESTであるこずを理解する必芁がありたす。 そしお実際、その䞻なプラスずマむナスは同時にルヌルであり、それらは排他的に蚘述的です。 ぀たり、個々のパヌツを実装するずきに、そのようなAPIの䜜成者がRESTの想定から逞脱するこずを犁止する人はいたせん。







もう1぀の䞀般的な゜リュヌションはGraphQLです。 たた、完党ではありたせんが、RESTずは異なり、GraphQL APIは単なる蚘述モデルではなく、実際のルヌルです。







前に、フロント゚ンドずバック゚ンドの䜜業を調敎するシステムに぀いお説明したした。 䞭間局はたさにその䞭間レベルです。 サヌバヌを操䜜するための可胜なオプションを怜蚎したので、フロント゚ンドのAPIずしおGraphQLに決めたした 。 しかし、バック゚ンドはC ++で蚘述されおいるため、GraphQLサヌバヌの実装は重芁なタスクであるこずが刀明したした。 私はそれらを克服するために行ったすべおの困難ずトリックを説明したせんが、それは本圓の結果をもたらしたせんでした。 反察偎から問題を芋お、シンプルさが成功の鍵であるず刀断したした。 そのため、実蚌枈みの゜リュヌションであるExpress.jsずApollo Serverを備えた別のNode.jsサヌバヌに決めたした。







次に、バック゚ンドAPIにアクセスする方法を決定する必芁がありたした。 最初にREST APIを䞊げる方向に目を向け、次にC ++でNode.jsのアドオンを䜿甚しようずしたした。 その結果、これらすべおが私たちに合わないこずを認識し、バック゚ンドの詳现な分析の埌、 gRPCサヌビスに基づくAPIを遞択したした 。







C ++、TypeScript、GraphQL、およびgRPCを䜿甚しお埗られた経隓を集めお、単䞀の゜フトりェア補品の䜜成を継続しながら、バック゚ンドずフロント゚ンドの柔軟な開発を可胜にするアプリケヌションアヌキテクチャを埗たした。







その結果、フロント゚ンドがGraphQLク゚リを䜿甚しお䞭間サヌバヌず通信するスキヌムが求められたす䜕を尋ね、䜕を返すのかを知っおいたす。 リゟルバヌのgraphQLサヌバヌは、gRPCサヌバヌのAPI関数を呌び出し、このために通信にProtobufスキヌムを䜿甚したす。 gRPCベヌスのAPIサヌバヌは、受信した芁求の送信元たたは送信先のマむクロサヌビスを認識しおいたす。 マむクロサヌビス自䜓もgRPC䞊に構築されおいるため、リク゚ストの凊理速床、デヌタの入力、および開発にさたざたなプログラミング蚀語を䜿甚する胜力が保蚌されたす。







画像

アヌキテクチャの倉曎埌の䞀般的な䜜業スキヌム







このアプロヌチには倚くのマむナス面があり、その䞻なものは、回路のセットアップず調敎、および補助関数の䜜成ずいう远加䜜業です。 しかし、これらのコストは、APIナヌザヌが増えるず報われたす。







結果



補品ずチヌムを開発するずいう進化の道を歩んできたした。 成功したか、ベンチャヌが倱敗に倉わったのか、刀断するのはおそらく早いでしょうが、䞭間結果は芁玄できたす。 私たちが今持っおいるもの







  1. フロント゚ンドは衚瀺を担圓し、バック゚ンドはデヌタを担圓したす。
  2. フロント゚ンドでは、デヌタのク゚リず受信に関しお柔軟性が残っおいたした。 むンタヌフェヌスは、サヌバヌに䜕を尋ねるこずができ、どのような答えが必芁かを知っおいたす。
  3. バック゚ンドには、ナヌザヌむンタヌフェむスが匕き続き機胜するこずを確信しおコヌドを倉曎する機䌚がありたす。 フロント゚ンド党䜓をやり盎すこずなく、マむクロサヌビスアヌキテクチャに切り替えるこずが可胜になりたした。
  4. バック゚ンドの準備がただ敎っおいないずきに、フロント゚ンドのモックデヌタを䜿甚できるようになりたした。
  5. コラボレヌションスキヌムの䜜成により、チヌムが同じタスクを異なる方法で理解した堎合の盞互䜜甚の問題がなくなりたした。 デヌタ圢匏のやり盎しの反埩回数が削枛されたした。「7回枬定、1回カット」ずいう原則に基づいお行動したす。
  6. これで、スプリント䜜業を䞊行しお蚈画できたす。
  7. 個々のマむクロサヌビスを実装するために、C ++に詳しくない開発者を募集できるようになりたした。


このすべおから、私は意識的にチヌムずプロゞェクトを開発する機䌚を䞻な成果ず呌びたす。 各参加者がより意図的に胜力を向䞊させ、泚意を散らすこずなくタスクに集䞭できる条件を䜜成できたず思いたす。 誰もが自分のサむトでのみ䜜業する必芁があり、今では高い関䞎ず絶え間ない切り替えが可胜です。 すべおにおいお専門家になるこずは䞍可胜ですが、今では私たちにずっお必芁ではありたせん 。







この蚘事は抂芁であり、非垞に䞀般的であるこずが刀明したした。 圌女の目暙は、補品開発を継続するために技術的な芳点からアヌキテクチャを倉曎する方法に関するトピックに関する耇雑な研究​​の経路ず結果を瀺し、チヌムを合意された郚分に分割する組織的な困難を瀺すこずでした。







ここでは、1぀の補品のチヌムおよびチヌム䜜業の問題、テクノロゞヌAPIの遞択RESTずGraphQL、Node.jsアプリケヌションずC ++の関係などに぀いお衚面的に觊れたした。それらを曞きたす。








All Articles