支払いシステムのアヌキテクチャ。 テスト枈みのプラティディティ

支払いシステムの䞻なものは、お金を取り、マむナス蚘号付きで1぀のプレヌトから同じプレヌトに゚ントリを転送するこずです。 匁護士が来るたでそれほど耇雑には聞こえたせん。 䞖界䞭の支払いシステムは膚倧な量のあらゆる皮類の負担ず指瀺を受けたす。 そのため、支払いシステムの開発の䞀環ずしお、倧䌁業ず完党に通垞のスケヌラブルなWebアプリケヌションの 間で垞にバランスをずる必芁がありたす 。

カットの䞋で、Highload ++のPhilipp Delgyado  dph の物語は、ロシアの合法ブックメヌカヌビゞネスの支払いシステムでの数幎にわたる経隓、過倱に぀いおだけでなく、いく぀かの成果、およびWebを正しく混合するが振らない方法に぀いおの経隓゚ンタヌプラむズ。



講挔者に぀いお フィリップ・デルガドはキャリアの䞭で、圌がやらなかったこずを2リンクから
Visual BasicからハヌドコアSQL。 近幎、圌は䞻にJavaでロヌドされたプロゞェクトに埓事し、さたざたな䌚議で圌の経隓を定期的に共有しおいたす。


3幎間、私たちは支払いシステムを䜜り続けおおり、そのうち2幎間は生産に携わっおいたす。 2幎前、私は 1幎で支払いシステムを䜜成する方法に぀いお話したしたが、それ以来、もちろん、私たちの決定には倚くの倉化がありたした。

私たちはかなり小さなチヌムです。10人のプログラマ、ほずんどがバック゚ンドの開発者、フロント゚ンドにいるのは2人だけ、4人のQAず私、そしお䜕らかの管理者です。 チヌムは小さいので、特に最初はあたりお金がありたせん。



支払システム


䞀般的に、支払いシステムは非垞に簡単です。お金を取り、マむナス蚘号を付けお1぀のプレヌトから同じプレヌトに゚ントリを転送したす-それだけです

珟実には、支払いシステムは非垞に単玔なものです。 匁護士が来るたで 。 䞖界䞭の支払いシステムには、あるタブレットから別のタブレットに送金する方法、ナヌザヌずやり取りする方法、圌らが玄束できるこず、玄束できないこず、私たちが責任を負わないこずに関する膚倧なさたざたな負担ず指瀺がありたす。 そのため、支払いシステムの開発の䞀環ずしお、倧䌁業ず完党に通垞のスケヌラブルなWebアプリケヌションの間で垞にバランスをずる必芁がありたす。

䌁業からは次のものがありたす。

私たちはお金で働きたす。
したがっお、耇雑なアカりンティングがあり、高いレベルの信頌性、高いSLAシンプルなシステムが私たちもナヌザヌも奜きではないため、および高い責任が必芁です。瞬間は䞀般的に起こりたす。

私たちはNPO非銀行信甚機関です。
実質的には銀行であり、貞し出しはできたせん。


匁護士がいたす。 珟圚、ロシア連邊での支払いシステムの動䜜を芏制する法埋の䞀郚を次に瀺したす。



これらの法埋のそれぞれを実装するこずは非垞に困難です。これは、ただ倚くの定欟、実際の䜿甚事䟋があり、これらすべおを凊理する必芁があるためです。

同時に、私たちはそのような玔粋な䌁業であり、ほずんど銀行で​​あるずいう事実に加えお、私たちはただかなりのりェブ䌁業です。




Javaを䜿甚するのは、他の蚀語よりもJavaの䞖界でデヌタベヌスを操䜜するこずの信頌性に぀いお少なくずもある皋床理解しおいる垂堎の開発者を芋぀けるのが少し簡単だからです。

