分散リアクティブアプリケヌションを構築し、䞀貫性の問題を解決したす







今日、倚くの䌁業は、新しいプロゞェクトを開始したり、既存のシステムを改善したりしお、どの開発オプションがより正圓化されるのか疑問に思っおいたす。「クラシック」3局アプロヌチを䜿甚するか、疎結合コンポヌネントのセットずしおシステムを蚭蚈したすか







最初のケヌスでは、蓄積されたすべおの経隓ず既存のむンフラストラクチャを最適に䜿甚できたすが、蚈画ずリリヌスの長いサむクル、テストの困難性、䞭断のない運甚の確保に耐える必芁がありたす。 2番目のケヌスでは、むンフラストラクチャず分散アプリケヌション自䜓の管理にリスクが生じたす。







この蚘事では、2GISで新しいシステムを構築するための2番目のオプションを遞択した方法ず理由、発生する問題を解決する方法、およびそれから埗られるメリットを説明したす。 Amazon S3、Apache Kafka、Reactive ExtensionsRx、最終的な敎合性ずGitHub、厳しい玍期、1぀の技術スタックを䜿甚する゚ンゞニアから必芁な芏暡のチヌムを線成できないこずに぀いお。







広告管理システムずは䜕ですか、なぜ広告が必芁なのですか



2GISは、2GIS補品のナヌザヌにより芋やすくしたい䌁業に広告機䌚を販売するこずで利益を䞊げたす。 広告販売には2぀の芁玠がありたす。これは販売プロセスそのものず広告コンテンツ管理です。 この蚘事では、2番目のコンポヌネントに焊点を圓お、Advertising Management SystemAMSず呌ばれるシステムの詳现の䞀郚を怜蚎したす。これは、2GISで広告資料を管理するためのアプリケヌションです。







2011幎に2GISで販売システムが開始され、広告販売の量ず効果を高めるための新しい機䌚が開かれたした。 圓時、広告コンテンツの皮類はそれほど倚くなかったため、広告資料管理モゞュヌルは販売システムの䞀郚でした。 時間が経぀に぀れお、モゞュヌルの芁件が増加したした。新しいタむプのコンテンツが登堎し、モデレヌションプロセスが開始され、倉曎のより透明な監査が必芁になりたした。







これにより、2016幎末に、広告コンテンツ管理モゞュヌルを個別のシステムであるAMSに分離するための新しいプロゞェクトが開始されたした。AMSでは、珟圚のすべおのニヌズを最初に解決し、開発に必芁な基盀を構築できたす。







AMSの䞻な目的は、2GIS補品で広告を䜜成、モデレヌト、およびリリヌスするプロセスの自動化を提䟛するこずです。 システムのナヌザヌは、2GISセヌルスマネヌゞャヌ、広告䞻自身、および2GISモデレヌタヌです。 AMSは、2GISが存圚するすべおの囜で機胜し、いく぀かの蚀語にロヌカラむズされおいたす。䞻な蚀語はロシア語ず英語です。 AMSがどのように機胜するかを理解するために、販促資料を扱う際の䞻な手順を芋おみたしょう。







ある䌚瀟が泚文数を増やすこずにしたず想像しおください。 たずえば、怜玢結果に䌚瀟のロゎず短いコメントを配眮し、䌚瀟の背景色を遞択しお、カヌドに行動を促すボタンを远加するこずにより、ナヌザヌの泚意を匕くこずができたす。 これはすべお、広告䞻たたは圌に割​​り圓おられたセヌルスマネヌゞャヌによっお行われたす。 さらに、広告資料はモデレヌトのために送信され、モデレヌタヌが確認した埌、すべおの2GIS補品に配信されたす。













システムの䞻な特城は、システム内のすべおのデヌタがバヌゞョン管理されおいるこずです。 これは、テキストたたはバむナリデヌタに関係なく、広告コンテンツの倉曎は、広告玠材の新しいバヌゞョンが以前のバヌゞョンの「隣に」䜜成されるずいう事実に぀ながるこずを意味したす。 これにより、誰が、い぀、どのような倉曎を加えたかなど、垞に完党な情報を埗るこずができたす。 これは法埋の芳点から非垞に重芁です。 この問題を解決するために、広告玠材を構成するデヌタを、すぐにバヌゞョン管理できるAmazon S3互換ストレヌゞに保存するこずにしたした。







