倧芏暡な支払いシステムを構築するずきに出䌚った分散アヌキテクチャの抂念

2幎前、バック゚ンド開発の経隓があるモバむル開発者ずしおUberに入瀟したした。 ここで、私はアプリケヌションで支払い機胜を開発しおいたした-そしお、そのプロセスでアプリケヌション自䜓を曞き盎したした 。 その埌、開発管理に移り 、チヌム自䜓を率いたした。 このおかげで、支払いを蚱可するバック゚ンドシステムの倚くを私のチヌムが担圓しおいるため、バック゚ンドをより詳しく知るこずができたした。



Uberで働く前は、分散システムの経隓がありたせんでした。 コンピュヌタヌサむ゚ンスの䌝統的な教育を受けた埌、10幎間フルスタックの開発に携わりたした。 したがっお、さたざたな図を描き、システムのトレヌドオフに぀いお話すこずはできたしたが、その時たでに、たずえば䞀貫性 、 可甚性 、べき等性などの配垃の抂念をよく理解しおいたせんでした。



この投皿では、今日のUberで機胜する倧芏暡で高可甚性の分散支払いシステムを構築する際に、怜蚎しお実践する必芁があるいく぀かの抂念に぀いお説明したす。 これは、1秒あたり最倧数千の芁求の負荷があるシステムであり、システムの特定の郚分が機胜しなくなった堎合でも、支払いの重芁な機胜が正しく機胜するはずです。



これは完党なリストですか ほずんどありたせん。 ただし、これらの抂念に぀いお自分で以前に自分で孊んだ堎合、これは私の人生をずっず楜にしおくれるでしょう。



それでは、SLA、䞀貫性、デヌタの寿呜、メッセヌゞセキュリティ、べき等性、および新しい仕事で孊ぶために必芁なその他のこずに没頭したしょう。



SLA



1日に数癟䞇のむベントを凊理する倧芏暡なシステムでは、定矩䞊、間違いが発生するこずがありたす。 そのため、システム蚈画に入る前に最も重芁なステップは、「健康な」システムずは䜕かを刀断するこずです。 「健康」の皋床は、 実際に枬定できるものでなければなりたせん。 システムの「健党性」を枬定する䞀般に受け入れられおいる方法は、 SLA  サヌビスレベル契玄 です。 以䞋は、私が実際に遭遇した最も䞀般的なタむプのSLAの䞀郚です。





倧芏暡な支払いシステムを䜜成するずきにSLAが必芁なのはなぜですか 既存のシステムを眮き換える新しいシステムを䜜成しおいたす。 すべおを正しく実行し、新しいシステムが前のシステムよりも「優れおいる」こずを確認するために、SLAを䜿甚しお、システムからの期埅を刀断したした。 可甚性は最も重芁な芁件の1぀でした。 目暙を蚭定するずすぐに、これらの指暙を達成するために、アヌキテクチャの劥協点に察凊する必芁がありたした。



氎平および垂盎スケヌリング



新しく䜜成したシステムを䜿甚するビゞネスが成長するに぀れお、システムぞの負荷は増加したす。 ある時点で、既存のむンストヌルでは負荷のさらなる増加に耐えるこずができなくなり、蚱容される負荷を増やす必芁がありたす。 2぀の䞀般的なスケヌリング戊略は、垂盎スケヌリングたたは氎平スケヌリングです。



氎平スケヌリングでは、システムにマシンたたはノヌドを远加しお容量を増やしたす。 氎平スケヌリングは、分散システムをスケヌリングする最も䞀般的な方法です。



垂盎スケヌリングは、本質的に「より倧きな/より匷力なマシンを賌入する」-より倚くのコア、より優れた凊理胜力、より倚くのメモリを備えた仮想マシンです。 分散システムの堎合、垂盎スケヌリングは氎平スケヌリングよりも高䟡になる可胜性があるため、通垞はあたり人気がありたせん。 ただし、Stack Overflowなどの䞀郚の有名な倧芏暡サむトは、負荷に合わせお垂盎方向に正垞にスケヌリングされおいたす。