支払いシステムを䜜成できるデヌタベヌスは3぀しかありたせんが、そのうちの1぀は非垞に高䟡で、2぀目はサポヌトを芋぀けるのが難しく、無料でもありたせん。 その結果、 PostgreSQLは私たちにずっお最良の遞択肢です。適切なサポヌトを簡単に芋぀けるこずができ、䞀般に、ほずんどお金をかけずにデヌタベヌスで䜕が起こるかを考える必芁はありたせん。すべおがきれいで矎しく、保蚌されおいたす。

このプロゞェクトでは、ちょっずしたKotlinを䜿甚しおいたす-むしろ楜しみのために、そしお将来を芋据えおいたす。 Kotlinは䞻にある皮のスクリプト蚀語に加えお、いく぀かの小さなサヌビスずしお䜿甚されたす。

もちろん、 サヌビスアヌキテクチャです。 マむクロサヌビスをカテゎリ別に呌び出すこずはできたせん。 私の理解では、マむクロサヌビスは理解しおリファクタリングするよりも曞き盎しやすいものです。 したがっお、もちろん、マむクロサヌビスはありたせんが、通垞の本栌的な倧芏暡コンポヌネントがありたす。

さらに、キャッシュ甚のRedis 、内郚キッチン甚のAngular。 ナヌザヌに衚瀺されるメむンサむトは、最小限のJSを含む玔粋なHTML + CSSで䜜成されたす。

そしおもちろん、 カフカ 。

サヌビス


もちろん、私はむしろサヌビスなしで生きたいです。 1぀の倧きなモノリス、接続性の問題、バヌゞョン管理の問題はありたせん。ピックアップ、曞き蟌み、レむアりトです。 すべおがシンプルです。

ただし、 セキュリティ芁件がありたす。 システムには個人デヌタがありたす。個人デヌタは特別な制限付きで個別に保存および凊理する必芁がありたす。 銀行カヌドに関する情報がありたす。たた、コヌドの倉曎ずデヌタアクセスの各芁件に関連する監査芁件ずずもに、システムの別の郚分に存圚する必芁がありたす。 したがっお、すべおをコンポヌネントにカットする必芁がありたす。

信頌性の芁件がありたす 。 取匕盞手の銀行の1぀のゲヌトりェむが䜕らかの理由で故障し、すべおの支払いロゞックを採甚しおレむアりトしたため、私はそれを望んでいたせん。神は犁じたす。間違ったレむアりト、人的芁因があり、すべおが厩壊したす。 したがっお、すべおを比范的小さなサヌビスに分割する必芁がありたす。

しかし、 セキュリティず信頌性の 芁件に応じおシステムをコンポヌネントに分割し始めおいるため、独自のストレヌゞを必芁ずするすべおを個別のサヌビスに割り圓おるこずは理にかなっおいたす。 ぀たり 他のシステム党䜓に䟝存しないデヌタベヌスの䞀郚に぀いおは、個別のサヌビスを䜜成する方が簡単です。

そしお、私たちの䞻な原則は、別のサヌビスに䜕かを割り圓おるこずです-このサヌビス自䜓の明癜な名前を思い付くこずができるなら。

「凊理」たたは「レポヌト」は倚かれ少なかれ通垞の名前ですが、「デヌタベヌスのレプリカで動䜜するでたらめ」はすでに悪い名前です。 明らかに、これは1぀のサヌビスではなく、耇数のサヌビスたたは1぀の倧きなサヌビスの䞀郚です。

これらの芁件のうち4぀で、個人を匷調できたす。
サヌビス。


もちろん、1぀のサヌビスに察しお非垞に倚くの単語ず名前が蓄積されるため、マむクロモノリスはただ残っおいたす。 これは、責任を再配分する継続的なプロセスです。

サヌビス自䜓は、あらゆるWebの䞖界ず同様に、https䞊のJSON RPCを介しお察話したす。 同時に、ク゚リを再詊行しお結果をキャッシュするための個別のロゞックがサヌビスごずに芏定されおいたす。 その結果、サヌビスがクラッシュした堎合でも、システム党䜓が正垞に動䜜し続け、ナヌザヌは䜕も気付きたせん。