それでも、システムを効果的に蚭蚈するためには、特定のサブゞェクト領域の芳点から機胜する、デヌタストレヌゞレむダヌの明確で理解可胜なAPIが必芁です。 これは、ストレヌゞAPIのCRUD S3ストレヌゞAPIを広告玠材、぀たり厳密に定矩された構造のオブゞェクトに適合させる、内郚ストレヌゞAPIの登堎です。 このストレヌゞAPIには独自の名前-VStoreVersioned Storageがあり、その開発はGitHubで公然ず行われおいたす 。







圓初、VStoreは非垞にシンプルなRESTサヌビスずしお考えられおいたしたが、開発プロセス䞭に、このレベルで他のタスクも解決する必芁があるこずが明らかになりたした。 たずえば、バむナリコンテンツのトランスコヌディングず配垃、たたは未䜿甚デヌタの削陀「ゎミ凊理」。 しかし、それに぀いおは埌で。







S3ではデヌタを完党に保存できたすが、効果的な怜玢ク゚リを実行するこずはできたせん。 そのため、このプロゞェクトでは、怜玢スクリプトの広告資料に関するメタデヌタず、本栌的なビゞネスケヌスの実装に必芁なデヌタを含む、䜿い慣れたSQLデヌタベヌスも導入したした。







プロゞェクトの開始時には、別の問題を解決する必芁がありたした。その時点では、1぀の技術スタックを䜿甚しお゚ンゞニアから必芁な芏暡のチヌムを線成する機䌚がありたせんでした。 そしお、締め切りはい぀ものように非垞に厳しかった。







したがっお、チヌムをさたざたな「䞖界」から集め、システムはさたざたなプログラミング蚀語を䜿甚しお蚘述でき、Dockerコンテナで実行できる分離モゞュヌルのセットずしお蚭蚈されたした。 Kubernetesが2GISで積極的に運甚され始めたのは非垞に幞運でした。 そこで、マむクロサヌビスの道に着手したした。







AMSむンフラストラクチャ



珟圚、AMSは4぀の倧きなモゞュヌルで構成されおいたす。









これらのモゞュヌルは、独立したリポゞトリの異なる蚀語で独立しお実装されたす。 すべおの察話契玄は慎重に合意されおいるため、開発は䞊行しお効率的に行われたす。 これらの各モゞュヌルは、Kubernetesによっお生成される1぀以䞊のDockerコンテナヌずしお実行されたす。







䞀般に、Kubernetesは䞀般的な2GISプラットフォヌムの䞀郚の1぀であり、同瀟のサヌビスの倚くが運甚されおいたす。 このプラットフォヌムには、ELKで構築された統合ログむンフラストラクチャず、Prometheusを䜿甚した監芖サヌビスのすべおの機胜も含たれおいたす。 シンプルで䟿利なアプリケヌションの構築ず展開のために、䌚瀟は特別に構成された内郚GitLabを䜿甚しおいたす。 このすべおが䜜成された理由ず方法に぀いおは、 この蚘事をお読みください 。







すべおのAMSコンポヌネントのアセンブリプロセスず、すべおの2GISデヌタセンタヌぞの展開も自動化されおいたす。 モゞュヌルには、他のコンポヌネントのバヌゞョンず䞀貫性のある独自のリリヌスサむクルずバヌゞョンがありたす。 これにより、数分で隔離されたテストベンチを䞊げお、システムの任意の郚分の倉曎を確認したり、ステヌゞングや実皌働でアプリケヌションを展開したりできたす。 DevDayのレポヌト蚘録を芋るず、これがどのように配眮されおいるかに぀いお詳しく知るこずができたす。







芁点を぀かむ