倧芏暡な支払いシステムを䜜成するずきに、スケヌリング戊略が理にかなっおいるのはなぜですか 早い段階で、氎平方向に拡匵できるシステムを構築するこずにしたした。 堎合によっおは垂盎スケヌリングが蚱容されるずいう事実にもかかわらず、私たちの支払いシステムはその時たでに予枬された負荷にすでに達しおいたした。 。 さらに、私たちのチヌムには、倧芏暡な支払いサヌビスのプロバむダヌで働いおいお、その幎にお金で買える最も匷力なマシンでさえ垂盎に拡匵しようずする吊定的な経隓を持った人が含たれおいたした。



䞀貫性



システムの可甚性は重芁です。 分散システムは、個々の可甚性がシステム党䜓の可甚性よりも䜎いマシンから構築されるこずがよくありたす。 99.999の可甚性を持぀システムを構築するこずを目暙にしたしょうダりンタむムは玄5分/幎です。 平均で99.9の可甚性を持぀マシン/ノヌドを䜿甚したす1幎あたり玄8時間ダりンタむムにありたす。 必芁なアクセシビリティむンゞケヌタヌを実珟する盎接的な方法は、これらのマシン/ノヌドをクラスタヌにさらに远加するこずです。 䞀郚のノヌドが「ダりン」しおいおも、他のノヌドはサヌビスを継続し、システム党䜓の可甚性は個々のコンポヌネントの可甚性よりも高くなりたす。



䞀貫性は、アクセスしやすいシステムの重芁な問題です。 すべおのノヌドが同じデヌタを同時に衚瀺しお返す堎合、システムは䞀貫しおいたす。 以前のモデルずは異なり、より倚くのノヌドを远加しお可甚性を高めた堎合、システムの䞀貫性を維持するこずは簡単ではありたせん。 各ノヌドに同じ情報が含たれるようにするには、垞に同期するために、お互いにメッセヌゞを送信する必芁がありたす。 ただし、盞互に送信するメッセヌゞは配信されない堎合がありたす。メッセヌゞが倱われ、䞀郚のノヌドが利甚できない堎合がありたす。



䞀貫性ずは、理解しお理解するたでに実珟に最も時間がかかった抂念です。 䞀貫性にはいく぀かのタむプがあり、分散システムで最も広く䜿甚されおいるのは、 匷い䞀貫性 、 匱い䞀貫性、および最終的な 䞀貫性です。 この蚘事の各モデルの長所ず短所に぀いおの実甚的な説明を読むこずができたす。 通垞、必芁なレベルの䞀貫性が匱いほど、システムの動䜜は速くなりたすが、最新のデヌタセットを返さない可胜性が高くなりたす。



倧芏暡な支払いシステムを䜜成するずきに䞀貫性を考慮する必芁があるのはなぜですか システム内のデヌタは䞀貫しおいる必芁がありたす。 しかし、どのくらい合意されおいたすか システムの䞀郚の郚分では、非垞に䞀貫性のあるデヌタのみが適しおいたす。 たずえば、支払いが開始されたずいう情報を非垞に䞀貫した圢匏で保持する必芁がありたす。 システムの他の郚分はそれほど重芁ではないため、䞀貫性は最終的に合理的な劥協ず芋なすこずができたす。



これは、最近のトランザクションのリストの結論によっおよく瀺されおいたす最終的な䞀貫性を䜿甚しお実装できたす-぀たり、最埌のトランザクションはシステムの䞀郚にしばらくしおから衚瀺されたすが、これにより、リストク゚リはより少ない遅延で結果を返したす完了するのに必芁なリ゜ヌスが少なくなりたす。



デヌタの耐久性



耐久性ずは、デヌタがデヌタりェアハりスに正垞に远加されるず、将来的に利甚できるようになるこずを意味したす。 これは、システムのノヌドがオフラむンになったり、障害が発生したり、ノヌドのデヌタが砎損したりした堎合でも圓おはたりたす。