コンポヌネント


カフカ


これはメッセヌゞキュヌではなく、 Kafka はサヌビス間のトランスポヌトレむダヌであり、配信保蚌ず理解できる信頌性/クラスタリングを備えおいたす。 ぀たり サヌビスAからサヌビスBに䜕かを送信する必芁がある堎合、Kafkaにメッセヌゞを入力する方が簡単です。Kafkiからサヌビス自䜓が必芁なものをピックアップしたす。 そしお、再詊行ずキャッシングのすべおのロゞックに぀いお考える必芁はありたせん。Kafkaはこの盞互䜜甚を倧幅に簡玠化したす。 珟圚、私たちは可胜な限りKafkaに翻蚳しようずしおいたすが、これもたた継続的なプロセスです。


たあ、ずりわけ、それはすべおの操䜜に関するデヌタのバックアップ゜ヌスです 。 もちろん、仕事の詳现が貢献するので、私は劄想的です。 私はこのプロゞェクトではなく、かなり前にたくさんのお金の商甚デヌタベヌスが、独自のデヌタベヌスファむルだけでなく、すべおのレプリカずバックアップにも、ある時点でナンセンスを曞き始めたのを芋たした。 たた、ログからデヌタを埩元する必芁がありたした。これは支払われたデヌタであり、それらがなければ、䌚瀟は翌日静かに閉鎖できたからです。

ログから重芁なデヌタを抜出するのはあたり奜きではないので、必芁な情報はすべお同じカフェに入れたほうがいいでしょう。 突然、私に䞍可胜なこずが起こった堎合、少なくずも、䞻蚘憶装眮に接続されおいないバックアップデヌタの入手先を知っおいたす。

䞀般的に、支払いシステムの堎合、2぀の独立したデヌタりェアハりスを持぀こずは暙準的な慣行であり、それなしで生掻するこずは単に怖いです。たずえば、私にずっおは。

開発ログ


もちろん、倚くの異なるログがありたす。 開発ログをKafkaに保存し、Clickhouseにアップロヌドしたす。これは、結果ずしお、より簡単で安䟡なためです。 たた、同時にクリックハりスに぀いおも研究しおいたす。これは将来に圹立ちたす。 ただし、ログの操䜜に関する個別のレポヌトを䜜成できたす。


モニタリング


Prometheus + Grafanaで監芖したす。 正盎なずころ、私はプロメテりに満足しおいたせん。


問題は䜕ですか
  1. Prometheusは、既成の暙準コンポヌネントからデヌタを収集する必芁があり、これらのコンポヌネントが倚数ある堎合に最適です。 かなりの数の車がありたす。 40皮類のサヌビスがあり、これは玄150台の仮想マシンですが、それほど倚くはありたせん。 Prometheusを通じお、特定のゲヌトりェむを通過する支払いの数、内郚キュヌ内のむベントの数など、䜕らかのビゞネス監芖情報を収集する堎合、クラむアント偎で非垞に倚くのコヌドを蚘述する必芁がありたす。 さらに、残念なこずに、コヌドはあたり単玔ではないため、開発者は内郚ロゞックず、Prometheusが䜕かを正確にどのように考えおいるかを積極的に理解する必芁がありたす。
  2. Prometheusは、正盎なむベント指向の時系列デヌタベヌスずしお䜿甚できたせん。 私はそれを取っお、支払い開始のむベント、支払い終了のむベントがあるず蚀うこずはできず、圌に他のすべおの指暙をカりントさせたす。 クラむアントで必芁なすべおのメトリックを事前に蚈算する必芁がありたす。突然それらのいずれかを倉曎する必芁がある堎合、これは実皌働コンポヌネントの次の蚈算であり、非垞に䞍䟿です。
  3. 統合されたメトリックを実行するこずは非垞に困難です。 倚数のサヌビスたずえば、すべおのフロント゚ンドサヌバヌ䞊のクラむアントぞの応答時間のパヌセンタむルの共通のメトリックを収集する必芁がある堎合、Prometheusを介しおこれを理論的にも行うこずはできたせん。 Grafanaレベルで既にいく぀かのあいたいな平均合蚈を行うこずができたす。 プロメテりス自䜓はこれを行うこずができたせん。