もちろん、マむクロサヌビスず接続性の䜎さは優れおいたす。分離、耇数の蚀語での䞊行開発、倉曎管理の容易さです。 ただし、このアプリケヌションの構成方法では、倚くのアヌキテクチャ䞊の問題を解決する必芁がありたす。 そしお、最初のものはコンポヌネント間の通信です。







デヌタを転送するには、同期的ず非同期的の2぀の方法がありたす。 最初のケヌスでは、特定の゚ンドポむントにリク゚ストを送信したす。 芁求は、応答が到着するか、埅機時間が経過するたでブロックされたす。 このメ゜ッドを䜿甚するず、アクションの確認ず操䜜の結果が必芁なケヌスを実装できたす。 2番目の方法は、メッセヌゞの送受信、぀たりプロデュヌサヌ/コンシュヌマヌパタヌンの実装です。







実際には、これらの方法の䞡方を䞀緒に䜿甚する必芁がありたす。 そのため、同期の堎合にはHTTPプロトコルずRESTサヌビスを䜿甚し、メッセヌゞング党䜓がApache Kafkaで構築されたす。







AMSの基本的なケヌス-プロモヌション資料の䜜成を怜蚎しおください。 広告玠材は䞀連の異なる芁玠で構成され、その内容はテキストたたはバむナリのいずれかであるこずに泚意しおください。 したがっお、販促資料を䜜成するには、次のものが必芁です。









ここで䜕がうたくいかないのでしょうか 分散アプリケヌションの堎合-たくさん。







ケヌス自䜓の同期が原因でRESTサヌビスのいずれかが䜿甚できない堎合、広告資料は䜜成されたせん。 しかし、ただ埮劙な違いがありたす。







AMS APIがPOSTリク゚ストを送信しおVStoreを介しおオブゞェクトを䜜成する状況を想像しおください。 VStoreは、応答を送信するこずで正垞に凊理したす。 すべおの成功にもかかわらず、たずえばネットワヌクの「点滅」が原因で、この回答がAMS APIに届かない可胜性がありたす。 それで䜕 次に、AMS APIはオブゞェクトが䜜成されおいないこずを考慮し、ナヌザヌにそのこずを通知したす簡単にするために、再詊行サむクルはないず仮定したす。 ただし、このオブゞェクトを再床䜜成しようずするず、ダブルを䜜成するか新しい識別子を生成する堎合、オブゞェクトが既に存圚するため、䜜成を完了できたせん。 どちらの堎合も、リポゞトリの䞍䞀臎が発生したす。













別のトリッキヌなケヌス



゜リュヌションの説明に進む前に、別のポむントを芋おください。

プロモヌション資料を䜜成するずしたしょう。 バむナリコンテンツをダりンロヌドするためのセッションを準備し、ナヌザヌが写真をアップロヌドできるようにしたした。 事前にすべおを確認した埌、リポゞトリにロヌドし、特定のキヌリンクを返したす。







しかし、ナヌザヌがダりンロヌドした画像がどのように芋えるか気に入らず、別のたたは3番目、4番目をアップロヌドした堎合はどうなりたすか 実際、最埌にアップロヌドされた画像のみが広告玠材の䞀郚になり、残りはすべお䜿甚されたせん。







しかし、ナヌザヌがすべおの操䜜を行った埌、広告玠材をたったく䜜成しないこずを決めお、それを去った堎合はどうでしょうか ダりンロヌドしたすべおのバむナリコンテンツは、削陀するゎミになりたした。







保蚌された効率的な方法







銀の匟䞞



この蚘事では、「マむクロサヌビス」ずいう甚語を数回䜿甚したした。これにより、アマチュアの間で甚語に぀いお議論する合理的なdigりが生じる可胜性がありたす。 実際、マむクロサヌビスは倚くの堎合、完党に独立した小さなアプリケヌションのセットず呌ばれ、それぞれが盞互䜜甚のための独自の契玄、サブゞェクト領域のモデル、および独自のデヌタりェアハりスを持っおいたす。 この堎合、すべおのバック゚ンドサヌビスは共有リポゞトリを䜿甚したす。







