マむクロサヌビスアヌキテクチャのデヌタ敎合性-分散トランザクションず匷力な接続性なしでデヌタ敎合性を確保する方法

みなさんこんにちは。 ご存知かもしれたせんが、私は以前、ストレヌゞ、Vertica、ビッグデヌタストレヌゞ、およびその他の分析に぀いお曞いお話しおいたした。 珟圚、分析デヌタベヌスだけでなく、OLTPPostgreSQL、NOSQLMongoDB、Redis、Tarantoolなど、他のすべおのデヌタベヌスも私の責任範囲に含たれおいたす。







この状況により、耇数のデヌタベヌスを持぀組織を、1぀の分散した異皮異皮デヌタベヌスを持぀組織ずしお芋るこずができたした。 倚数のPostgreSQL、Redis、およびMongで構成される単䞀の分散異皮デヌタベヌス。たた、堎合によっおは、1぀たたは2぀のVerticaデヌタベヌス。







この単䞀の分散ベヌスの䜜業により、倚数の興味深いタスクが生成されたす。 たず、ビゞネスの芳点から、すべおが正垞であり、デヌタがそのようなベヌスに沿っお移動しおいるこずが重芁です。 敎合性、䞀貫性ずいう甚語は特に䜿甚したせん。 この甚語は耇雑で、DBMSA C IDずC APの定理を考慮する際のニュアンスが異なるため、意味が異なりたす。







䌁業がマむクロサヌビスアヌキテクチャに切り替えようずするず、分散ベヌスの状況は悪化したす。 ネコの䞋で、分散トランザクションや緊密な接続性を持たないマむクロサヌビスアヌキテクチャでデヌタの敎合性を確保する方法に぀いお説明したす。 そしお最埌に、なぜこのむラストを蚘事に遞んだのかを説明したす。













Chris Richardsonマむクロサヌビスアヌキテクチャの最も有名な䌝道者の1人によるず、このアヌキテクチャには、デヌタベヌスを操䜜するための2぀のアプロヌチがありたす共有デヌタベヌスずサヌビスごずのデヌタベヌスです。













共有デヌタベヌスは良い第䞀歩であり、野心的な成長蚈画のない䞭小䌁業にずっおは玠晎らしい゜リュヌションです。 さらに、このパタヌン自䜓は、マむクロサヌビスアヌキテクチャの芳点からはアンチパタヌンです。 共通のベヌスを共有する2぀のサヌビスを個別にテストおよびスケヌリングするこずはできたせん。 ぀たり むしろ、これらのサヌビスはモノリスになる傟向がある1぀のサヌビスです。







デヌタベヌスごずのサヌビスパタヌンは、各サヌビスに独自のデヌタベヌスがあるこずを前提ずしおいたす。 サヌビスは、そのデヌタベヌスに盎接接続するこずなく、APIを介しお広い意味で別のサヌビスのデヌタにアクセスできたす。







デヌタベヌスごずのパタヌンを䜿甚するず、察応するサヌビスのチヌムが奜きなようにデヌタベヌスを遞択できたす。 誰かがMongoDBを䜿甚できる、誰かがPostgreSQLを信じる、誰かがRedisを必芁ずするこのサヌビスではシャットダりン時のデヌタ損倱のリスクは蚱容できる、そしお誰かは通垞ディスク䞊のCSVファむルにデヌタを保存するそしお実際、なぜ、いいえ。













このようなデヌタベヌスの「動物園」で䜜業するず、デヌタの順序をたったく新しいレベルの耇雑さに埩元するタスクが発生したす。







ACIDおよびマむクロサヌビスアヌキテクチャ



DBMSベヌスの叀兞的なACID芁件セットのプリズムを通しお物事を敎理するタスクを芋おみたしょう。略語の各文字の本質を拡倧し、マむクロサヌビスアヌキテクチャにおけるこの文字の難しさを説明したす。







ACID-原子性。 原子性-すべおたたは䜕もない。







アトミック性の芁件に埓っお、すべおのステップを可胜な繰り返しで完了するこずが䞍可欠です。重芁なステップが倱敗した堎合、完了したステップをキャンセルしたす。







䞊蚘の図は、VIPサヌビスを賌入するテストプロセスを瀺しおいたすお金は請求1で予玄され、ボヌナスサヌビス2はナヌザヌに察しお有効化され、ナヌザヌの皮類はPro3に倉曎され、請求で予玄されたお金は匕き萜ずされたす4。 4぀のステップはすべお完了する必芁がありたす。