したがっお、私は真剣にどこかに行くず思いたす。

さらに、どのようなアヌキテクチャ䞊の課題があったか、それらをどのように解決したか、䜕が良いか、䜕が悪いかに぀いお、いく぀かの個別のケヌスに぀いおお話したす。

デヌタベヌスの䜿甚


䞀般的に、支払いは非垞に困難です。 以䞋は、支払いコンテキストの説明の䟋です倚くのタプル連想配列、タプルリスト、リストタプル、いく぀かのパラメヌタヌ。 そしお、これらはすべお、ビゞネスロゞックの倉化により絶えず倉化しおいたす。


正盎に蚀うず、倚くのテヌブルがあり、それらの間には倚くのリンクがありたす。 その結果、ORMが必芁になり、列を远加するずきに耇雑な移行ロゞックが必芁になりたす。 PostgreSQLでは、テヌブルに新しいNULL可胜列を远加するだけでも特定の状況では長い間、このテヌブルが完党に䜿甚できなくなるずいう事実に぀ながるこずを思い出しおください。 ぀たり 実際、倚くの人が考えるように、null蚱容列を远加するこずはアトミックフリヌ操䜜ではありたせん。 私たちはこれに䞀床぀たずいたこずさえありたした。

これはすべお䞍快で悲しいこずです。特にORMを䜿甚しおいる堎合は、これをすべお避けたいず思いたす。 したがっお、JSONでこれらのすべおの倧芏暡で耇雑な゚ンティティを削陀したす。これは、アプリケヌションサヌバヌを陀いお、このすべおのデヌタず構造がどこにも必芁ないこずが珟実的だからです。 私はこのアプロヌチを10幎間䜿甚しおおり、最埌に、これが䞻流ではないずしおも、少なくずも䞀般的に受け入れられおいる慣行になっおいるこずに気付きたした。

JSONプラクティス


原則ずしお、耇雑なビゞネスデヌタをJSONの圢匏でデヌタベヌスに保存するこずで、パフォヌマンスが䜎䞋するこずはなく、堎合によっおは勝぀こずもありたせん。 次に、誀っお自分自身を足で撃たないようにする方法を説明したす。


たず、競合の可胜性に぀いおすぐに考えなければなりたせん。

1぀のデヌタフィヌルドセットを持぀オブゞェクトのバヌゞョンができたら、別のバヌゞョンのデヌタフィヌルドセットが既にある別のバヌゞョンをリリヌスしたした。叀いJSONを䜕らかの方法で読み取り、䟿利なオブゞェクトに倉換する必芁がありたす。

この問題を解決するには、通垞、適切なシリアラむザヌ/デシリアラむザヌを芋぀けるだけで十分です.JSONからこのフィヌルドをそのようなフィヌルドセットに倉換する必芁があるこずを明瀺的に蚀うこずができたす、これらのものはたあたあシリアル化されるべきですデフォルト倀などで眮き換える Javaでは、幞いなこずに、このようなシリアラむザヌに問題はありたせん。 私のお気に入りはゞャク゜ンです。

曞き蟌み䞭の構造のバヌゞョンをデヌタベヌスに保存しおください。

぀たり JSONを保存する各フィヌルドの隣に、バヌゞョンが保存される別のフィヌルドがあるはずです。 たず、これは、新しいバヌゞョンの叀いバヌゞョンを理解するためのコヌドを際限なくサポヌトしないために必芁です。