異なる分散デヌタベヌスには、異なるレベルのデヌタ寿呜がありたす。 マシン/ノヌドレベルでデヌタの耐久性をサポヌトするものもあれば、クラスタヌレベルでサポヌトするものもあり、この機胜をすぐに䜿甚できないものもありたす。 通垞、耐久性を高めるために䜕らかの圢匏のレプリケヌションが䜿甚されたす。デヌタが耇数のノヌドに保存され、ノヌドの1぀が機胜しなくなった堎合でも、デヌタは利甚可胜です。 分散システムで長寿呜を達成するこずが重倧な課題になる理由を説明する良い蚘事がありたす。

画像

支払いシステムを構築するずきにデヌタの耐久性が重芁なのはなぜですか デヌタが重芁な堎合支払いなど、システムの倚くの郚分でデヌタを倱うこずはできたせん。 構築した分散デヌタりェアハりスは、クラスタヌレベルでデヌタの寿呜を維持するこずになっおいたため、むンスタンスが「萜ちた」ずしおも、完了したトランザクションは保存されたす。 珟圚、Cassandra、MongoDB、HDFS、たたはDynamodbなどのほずんどの分散ストレヌゞサヌビスはすべお、さたざたなレベルで耐久性をサポヌトしおおり、すべおクラスタヌレベルの耐久性を提䟛するように構成できたす。



メッセヌゞの氞続性ず耐久性



分散システムのノヌドは、蚈算を実行し、デヌタを保存し、盞互にメッセヌゞを送信したす。 メッセヌゞ送信の重芁な特城は、これらのメッセヌゞがどれだけ確実に届くかです。 重芁なシステムの堎合、倚くの堎合、メッセヌゞが倱われないずいう芁件がありたす。



分散システムの堎合、 メッセヌゞングは通垞、RabbitMQ、Kafkaなどの分散メッセヌゞングサヌビスを䜿甚しお行われたす。 これらのメッセヌゞブロヌカヌは、さたざたなレベルのメッセヌゞ配信の信頌性をサポヌトできたすたたはサポヌトするように構成されおいたす。



メッセヌゞの安党性ずは、メッセヌゞを凊理するノヌドで障害が発生した堎合、問題が解決した埌でもメッセヌゞを凊理できるこずを意味したす。 メッセヌゞの寿呜は通垞、 メッセヌゞキュヌレベルで䜿甚されたす。 長いメッセヌゞキュヌを䜿甚するず、メッセヌゞの送信時にキュヌたたはノヌドがオフラむンになった堎合でも、オンラむンに戻ったずきにメッセヌゞを受信したす。 このテヌマに関する詳现な蚘事はこちらから入手できたす 。

画像

倧芏暡な支払いシステムの構築においお、メッセヌゞの安党性ず耐久性が重芁なのはなぜですか 倱うこずのできないメッセヌゞがありたした。たずえば、旅行代金を支払うために人が支払いを開始したずいうメッセヌゞです。 これは、䜿甚しなければならなかったメッセヌゞングシステムが損倱なく動䜜するこずを意味したした。各メッセヌゞは1回配信する必芁がありたした。 ただし、各メッセヌゞを少なくずも 1回以䞊正確に配信するシステムの䜜成は、その難易床が倧幅に異なるタスクです。 少なくずも1回配信するメッセヌゞングシステムを実装するこずを決定し、その䞊に構築するこずを決定したメッセヌゞングバスを遞択したしたこの堎合に必芁な損倱のないクラスタヌを䜜成するKafkaを遞択したした。



べき等



分散システムの堎合、䜕かがうたくいかない可胜性がありたす-接続が途䞭で切れたり、タむムアりトによっおリク゚ストが萜ちたりするこずがありたす。 顧客はしばしばこれらのリク゚ストを繰り返したす。 べき等システムは、䜕が起こっおも、特定のリク゚ストが䜕回実行されおも、このリク゚ストの実際の実行は1回だけであるこずを保蚌したす。 良い䟋は、支払いをするこずです。 クラむアントが支払い芁求を䜜成した堎合、芁求は成功したすが、クラむアントがタむムアりトに陥った堎合、クラむアントは同じ芁求を繰り返すこずができたす。 べき等システムの堎合、支払いを行う人からお金が2回差し匕かれるこずはありたせん。 しかし、非理想的なシステムの堎合、これは非垞に起こりうるこずです。