同時に、プロセスの途䞭でハングするこずはできたせん。したがっお、非同期が望たしいです。極端な堎合は、組み蟌みのタむムアりトずの同期が必芁です。







ACID-䞀貫性。 䞀貫性-各ステップは境界条件ず矛盟するべきではありたせん。







たずえば、サヌビス1のクラむアントAからサヌビス2のクラむアントBに送金するための条件の叀兞的な䟋このような送金の結果ずしお、以䞋送金䞭にお金を倱っおはいけたせん以䞊2人のナヌザヌに同じお金を送っおはいけたせん同時に。 この芁件に準拠するには、条件をどこかにコヌディングし、条件のデヌタを確認する必芁がありたす理想的には、远加の呌び出しなしで。













ACID-耐久性。 耐久性の芁件は、操䜜の圱響が消えないこずを意味したす。







Polyglotの氞続性の条件䞋では、サヌビスはデヌタベヌスで動䜜し、デヌタベヌスに蚘録されたデヌタを定期的に「倱う」こずがありたす。 非同期レプリケヌションが有効になっおいる堎合、PostgreSQLなどの堅牢なデヌタベヌスからも同様のトリックを取埗できたす。 この図は、マスタヌに蚘録されたが、非同期レプリケヌションを介しおスレヌブに到達しなかった倉曎を、マスタヌサヌバヌを焌き付けるこずによっお砎棄する方法を瀺しおいたす。 耐久性の芁件を確保するには、このような損倱を適切に蚺断しお回埩できる必芁がありたす。













そしお、私はどこにいたすか







そしおどこにもありたせん。 いく぀かの独立した非同期サヌビスの環境での分離は技術的な芁件です。 珟代の研究は、実際のビゞネスプロセスを分離せずに実装できるこずを瀺しおいたす。 分離は同時実行性を最小限に抑えるこずで思考を簡玠化したすプログラマヌにずっお䞊列コンピュヌティングの開発はより困難ですが、マむクロサヌビスアヌキテクチャは本質的に倧芏暡な䞊列であり、そのような環境での分離は冗長です。







䞊蚘の芁件ぞのコンプラむアンスを達成するための倚くのアプロヌチがありたす。 いわゆる2フェヌズコミット2PCによっお提䟛される分散トランザクションの最も広く知られおいるアルゎリズム。 残念ながら、2フェヌズコミットを実装するには、関連するすべおのサヌビスを曞き換える必芁がありたす。 そしお最も深刻なのは、このアルゎリズムの生産性があたり高くないこずです。 最近の研究の䞊蚘の図は、このアルゎリズムが2台のサヌバヌの分散ベヌスで特定のパフォヌマンスを瀺しおいるこずを瀺しおいたすが、サヌバヌの数が増えるず、生産性は盎線的に増加したせん...より正確には、たったく増加したせん。













マむクロサヌビスアヌキテクチャの䞻な利点の1぀は、サヌバヌを远加するだけでパフォヌマンスを盎線的に向䞊できるこずです。 分散敎合性を確保するために2フェヌズコミットを䜿甚するず、サヌバヌの数が増えおも、このプロセスがボトルネックになり、生産性の向䞊を制限するこずになりたす。







2段階のコミットなしで、パフォヌマンスを盎線的に拡匵する機胜を備えた分散敎合性ACiD芁件をどのように確保できたすか







珟代の研究たずえば、 分散同時実行制埡の評䟡。VLDB2017 は、いわゆる「楜芳的アプロヌチ」が圹立぀ず䞻匵しおいたす。 2フェヌズコミットず䞀般化された「楜芳的アプロヌチ」の違いは、旧゜ビ゚ト店カりンタヌ付きずAuchanのような珟代のスヌパヌマヌケットの違いによっお説明できたす。 カりンタヌのある店舗では、すべおの顧客が疑わしいず芋なされ、最倧限のコントロヌルが提䟛されたす。 したがっお、線ず競合。 そしお、スヌパヌマヌケットでは、買い手はデフォルトで正盎であるず芋なされ、棚に近づいおカヌトを埋める機䌚を䞎えたす。 もちろん、詐欺垫カメラ、セキュリティを捕たえるための監芖ツヌルがありたすが、ほずんどの買い手はそれらに察凊する必芁はありたせん。







したがっお、より倚くのキャッシュデスクを配眮するだけで、スヌパヌマヌケットを拡倧、拡匵できたす。 マむクロサヌビスアヌキテクチャでも同じこずが蚀えたす。分散型の敎合性が「楜芳的なアプロヌチ」によっお保蚌されおいる堎合、䜕か問題が発生したプロセスだけにチェックが远加でロヌドされたす。 たた、通垞のプロセスでは远加のチェックは行われたせん。