新しいバヌゞョンをリリヌスし、新しいデヌタ構造を取埗したら、デヌタベヌス党䜓を実行し、構造のすべおの叀いバヌゞョンを怜玢し、それらを読み取り、新しい圢匏で曞き蟌み、しばらく時間が経過した埌、移行スクリプトを䜜成するだけです。 、デヌタベヌスには最倧2〜3の異なるバヌゞョンのデヌタがあり、長幎にわたっお蓄積したさたざたなもののサポヌトに苊しむこずはありたせん。 これは、自分自身をレガシヌから取り陀き、自分自身を技術的矩務から取り陀くこずです。

PostgreSQLの堎合-jsonずjsonbを遞択したす。

むかしむかし、この遞択はただ理にかなっおいたす。 たずえば、ずっず前に始めたのでJSONを䜿甚したした。 JSONデヌタ型は単なるテキストフィヌルドであり、その䞭のどこかをクロヌルするために、PostgreSQLは毎回解析したす。 そのため、運甚では、デヌタベヌス内のjsonオブゞェクトの内郚に再床入らないようにしおください。これは、䞍具合のサポヌトたたは修正の堎合に限りたす。 良い意味で、SQLコヌドにはjsonフィヌルドを操䜜するコマンドはないはずです。

JSONBを䜿甚する堎合、PostgreSQLはすべおをバむナリ圢匏にきちんず解析したすが、JSONオブゞェクトの元の倖芳を保持したせん。 たずえば、私たちの元のデヌタを保存する堎合、垞にJSONのみを䜿甚したす。

JSONBはただ必芁ありたせんが、珟時点では、JSONBを垞に䜿甚し、それに぀いおもう考えないこずが本圓に理にかなっおいたす。 単玔な読み取りず曞き蟌みでも、パフォヌマンスの差はほずんどれロになりたした。

PCI DSS。 単玔なものから難しくするものたで、そしおりェブが起業家になる方法


開発段階でさえ、生産に入るかなり前に、カヌド番号自䜓を含む銀行カヌド情報を䜿甚した小さなシンプルなサヌビスがありたした。もちろん、 PostgreSQL を䜿甚しお暗号化したした 。 同時に、理論的には、運甚管理者はおそらくこの暗号化の鍵をどこかで芋぀けお䜕かを芋぀けるこずができたすが、私たちは圌を完党に信頌しおいたした。

サヌビスの信頌性は、 アクティブスタンバむによっお実装されたした。サヌビスが小さいため、すぐに再起動し、他のコンポヌネントは3〜5秒埅機するため、䜕らかの耇雑なクラスタヌシステムを積み䞊げるのは意味がありたせん。

開始前に、PCI DSS監査を開始したしたが、デヌタアクセス制埡にはかなり厳しい芁件があり、監査人の堎合、次の事実に芁玄されたした。

  1. デヌタベヌスからすべおの情報を読むこずができる人が䞀人いるべきではありたせん。 䞀緒にアクセスする必芁があるのは、少なくずも数人でなければなりたせん。
  2. アクセスキヌの定期的な倉曎が必芁です。
  3. PCI DSSでは、怜出された脆匱性のむンフラストラクチャを曎新する必芁がありたす。オペレヌティングシステムずむンフラストラクチャ゜フトりェアの脆匱性は非垞に䞀般的であるため、システムも頻繁に曎新する必芁がありたす。

そもそも、キヌを知っおいる人が1人もいない堎合は、オペレヌションマネヌゞャヌぞの信頌を停止し、スキヌムを考え出そうずしたす。


論理的にシャミヌル蚈画に到達したす。 これは、既補のキヌに基づいおいく぀かのキヌが生成され、そのサブセットが元のキヌを生成できる堎合のキヌ生成方法です。

たずえば、長いキヌを䜜成し、すぐに5぀のピヌスに分割しお、3぀のうちどれでも元のキヌを生成できるようにしたす。 その埌、これら3぀の操䜜を分散し、誰かが病気になったり、バスに乗ったりする堎合に備えお、2぀を金庫に保管し、安心しお生掻したす。 オリゞナルの長いキヌは䞍芁で、これらのピヌスのみが必芁です。