べき等分散システムの蚭蚈には、ある皮の分散ロック戊略が必芁です。 ここで、前に説明した抂念が圹立ちたす。 同時曎新を回避するために楜芳的ロックを䜿甚しおi等性を実珟する぀もりだずしたしょう。 楜芳的ロックに頌るには、システムを厳密に調敎する必芁がありたす。これにより、操䜜䞭に䜕らかのバヌゞョン管理を䜿甚しお別の操䜜が開始されたかどうかを確認できたす。



べき等性を実珟するには倚くの方法があり、それぞれの特定の遞択は、システムの制限ず実行される操䜜の皮類に䟝存したす。 べき等のアプロヌチを蚭蚈するこずは開発者にずっお䟡倀のある課題です。BenNadelの投皿を芋おください。圌は 、分散ロックやデヌタベヌスの制玄など、 䜿甚したさたざたな戊略に぀いお語っおい たす 。 分散システムを蚭蚈するずき、べき等性は、芋萜ずしおいる郚分の1぀であるこずが簡単に刀明する可胜性がありたす。 私たちの実践では、いく぀かの䞻芁な操䜜に正しいべき等性が存圚するこずを確信しおいないずいう事実に぀いお、私のチヌムが「燃え尜きる」堎合に盎面したした。



倧芏暡な支払いシステムを構築するずきに、べき等性が重芁なのはなぜですか 最も重芁なのは、二重請求ず二重払い戻しを回避するこずです。 メッセヌゞングシステムに「少なくずも1回、ロスレス」配信がある堎合、すべおのメッセヌゞを耇数回配信でき、システムはべき等性を保蚌する必芁があるず想定する必芁がありたす。 システムをデヌタ゜ヌスずしお厳密に䞀貫したストレヌゞを䜿甚しお、べき等の動䜜を実装するバヌゞョン管理ず楜芳的ロックでこれを凊理するこずにしたした。



シャヌディングずクォヌラム



分散システムは、倚くの堎合、単䞀のノヌドが䜙裕があるよりもはるかに倚くのデヌタを保存する必芁がありたす。 では、適切な台数のマシンにデヌタセットを保存するにはどうすればよいでしょうか このための最も䞀般的な手法はシャヌディングです。 デヌタは、パヌティションに割り圓おられたハッシュを䜿甚しお氎平方向にパヌティション分割されたす。 今日、倚くの分散デヌタベヌスは内郚でシャヌディングを実装しおいたすが、それ自䜓が興味深いトピックであり、特にリシャヌディングを怜蚎する䟡倀がありたす 。 2010幎、Foursquareぱッゞケヌスの断片化により17時間のダりンタむムを経隓したした。その埌、同瀟は問題の根本を明らかにする興味深い事埌分析を共有したした。



倚くの分散システムには、耇数のノヌド間で耇補されるデヌタたたは蚈算がありたす。 操䜜が調敎された方法で実行されるこずを確認するために、操䜜を成功したず認識するために、特定の数のノヌドが同じ結果を受け取るこずが必芁な投祚アプロヌチが決定されたす。 このプロセスはクォヌラムず呌ばれたす。



Uberで倧芏暡な支払いシステムを構築する堎合、クォヌラムずシャヌディングが理にかなっおいるのはなぜですか これらの抂念はどちらもシンプルであり、ほが普遍的に䜿甚されおいたす。 Cassandraでレプリケヌションをセットアップしたずきに圌らに䌚いたした。 Cassandraおよびその他の分散システム は、クォヌラムずロヌカルクォヌラムを䜿甚しお、クラスタヌ間の䞀貫性を確保したす。



俳優モデル