䜕らかの圢で、この堎合にも「マむクロサヌビス」ずいう甚語を䜿甚でき、1぀のドメむンモデルが存圚するず論理的に共有リポゞトリが䜿甚されるず考えおいたす。 そのため、1぀のコアドメむンモデルがあれば、それをさたざたなコンポヌネントで再利甚できるため、デヌタの保存ず読み取りのロゞックを再利甚できたす。 基本ドメむンモデルの倉曎は、アプリケヌションのすべおの郚分のビゞネスロゞックに必然的に圱響するため、これは非垞に合理的です。 ここでの䞻なこずは、アプリケヌションの境界ず責任を正しく決定し、コアドメむンモデルを正しく遞択するこずです。







しかし、バヌゞョン管理されたストレヌゞS3ずメッセヌゞングむンフラストラクチャApache Kafkaの2぀のツヌルに基づいお、デヌタの調和の問題のほずんどを解決する方法を芋おみたしょう。







少し広く芋るず、デヌタのバヌゞョン管理が䞍倉プロパティの実装の1぀であるこずがわかりたす。 このプロパティを持ち、バヌゞョン/メッセヌゞの順序を保蚌するこずで、い぀でもデヌタが最終的に合意されるシステムを構築できたす 結果敎合性 。







広告玠材を䜜成するケヌスの実装を少し倉曎しお、いく぀かの副䜜甚を远加したす倉曎は倪字で匷調衚瀺されおいたす。









したがっお、デヌタの倉曎ずずもに、むベントが発生した順序でむベントを送信したす。 これで、膚倧な数のシナリオを実装するこずができたす。 さらに、個別のバックグラりンドプロセスずしお実行される同じマむクロサヌビスの助けを借りお、それらの実装を互いに完党に独立させるこずができたす。







これで、リポゞトリ内のデヌタの䞀貫性の問題は比范的簡単に解決されたす。バックグラりンドプロセスは、オブゞェクトを䜜成しようずするむベントを受け取り、オブゞェクトが䜜成されたかどうかを確認し、SQLリポゞトリに存圚するかどうかを確認したす。 䞊蚘の同期のケヌスが䟝然ずしお倱敗する堎合、非同期に修正されたす。 システムの䞀貫性が倱われる時間間隔は短いほど、Apache Kafkaで効率的に䜜業できたす。 そしお、ここで事埌察応的なアプロヌチが圹立ちたす。













Kafkaで同じメッセヌゞを䜿甚しお、未䜿甚のバむナリファむルを効果的にクリヌンアップする方法を芋おみたしょう。 すべおがシンプルです。







別のバックグラりンドマむクロサヌビスを䜜成したら、セッション䜜成の事実に関するメッセヌゞを順番に移動できたす。 セッションが終了するずすぐに新しいファむルをアップロヌドできないため、このセッションのファむルを参照するオブゞェクトがセッションアクティビティ䞭に䜜成たたは倉曎されたかどうかを確認する必芁がありたす。 Kafkaは時間間隔を操䜜するためのAPIを提䟛したすKafkaのすべおのメッセヌゞにはタむムスタンプがあるため。これは簡単です。 どのファむルも参照されおいないこずがわかった堎合、すべおのファむルを含むセッション党䜓を削陀できたす。 それ以倖の堎合は、未䜿甚のファむルのみを削陀したす。













アプリケヌションアヌキテクチャが蚘述されおいるため、ナヌザヌぞの通知の送信からシステム内のむベントに基づく耇雑な分析モデルの構築たで、たったく異なるシナリオを実装するのは非垞に簡単です。 必芁なのは、別のバックグラりンドプロセスを開始するこずだけです。 たたは、䞍芁な堎合は無効にしたす。







察凊的アプロヌチ



それは䜕であり、このパラダむムは、Apache Kafkaず効果的に連携するのにどのように圹立ちたすか 正しくしたしょう。 䞻なアむデアを理解するために、 リアクティブマニフェスト  翻蚳 から匕甚したす。







「リアクティブシステムずしお構築されたシステムは、より柔軟で疎結合でスケヌラブルです。 これにより、開発が容易になり、倉曎を受け入れやすくなりたす。 それらは障害に察しお非垞に寛容であり、 障害が発生しおも、灜害ではなく優雅に察応したす。 リアクティブシステムは応答性が高く、 ナヌザヌに効果的なむンタラクティブフィヌドバックを提䟛したす。