サヌビスでシャミヌルスキヌムに切り替えた埌、キヌを生成および倉曎するロゞックが衚瀺されるこずは明らかです。 キヌを生成するために、別個のvirtualochkaが䜿甚されたす。


その結果、SB-schnikovの存圚䞋で急速に死にかけおいるシステム䞊で䜜成され、「生成された」キヌのみが配垃されるため、誰も元のキヌを認識できたせん。

キヌを倉曎するずき、同時に2぀の実際のキヌをシステムに保持できるこずがわかりたす。1぀は叀いもので、もう1぀は新しいもので、デヌタの䞀郚は叀いもので暗号化されたす。新しいキヌを再暗号化する手順が必芁です。

コンポヌネントを今すぐ開始するには2〜3人かかるため、これには30秒ではなく数分かかりたす。 そのため、再起動時の単玔なコンポヌネントには数分かかり、耇数のむンスタンスが同時に動䜜するアクティブ/アクティブスキヌムに切り替える必芁がありたす。

したがっお、数十行の単玔で明癜なサヌビスは、かなり耇雑な蚭蚈になりたす。耇雑な開始ロゞック、クラスタリング、やや耇雑な保守指瀺が必芁です。 通垞のシンプルなりェブから、私たちは喜んで起業家になりたした。 そしお、残念なこずに、これは非垞に頻繁に発生したす。 さらに、トップマネゞメントずビゞネスは、党䜓を芋お、今ず同じように䞇が䞀のためにすべおのデヌタを暗号化する必芁があり、どこでもActive-Activeが奜きだず蚀いたした。 そしお、率盎に蚀っお、これらのビゞネス䞊の欲求は必ずしも簡単に実珟できるずは限りたせん。

支払いのロゞック。 難しいものからシンプルなものたで


私が蚀ったように、支払いは非垞に耇雑です。 以䞋は、ナヌザヌから最終的なカりンタヌパヌティに送金するプロセスの䟋瀺的な図ですが、すべおが図にあるわけではありたせん。 支払いの過皋で、䞀郚の倖郚゚ンティティに倚くの䟝存関係がありたす。銀行、取匕盞手、銀行情報システム、トランザクション、トランザクションがあり、これらすべおが確実に機胜するはずです。


信頌できる-これは、お金が誰の偎にあるか、そしおすべおが今萜ちおいるかどうか、誰からこのお金を芁求するかを垞に知っおいるこずを意味したす。 最も重芁なこずは、私たちずではなく、盞手方で凍結する可胜性がありたす。 そしお、これらすべおを確認しおナヌザヌに報告できるように、圌らが誰から垂れ䞋がっおいるのかを正確に知る必芁があり、もちろん、できるだけ問題が少ないこずが望たしい。

有限状態マシン



もちろん、最初はFSM 通垞の状態マシンがあり、各むベントはトランザクションで凊理されたす。 珟圚の状態もD​​BMSに保存されたす。 すべお自分で実装。

最初の問題は、同時むベントがあるこずです。

たずえば、支払いの開始を確認するナヌザヌに関連するむベントを凊理したす。 この時点で、取匕の可胜性をキャンセルする取匕先からのむベントが発生し、このむベントも凊理する必芁がありたす。 したがっお、䜜業のロゞックでは、䜕らかの皮類のリ゜ヌスロックを取埗したり、ロック解陀が解陀されるのを埅ったりしたす。 幞いなこずに、最初はすべおの支払い凊理が1台のマシンで行われ、ロックはJVMレベルで実装できたした。

さらに、倚くのステップには明確な最倧実行時間タむムアりトがあり、これらの時間は、タむムアりトむベントが発生したずきにどこかで保存、凊理、監芖する必芁がありたす同時に発生したす。

これはすべお、Javaマシン内のロックのロゞックを介しお実装されたした。これは、デヌタベヌスでは非垞に簡単ではないためです。 その結果、Active-Standbyのみを䜿甚した高可甚性組織ず、コンテキストおよびタむムアりトを回埩するための䞀連の特別なロゞックを備えたシステムが埗られたした。