重芁です。 「楜芳的アプロヌチ」には、いく぀かのアルゎリズムが含たれたす。 クリス・リチャヌド゜ンが掚奚する、分散完党性を維持するためのアルゎリズムであるサガに぀いおお話ししたいず思いたす。







Sagas-アルゎリズムの芁玠



sagアルゎリズムには2぀のオプションがありたす。 したがっお、最初に、アルゎリズムの必芁な芁玠を普遍的に説明しお、䞡方のオプションに適したものにするようにしたす。







芁玠1.サヌビス間の信頌性の高い氞続的なむベント配信チャネル。「少なくずも1回の配信」を保蚌したす。 ぀たり プロセスのステップ2が正垞に完了した堎合、これに関する通知むベントが少なくずも1回ステップ3に到達し、配信の繰り返しは蚱容されたすが、䜕も倱われるべきではありたせん。 「氞続的」ずは、デヌタベヌスが倱われたために最新の倉曎を倱ったサヌビス図のステップ2である耐久性の䟋を参照が埩元できるように、チャネルが通知を䞀定期間週に2〜3日保存する必芁があるこずを意味したすこれらの倉曎は、チャネルからむベントを再生するこずによっお行われたす。













芁玠2.䞀意のi等性キヌを䜿甚したサヌビス呌び出しのdem等性。 私ナヌザヌがVIPパッケヌゞの賌入プロセスを開始するず想像しおくださいアトミック性の䟋を参照。 プロセスの開始時に、䞀意のキヌ、たずえば42のi等性キヌが䞎えられたす。次に、各ステップ1→2→3→4ぞの呌び出しを、i等性キヌを指定しお実行する必芁がありたす。 䞊蚘の段萜では、同じメッセヌゞがサヌビスにステップで繰り返し到着する可胜性が蚀及されおいたす。 サヌビスステップは、凊理されたむベントの繰り返し到着を自動的に無芖し、べき等キヌによる繰り返しをチェックできる必芁がありたす。 ぀たり、すべおのサヌビスプロセスステップがべき等である堎合、AtomicityおよびDurabilityの芁件を満たすためには、チャネルからのむベントに察応するステップにリダむレクトするだけで十分です。 むベントをスキップしたステップはそれらを完了し、既にむベントを完了したステップは、べき等性のためにそれらを無芖したす。













芁玠3.べき等キヌによるサヌビス呌び出しステップのキャンセル。







アトミック性䟋を参照を確保するために、たずえば、dem等性キヌ42のプロセスがステップ3で停止/䜎䞋した堎合、キヌ42のステップ1および2の正垞な実行をキャンセルする必芁がありたす。このため、必須の各プロセスステップには「補償」ステップが必芁です、指定されたべき等キヌ42に必芁なステップの実行をキャンセルするAPIメ゜ッド。 代償呌び出しの実装は、サグアルゎリズムの実装の䞀郚ずしおのサヌビスの掗緎においお困難ですが必芁な芁玠です。













䞊蚘の3぀の芁玠は、「サグ」の実装の䞡方のバヌゞョンに関連しおいたすオヌケストラずコレオグラフィック。







オヌケストラサガ



オヌケストレヌションされたサガのより単玔で明癜なアルゎリズムは、理解ず実装が簡単です。 優れた蚘事で、 KevteevはAvitoで線成されたサガのメカニズムのアルゎリズムず実装プロセスに぀いお説明したした。 圌らのアルゎリズムは、サヌビス察象ビゞネスプロセスの䞀郚ずしおサヌビス呌び出しを「調敎」する制埡サヌビスの存圚を前提ずしおいたす。 同じ監芖サヌビスに独自のデヌタベヌスたずえば、PostgreSQLがあり、信頌できる氞続的なむベント配信チャネル芁玠1ずしお機胜したす。







振り付けサガ



振り付けの物語はもっずトリッキヌです。 ここで、次の芁件を実装するデヌタバスは、信頌できる氞続的なチャネルずしお機胜する必芁がありたす。fire-and-forgetpublishing、publish-subscribeむベント配信、少なくずも1回の配信。 ぀たり 各プロセスの各ステップは、バスから操䜜するコマンドを受け取り、成功した実行、次のステップの開始に関するメッセヌゞをそこに投げお、バスからそれを読み取っおプロセスを続行する必芁がありたす。 さらに、各メッセヌゞには耇数のサブスクラむバヌが存圚する堎合がありたす。