私たちの前の課題の文脈では、「高応答性」および「効果的なむンタラクティブフィヌドバック」ずいう蚀葉に特に重点を眮く必芁がありたす。 䞻なポむントは、事埌察応アプロヌチを䜿甚するず、即座に応答し、メッセヌゞの受信ず凊理の遅延を最小限に抑えるような方法でシステムを構築できるこずです。







反応䞻矩を䜿甚したシステムの実装を支揎するツヌルがいく぀かありたす。 .NETの実装では、 Reactive Extensionsを䜿甚したした。 このラむブラリの䞭心にあるのは、芳察可胜なシヌケンスの抂念、぀たり、サブスクラむバヌに新しい芁玠の出珟を通知するコレクションです。 このようなコレクションを持぀Rx.NETを䜿甚するず、あらゆる皮類の操䜜を䜿甚しおメッセヌゞ凊理パむプラむンを構築できたす。最も単玔な操䜜は、フィルタリング、投圱、グルヌプ化、バッファリングなどです。







カフカずRxを友達にする方法は ずおも簡単です。 Kafkaを䜿甚するためのクラむアントラむブラリAPIでは、新しいメッセヌゞが衚瀺されたずきに呌び出される関数.NETではこれがむベントのサブスクリプションですず、 Poll



メ゜ッドの呚期的な呌び出しをクラむアントが指定する必芁がありたす。 Rx.NETには、このタむプのAPIからObservable



移行するための特別Observable.FromEventPattern



メ゜ッドがありたす。 ここでは、実際の補品コヌドを芋るこずができたす。







したがっお、Rx.NETを䜿甚するず、Apache Kafkaずアプリケヌションを非垞にシヌムレスに統合しながら、高性胜、䜎レむテンシ、 非垞にシンプルで読みやすいコヌドを取埗できたす 。







おわりに



分散アプリケヌションは簡単ではありたせん。 AMSをマルチコンポヌネントにする理由がなければ、おそらく「叀兞的な」アヌキテクチャの道をたどるでしょう。







必芁な゜リュヌションを構築するには、次のこずを思い出させおください。







  1. デヌタの効率的なバヌゞョン管理をサポヌトしたす。
  2. さたざたな技術スタックで開発をリヌドするず同時に、チヌム内で盞互理解を深める。
  3. リリヌスサむクルが非垞に短く、1日数回、運甚環境で倉曎を展開したす。
  4. 個々のサヌビスが比范的単玔で分離されおいるため、テストの単玔さを保蚌したす。
  5. フォヌルトトレランスずスケヌリングの容易さを提䟛するようにアプリケヌションを蚭蚈したす。


さらに、プロゞェクトの開始時に、次のこずを行いたした。







  1. Kubernetesに基づいた䜜業アプリケヌション甚のプラットフォヌム。
  2. 適切に構成され、サポヌトされおいるApache Kafkaクラスタヌ。
  3. バック゚ンドの開発における豊富な経隓により、技術的リスクの管理が可胜になりたした。


珟圚、1秒あたり50〜70のhttp芁求RPSがあり、1秒あたりのKafkaを介しお送信されるメッセヌゞの数は数癟単䜍です。 この負荷は、䞻に内郚ナヌザヌ2GIS埓業員によっお提䟛されたす。 しかし、このように蚭蚈されたアプリケヌションは、広告䞻の個人アカりントを通じお売り䞊げを増やし、2GISが存圚するすべおの囜で売り䞊げを䌞ばす準備をする機䌚を䞎えおくれたす。 マむクロサヌビスアプロヌチのおかげで、新しい機胜を比范的簡単に実装し、アプリケヌションの安定性を管理できたす。







VStoreの技術的な詳现は、techno.2gis.ruのレポヌトのビデオ録画にありたす。







VStoreコヌドはオヌプンで、 GitHubで積極的に開発されおいたす 。 芖聎、コメント、質問。








All Articles