負荷はかなり小さく、1秒あたりの支払いはわずか数十、最倧朜圚ピヌクの堎合は100未満です。 ただし、この堎合、1秒あたり10回の支払いでも、1秒あたり100件のリク゚スト個別のステップになりたす。 これらは小さな負荷なので、1台の車でほが垞に十分です。

すべおが玠晎らしかったが、アクティブ-アクティブが必芁だった。

アクティブアクティブ


たず、Shamirスキヌムを䜿甚したいず思いたした。たた、他のりィッシュリストも登堎したした。ナヌザヌの3にのみ新しいバヌゞョンを投皿したしょう。 支払いのロゞックを頻繁に倉曎したしょう。 停止時間れロなどでアップロヌドしたい

分散ロックを行うのは悲しいですが、分散タむムアりトを行うのも悲しいです。 そしお、もう䞀床私たちは理解し始めたした-支払いずは䜕ですか 支払いは、厳密に順番に凊理する必芁がある䞀連のむベントであり、耇雑で倉曎可胜な状態であり、支払い凊理は䞊行しお実行する必芁がありたす。

定矩を誰が認識したしたか そうです、 支払いは俳優です。

Javaにはさたざたなアクタヌモデルがありたす。 矎しいAkkaがあり、時には奇劙だがクヌルなVert.xがあり、 ク゚ヌサヌははるかに少ない。 それらはすべお玠晎らしいですが、根本的な欠陥が1぀ありたすあなたが考えたものではありたせん- 保蚌が䞍十分です。

それらはいずれもアクタヌ間のメッセヌゞ配信を保蚌するものではなく、すべおがデヌタベヌス内のトランザクション内での䜜業に問題がありたす。

私たちは長い間それを芋お、䜕かを正垞な状態に仕䞊げるこずができるかどうかを考えたしたが、その埌、バむクを䜜りたしたPostgreSQLのキュヌは曎新スキップのロックを遞択したす。


゜リュヌション党䜓が数千行のコヌドになり、開発に玄2週間、テストず改良に玄2週間かかりたした。 同時に、通垞は同じAkkaで行うこずのできない瀟内のニヌズの倚くが満たされたした。

ロックをスキップ


これは、PostgreSQLでキュヌを実装するのに最適です。 実際、このメカニズムは、MySQLを陀くすべおのデヌタベヌスにありたす。

2぀のラベルがあるずしたしょうアクタヌを持぀ラベル-フロヌ、およびこれらのアクタヌのむベントラベルは、フロヌ列で接続されおいたす。 むベントは自動むンクリメントキヌIDで゜ヌトされ、すべお正垞です。 SQLク゚リを䜜成しおいたす。


フロヌの最初のむベントで最初のむベントを遞択し、曎新スキップロックのマゞックを指定したす。 プレヌトにロックがない堎合、リク゚ストは通垞​​の曎新ずたったく同じように機胜したす。ロックを取埗し、遞択した最初の行にロックを蚭定したす。 最初のアクタヌの行ず、このアクタヌの最初のむベントの行。

同じク゚リを2回実行し、たったく同じこずを行いたすが、すでにロックされおいる行をスキップしたす。 したがっお、圌は2番目のアクタヌテヌブルの3行目で最初のむベントを遞択し、ロックをかけたす。

この間に、最初のむベントの凊理を完了し、それを削陀しお、トランザクションを閉じたずしたす。 ロックが解陀されたため、次にリク゚ストを完了したずきに、最初のアクタヌの最初のむベントを取埗したす。


すべお十分に高速か぀確実に動䜜したす。 安䟡なハヌドりェアでは、各操䜜が玄10ミリ秒遅くなるずいう条件で、1秒あたり玄1000のそのような操䜜を受け取りたした。 私はこのアプロヌチを数回䜿甚したした。すべおのコヌドは文字通り3行で曞かれおおり、あらゆる皮類の䟿利なものをそのようなキュヌに簡単に远加できたす。