振り付けの物語には、制埡サヌビス、サガのサヌビスも必芁ですが、かなり「軜量」です。 サヌビスは、システムに登録されおいるビゞネスプロセス、各プロセスに含たれるステップの構成に぀いお知っおいる必芁がありたす。 たた、バスに耳を傟け、各プロセス各べき等性キヌの実行を監芖し、䜕か問題が発生した堎合にのみ、特定のステップの「繰り返し」を行うか、実行したステップの「キャンセル」、「補償」を行いたす。







ニュアンス



叀兞的な取匕ず区別するサガの最も重芁なニュアンスの1぀は、各ステップの線圢性、順序、および矩務からの逞脱です。 サガは必ずしもむベントの線圢チェヌンではなく、有向グラフでもかたいたせん新しいナヌザヌ登録むベントは、いく぀かのステップを䞊行しお生成できたすSMSの送信、ログむンの登録、パスワヌドの生成、電子メヌルの送信。その䞀郚はオプションです。 最初の近䌌では、オプションのステップを備えたこのような「分岐」サガでは、サガプロセスの完了を刀断するこずは困難であるように芋えたすが、実際にはすべおが単玔ですサガプロセスはすべおの必芁なステップが任意の順序で完了するず完了したす。













振り付けサガではより兞型的ですが、オヌケストラのサガでは可胜性のある2番目のニュアンスは、ビゞネスプロセス、サガサヌビスでのサガのタむプを登録する方法を遞択するこずです。 Atomicityの䟋では、4぀の連続した必須ステップのプロセスを説明しおいたす。







誰がこのプロセスを登録し、すべおのステップを瀺し、䟝存関係ず必須ステップを配眮したしたか 明らかですが、昔ながらの答えは、プロセス登録はsagサヌビスの䞭倮で行う必芁があるずいうこずです。 しかし、この答えはマむクロサヌビスアヌキテクチャずあたり敎合性がありたせん。 マむクロサヌビスアヌキテクチャでは、ボトムアッププロセスの登録がより有望で、生産性が高く、高速です。 ぀たり サグサヌビスのプロセスのすべおのニュアンスを曞き留めるのではなく、個々のサヌビスが既存のプロセスに独自に「適合する」ようにし、それらのバむンディング/オプションの性質ず必須の先行を瀺したす。







぀たり ナヌザヌをサグサヌビスに登録するプロセスは、最初は3぀のステップで構成できたす。その埌、システムの開発䞭に、さらに7぀のステップが収たり、1぀のステップが曞き​​出され、9぀ありたす。 このような「アナヌキヌ」および「分散」スキヌムは、厳密な調敎プロセスを実装するためにテストするのが困難ですが、アゞャむルチヌムにずっおは、継続的な倚方向の補品進化にずっおはるかに䟿利です。







実はここ。 真剣なプレれンテヌションで、私はそれを終了する䟡倀があるず思いたす。










この資料のプレれンテヌションぞのリンクは次のずおりです。HighloadSiberia 2018でこのトピックに関するレポヌトを䜜成したした。

UPD-および䌚議のビデオ












゚ピロヌグ



最埌に、䞊蚘のすべおをより比language的な蚀語で説明したいず思いたす。

結局のずころ、サガずは元々䜕ですか このプロット、この䞭䞖からの冒険...たたはゲヌム・オブ・スロヌンズから。 むベントが発生し戊闘、結婚匏、誰かが死亡、このニュヌスはメッセンゞャヌ、䌝曞鳩、商人を通しお䞖界䞭に飛びたす。 1週間、1か月、1幎で興味のある人にニュヌスが届くず、圌らは反応したす。軍隊を送り、戊争を宣蚀し、誰かを凊刑し、新しいメッセヌゞが飛びたす。







アクションのシヌケンスを監芖する芏制機関はありたせん。 アクションを取り消すずいう意味でのトランザクション、ロヌルバックはありたせん。 すべお倧人の方法で、すべおのアクションは氞遠に行われたす。 それは補償するこずができたすが、それは正確に行動殺人ず補償頭の支払い、ビラであり、死の廃止ではありたせん。







むベントは長い時間がかかり、さたざたな゜ヌスから発生し、アクションは厳密に連続しおではなく、䞊行しお発生したす。 そしお、かなり頻繁に、新しい参加者が突然プロットに珟れ、参加するこずを決定したすドラゎンが到着したす;...そしお、叀い参加者のいく぀かは突然死にたす。







そのようなこず。 混乱ず混乱のように芋えたすが、すべおが機胜し、䞖界の内郚の䞀貫性が壊れおおらず、プロットが発展しおおり、䞀貫しおいたす...時には予枬䞍可胜です。








All Articles