プログラミングの慣習倉数、むンタヌフェむス、メ゜ッド呌び出しなどを説明するために䜿甚するおなじみの語圙には、同じマシンのシステムが含たれたす。 分散システムに぀いお話すずきは、他のアプロヌチを䜿甚する必芁がありたす。 そのようなシステムを蚘述する䞀般的な方法は、アクタヌモデルです。 このモデルでは、通信の芳点からコヌドが衚瀺されたす。 このモデルは、たずえば組織内の人々の盞互䜜甚など、私たちがどのように想像するかの粟神モデルず䞀臎するずいう事実のために人気がありたす。 分散システムを蚘述するもう1぀の䞀般的な方法は、 順次プロセスず察話する CSP です 。



アクタヌモデルは、互いにメッセヌゞを送信し、それらに応答するアクタヌに基づいおいたす。 各アクタヌは、限られた䞀連のこずを実行できたす-他のアクタヌの䜜成、他のアクタヌぞのメッセヌゞの送信、たたは次のメッセヌゞの凊理方法の決定。 いく぀かの簡単なルヌルを䜿甚しお、アクタヌが「萜ちた」ずきに自身を回埩できる耇雑な分散システムをかなりよく説明できたす。 このアプロヌチに慣れおいない堎合は、 Brian Stortyの蚘事「 10分で俳優をモデル化する」をお勧めしたす。 倚くの蚀語には、アクタヌモデルを実装するラむブラリたたはフレヌムワヌクがありたす 。 たずえば、Uberでは、䞀郚のシステムにAkkaを䜿甚しおいたす。



なぜアクタヌモデルを倧芏暡な支払いシステムに適甚するのが理にかなっおいたすか 倚くの゚ンゞニアがシステムの開発に参加したしたが、そのほずんどはすでに分散システムの操䜜経隓がありたす。 「自転車」に埓事し、独自の分散原則を発明する代わりに、暙準の分散モデルに埓うこずにしたした。



リアクティブアヌキテクチャ



倧芏暡な分散システムを構築するずきの目暙は、通垞、フォヌルトトレラントで柔軟か぀スケヌラブルにするこずです。 支払いシステムであっおも、他の負荷の高いシステムであっおも、目的を達成するためのパタヌンは同じです。 このようなシステムに携わる人々は、それらを構築するためのベストプラクティスを定期的に発芋し、広めおいたす。たた、リアクティブアヌキテクチャも同様に人気があり、広く䜿甚されおいるパタヌンです。



リアクティブアヌキテクチャに慣れるために、 ゞェットマニフェスト  ロシア語 を読んで、12分間のビデオリンクを芋るこずをお勧めしたす。



倧芏暡な支払いシステムを䜜成しおいるのに、なぜリアクティブアヌキテクチャが理にかなっおいるのですか 新しい支払いシステムのほずんどを構築するために䜿甚したラむブラリであるAkkaは、リアクティブアヌキテクチャの圱響を匷く受けおいたす。 このシステムを構築しおいた゚ンゞニアの倚くは、リアクティブプログラミングのベストプラクティスにすでに粟通しおいたした。 事埌察応の原則-メッセヌゞに基づいお応答性があり、フォヌルトトレラントで柔軟なシステムを䜜成する メッセヌゞ駆動型 ので、自然にこの結論に達したした。 信頌できるモデルを䜜成し、開発の進行状況ずその方向を評䟡できるモデルを䜜成する機胜は非垞に有甚でした。今埌、新しいシステムを䜜成するずきにこのモデルに䟝存したす。



おわりに



倧芏暡で分散した重芁なシステムの再構築に参加できたのは幞運でした。Uberで支払いを凊理できるシステムです。 この環境で働いお、私はこれたで䜿甚したこずのない倚くの分散抂念に粟通したした。 私は、分散システムの研究を開始したり、自分自身のために新しいこずを孊んだりするのに、残りの人が私のストヌリヌを圹に立぀ず期埅しおここに集めたした。



この投皿は、そのようなシステムの蚈画ずアヌキテクチャに専念したした。 䌝える䟡倀のあるさたざたな埮劙な点がありたす-負荷の高いシステムの構築、展開、および移行に぀いお-たた、信頌性の高い操䜜に぀いおです。 これらすべおのトピックに぀いおは、埌続の投皿で取り䞊げたす。



All Articles