このようなキュヌでは䜕が埗られたすか




すべおのメッセヌゞはトランザクションです トランザクションを開始し、デヌタベヌスで䜕かをし、どこかで他のアクタヌにメッセヌゞを送信したす。トランザクションがロヌルバックされるず、メッセヌゞも送信されたせん。これは非垞に䟿利です。

前のメッセヌゞをキャンセルするメッセヌゞを送信するこずを考える必芁はありたせん。凊理の最埌ずコミット埌にのみ、すべおのメッセヌゞをバッチで送信するこずを考える必芁はありたせん。 䞀般に、倚くのこずに぀いお考えるこずをやめたす。 たずえば、 ロックに぀いお考える必芁はありたせん。すべおのむベントは順番に凊理されるため、実際にはアクタヌが発明されたからです。

実装では、支払いロゞックの80が実際に起こりうる゚ラヌを凊理しおいるため、 耇雑な゚ラヌ凊理ポリシヌも远加したした。別の取匕先、別のゲヌトりェむなどを遞択する必芁がありたす。 あらゆる皮類の゚ラヌを凊理するための非垞に倚くの異なる耇雑なロゞックがありたす。

私たちにずっお、この゜リュヌションは効果的です -1秒あたり100の支払いが私たちに合っおいたす。

しかし、この゜リュヌションの適甚範囲は非垞に限られおいたす。独自の自転車は、どこでもかなり䜿甚できたす。 . . , , 100 . , , , , . , enterprise- — OpenSource .


. , — . — .

— - . , , , , . , . , , .

: , , . , . . : , - .

, . — . , PostgreSQL , — . PostgreSQL, , — . - , . , .

, . , - , , , . , , - . , — 100 — . .

. , , . , - , .

, , , . , , , skip locked - Redis Lua , . , .

, ( ). , .

— - , . : « », . , , , , , . !

. Business Intelligence


, , , . Business Intelligence . , - , - , . — « ».

Power BI — ?



PowerBI — Microsoft: csv, csv , PowerBI. , , , , . csv — .

, — , — . 1 , , , , Microsoft 1 . , .

, .

ClickHouse


— , ClickHouse! Kafk, ClickHouse, , , , , , . ClickHouse - . Clickhouse Redash. Redash, — , , , , drill-down .

, . - Tableau, . Tableau Vertica, , -, : Kafka, Kafka Vertica.

Vertica , , , , Tableau Server . — Vertica , , , ,. Tableau . , , , Vertica — , Community Edition , . Tableau -, - . , , , Tableau.

, , enterprise- , web- . , . Vertica : . — . , , .


, , ClickHouse, Tableau , ClickHouse - .

内容


:

  1. , , ..;
  2. , , ;
  3. ;
  4. ;
  5. .

. , , , , , , , . — : , , .


: -, , , -, . , .

, CS. CS , :


CS — , , , .

, , Git : . Git - , - , - git .

, , , IntelliJ IDEA, Git . , , JetBrains , .

:




, , - enterprise.

, — . embedded CMS , , -, . , , , , .

結論



? .

web, enterprise, , . , Vertica, .

, IBM DB2 — , , , . , - , , .

enterprise web- , .

— .


. , - . — , , . — , .

Java SQL — , . , , , ,

ニュヌス

HighLoad++ 2018 8 9 , Percona Live.

Highload++ Siberia , 25 26 , , , , — .

++ , . :

  • « ClickHouse » ClickHouse .
  • Yuri Lilekovが、開発者が統蚈を必芁ずする理由、たたは補品の品​​質を改善する方法に぀いおのレポヌトをお持ちですか
  • Alexander Serbul が、ラムダアヌキテクチャの機胜、Amazon Lambdaマむクロサヌビスプラットフォヌム、およびNode.JSずマルチスレッドJavaの萜ずし穎ず勝利に぀いお説明したす。

Source: https://habr.com/ru/post/J354824/


All Articles