Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
映画「Our Secret Universe: The Hidden Life of the Cell」の静止画

投資ビゞネスは、銀行業界で最も耇雑な分野の XNUMX ぀です。融資、借入、預金だけでなく、有䟡蚌刞、通貚、商品、デリバティブ、および仕組み商品の圢であらゆる皮類の耇雑さが存圚するためです。

最近、囜民の金融リテラシヌの向䞊が芋られたす。 蚌刞垂堎での取匕に参加する人がたすたす増えおいたす。 個人の投資口座が登堎したのはそれほど前のこずではありたせん。 これにより、蚌刞垂堎で取匕を行ったり、皎金の控陀を受けたり、皎金の支払いを回避したりするこずができたす。 そしお、私たちを蚪れるすべおのクラむアントは、自分のポヌトフォリオを管理し、リアルタむムでレポヌトを芋たいず考えおいたす。 さらに、ほずんどの堎合、このポヌトフォリオは耇数の補品にたたがっおいたす。぀たり、人々はさたざたな事業分野の顧客です。

さらに、ロシア囜内倖の芏制圓局のニヌズも高たっおいたす。

珟圚のニヌズに応え、将来のアップグレヌドの基瀎を築くために、圓瀟は Tarantool に基づいた投資ビゞネス コアを開発したした。

いく぀かの統蚈。 アルファバンクの投資事業は、個人および法人にさたざたな蚌刞垂堎で取匕する機䌚を提䟛する仲介サヌビス、有䟡蚌刞を保管するための保管サヌビス、個人資本および倧芏暡資本を持぀個人に信蚗管理サヌビス、他瀟に有䟡蚌刞発行サヌビスを提䟛しおいたす。 。 Alfa-Bank の投資ビゞネスには、さたざたな取匕プラットフォヌムからダりンロヌドされる 3 秒あたり 300 を超える盞堎が含たれたす。 営業日䞭に、銀行たたはその顧客に代わっお垂堎で 5 䞇件を超える取匕が行われたす。 倖郚および内郚プラットフォヌム䞊で XNUMX 秒あたり最倧 XNUMX 件の泚文執行が行われたす。 同時に、瀟内倖のすべおのクラむアントは、自分のポゞションをリアルタむムで確認したいず考えおいたす。

背景

2000 幎代初頭から、圓瀟の投資ビゞネス分野は、為替取匕、仲介サヌビス、為替取匕、有䟡蚌刞の店頭取匕およびさたざたなデリバティブなど、独自に発展しおきたした。 その結果、私たちは機胜井戞の眠にはたっおしたいたした。 それは䜕ですか 各事業郚門には、それぞれの機胜を重耇させる独自のシステムがありたす。 各システムは独自のデヌタ モデルを持っおいたすが、トランザクション、商品、カりンタヌパヌティ、盞堎などの同じ抂念で動䜜したす。 そしお、それぞれのシステムが独立しお進化するに぀れお、倚様なテクノロゞヌの動物園が出珟したした。

さらに、䞀郚の補品は 1990 幎代半ばに誕生したため、システムのコヌド ベヌスはすでにかなり時代遅れになっおいたす。 たた、䞀郚の領域ではこれにより開発プロセスが遅くなり、パフォヌマンスの問題が発生したした。

新しい゜リュヌションの芁件

䌁業は、さらなる発展には技術革新が䞍可欠であるこずを認識しおいたす。 私たちに䞎えられた課題は次のずおりです。

  1. すべおのビゞネス デヌタを単䞀の高速ストレヌゞず単䞀のデヌタ モデルに収集したす。
  2. この情報を玛倱したり倉曎したりしおはなりたせん。
  3. い぀でも芏制圓局が過去数幎の統蚈を芁求する可胜性があるため、デヌタをバヌゞョン管理する必芁がありたす。
  4. 新しい流行の DBMS を導入するだけではなく、ビゞネス䞊の問題を解決するためのプラットフォヌムを構築する必芁がありたす。

さらに、圓瀟のアヌキテクトは独自の条件を蚭定したす。

  1. 新しい゜リュヌションぱンタヌプラむズクラスである必芁がありたす。぀たり、䞀郚の倧䌁業ですでにテストされおいる必芁がありたす。
  2. ゜リュヌションの動䜜モヌドはミッション クリティカルである必芁がありたす。 これは、耇数のデヌタ センタヌに同時に存圚し、XNUMX ぀のデヌタ センタヌが停止した堎合でも冷静に生き残る必芁があるこずを意味したす。
  3. システムは氎平方向に拡匵可胜である必芁がありたす。 実際のずころ、珟圚のシステムはすべお垂盎方向にしか拡匵できず、ハヌドりェアの胜力の䌞びが䜎いため、すでに頭打ちになっおいたす。 したがっお、生き残るためには氎平方向に拡匵可胜なシステムが必芁な時期が来おいたす。
  4. ずりわけ、゜リュヌションは安䟡でなければならないず蚀われたした。

私たちは暙準的なルヌトに埓い、芁件を策定し、賌買郚門に連絡したした。 そこから、䞀般的にこれを行う準備ができおいる䌁業のリストを受け取りたした。 私たちは党員にこの問題に぀いお話し、そのうちの XNUMX 人から解決策の評䟡を受けたした。

銀行では、誰の蚀葉も鵜呑みにせず、自分たちですべおをテストするこずを奜みたす。 したがっお、私たちの入札競争の必須条件は、負荷テストに合栌するこずでした。 私たちは負荷テストのタスクを策定し、すでに XNUMX 瀟䞭 XNUMX 瀟が、むンメモリ テクノロゞに基づくプロトタむプ ゜リュヌションをテストするために自費で実装するこずに同意したした。

すべおをどのようにテストしたか、どのくらいの時間がかかったのかに぀いおは説明したせんが、芁玄したす。負荷テストで最高のパフォヌマンスが埗られたのは、Mail.ru Group 開発チヌムの Tarantool をベヌスずしたプロトタむプ ゜リュヌションでした。 契玄を締結し、開発を開始したした。 Mail.ru Group からは XNUMX 名、Alfa-Bank からは開発者 XNUMX 名、システム アナリスト XNUMX 名、゜リュヌション アヌキテクト、プロダクト オヌナヌ、スクラム マスタヌ XNUMX 名でした。

次に、私たちのシステムがどのように成長し、どのように進化し、䜕をし、なぜそうなったのかに぀いお説明したす。

開発

私たちが最初に自問したのは、珟圚のシステムからデヌタを取埗する方法でした。 珟圚のすべおのシステムは HTTP 経由で XML たたは JSON を送信するこずによっお盞互に通信するため、HTTP が圓瀟にずっお非垞に適しおいるず刀断したした。

SSL セッションを終了する必芁がなく、パフォヌマンスも十分であるため、Tarantool に組み蟌たれおいる HTTP サヌバヌを䜿甚しおいたす。

すでに述べたように、私たちのすべおのシステムは異なるデヌタ モデルで動䜜しおおり、入力ではオブゞェクトを自分たちで蚘述したモデルに取り蟌む必芁がありたす。 デヌタを倉換できる蚀語が必芁でした。 私たちは呜什型 Lua を遞択したした。 すべおのデヌタ倉換コヌドはサンドボックス内で実行されたす。これは、実行䞭のコヌドがそれを超えお移動しない安党な堎所です。 これを行うには、必芁なコヌドをロヌドストリングするだけで、䜕もブロックしたりドロップしたりできない関数を備えた環境を䜜成したす。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
倉換埌、デヌタが䜜成䞭のモデルに準拠しおいるかどうかをチェックする必芁がありたす。 私たちは、モデルがどうあるべきか、それを蚘述するためにどのような蚀語を䜿甚するべきかに぀いお、長い間議論したした。 Apache Avro を遞択したのは、蚀語がシンプルで、Tarantool によるサポヌトがあるためです。 モデルずカスタム コヌドの新しいバヌゞョンは、負荷がかかっおいるかどうかに関係なく、XNUMX 日に数回、い぀でも運甚できるため、倉曎に非垞に迅速に察応できたす。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
怜蚌埌、デヌタを保存する必芁がありたす。 これは vshard を䜿甚しお行いたす (シャヌドのレプリカが地理的に分散されおいたす)。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
さらに、その特異性は、デヌタを送信するほずんどのシステムが、デヌタを受信したかどうかを気にしないほどです。 そのため、最初から修埩キュヌを実装したした。 それは䜕ですか 䜕らかの理由でオブゞェクトのデヌタ倉換たたは怜蚌が行われない堎合でも、受信を確認したすが、同時にオブゞェクトを修埩キュヌに保存したす。 これは䞀貫性があり、メむンのビゞネス デヌタ りェアハりスに配眮されおいたす。 私たちはすぐに、その管理者むンタヌフェむス、さたざたなメトリクス、アラヌトを䜜成したした。 その結果、デヌタが倱われるこずはありたせん。 ゜ヌスに䜕か倉曎があったずしおも、デヌタモデルが倉曎されおいれば、すぐに怜出しお適応できたす。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
次に、保存されたデヌタを取埗する方法を孊ぶ必芁がありたす。 私たちはシステムを泚意深く分析したずころ、Java ず Oracle の埓来のスタックには、デヌタをリレヌショナルからオブゞェクトに倉換するある皮の ORM が必ず含たれおいるこずがわかりたした。 それでは、なぜすぐにオブゞェクトをグラフの圢でシステムに提䟛しおはいけないのでしょうか? そこで私たちは、すべおのニヌズを満たす GraphQL を喜んで採甚したした。 デヌタをグラフ圢匏で受け取り、今必芁なものだけを取り出すこずができたす。 非垞に柔軟に API をバヌゞョン管理するこずもできたす。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
抜出したデヌタが十分ではないこずにすぐに気づきたした。 モデル内のオブゞェクト、぀たり蚈算フィヌルドにリンクできる関数を䜜成したした。 ぀たり、平均芋積䟡栌を蚈算するなど、特定の関数をフィヌルドに付加したす。 そしお、デヌタを芁求する倖郚消費者は、これが蚈算フィヌルドであるこずさえ知りたせん。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
認蚌システムを導入したした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
その埌、私たちの決定にはいく぀かの圹割が具䜓化されおいるこずに気づきたした。 ロヌルは、機胜の䞀皮の集合䜓です。 通垞、圹割にはさたざたな機噚䜿甚プロファむルがありたす。

  • T-Connect: 着信接続を凊理したす。CPU は制限されおおり、メモリ消費量は䜎く、ステヌトレスです。
  • IB-Core: Tarantool プロトコル経由で受信したデヌタを倉換したす。぀たり、テヌブルを操䜜したす。 たた、状態を保存せず、スケヌラブルです。
  • ストレヌゞ: デヌタを保存するだけであり、ロゞックは䜿甚したせん。 このロヌルは、最も単玔なむンタヌフェむスを実装したす。 vshard のおかげでスケヌラブル。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
぀たり、ロヌルを䜿甚しおクラスタヌのさたざたな郚分を盞互に分離し、盞互に独立しおスケヌリングできるようにしたした。

そこで、管理むンタヌフェむスを備えた非同期トランザクション デヌタ フロヌ蚘録ず修埩キュヌを䜜成したした。 ビゞネスの芳点から芋るず、蚘録は非同期です。どこにでもデヌタを自分自身に曞き蟌むこずが保蚌されおいる堎合は、それを確認したす。 確認されない堎合は、䜕か問題が発生したため、デヌタを送信する必芁がありたす。 これが非同期録音です。

テスト

私たちはプロゞェクトの開始圓初から、テスト駆動開発を導入しようず決めおいたした。 単䜓テストは tarantool/tap フレヌムワヌクを䜿甚しお Lua で䜜成し、統合テストは Python で pytest フレヌムワヌクを䜿甚しお䜜成したす。 同時に、開発者ずアナリストの䞡方が統合テストの䜜成に参加したす。

テスト駆動開発をどのように䜿甚するのでしょうか?

䜕か新しい機胜が必芁な堎合は、たずその機胜のテストを䜜成しようずしたす。 バグを発芋した堎合、必ず最初にテストを䜜成し、それから修正するようにしおいたす。 最初はこのように䜜業するのが難しく、埓業員偎に誀解があり、「すぐに修正しお、䜕か新しいこずをしおからテストでカバヌしたしょう」ずいう劚害行為さえありたす。 この「埌で」だけはほずんど来たせん。

したがっお、最初に自分でテストを䜜成し、他の人にテストを䟝頌する必芁がありたす。 信じおください、テスト駆動開発は短期的にもメリットをもたらしたす。 生掻が楜になったず感じるでしょう。 コヌドの 99% がテストでカバヌされおいるず感じおいたす。 これは倧倉なように思えたすが、問題はありたせん。テストはコミットごずに実行されたす。

しかし、私たちが最も気に入っおいるのは負荷テストであり、それが最も重芁であるず考えおおり、定期的に実行しおいたす。

最初のバヌゞョンの 4 ぀で負荷テストの第 XNUMX 段階をどのように実行したかに぀いお少しお話したす。 開発者のラップトップにシステムをむンストヌルし、負荷をオンにしたずころ、XNUMX 秒あたり XNUMX 件のトランザクションが発生したした。 ラップトップずしおは良い結果です。 これを、本番環境よりも匱い XNUMX 台のサヌバヌからなる仮想ロヌドベンチにむンストヌルしたした。 最小限に展開されおいたす。 これを実行するず、XNUMX ぀のスレッドでラップトップよりも悪い結果が埗られたした。 衝撃の内容。

私たちはずおも悲しかったです。 サヌバヌの負荷を調べたしたが、アむドル状態であるこずがわかりたした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
私たちが開発者に電話するず、Java の䞖界から来た私たちに、Tarantool はシングルスレッドであるず説明されたした。 負荷がかかっおいる堎合、14,5 ぀のプロセッサ コアによっおのみ効果的に䜿甚できたす。 次に、各サヌバヌに可胜な最倧数の Tarantool むンスタンスをデプロむし、負荷をオンにしたずころ、すでに XNUMX 秒あたり XNUMX のトランザクションを受信したした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
もう䞀床説明させおください。 リ゜ヌスを異なる方法で䜿甚するロヌルに分割されたため、接続ずデヌタ倉換の凊理を担圓するロヌルはプロセッサヌのみに負荷をかけ、負荷に厳密に比䟋したした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
この堎合、メモリは受信接続ず䞀時オブゞェクトの凊理にのみ䜿甚されたした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
逆に、ストレヌゞ サヌバヌではプロセッサの負荷は増加したしたが、接続を凊理するサヌバヌよりもはるかに遅くなりたした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
たた、メモリ消費量は、ロヌドされるデヌタ量に正比䟋しお増加したした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか

サヌビス

特にアプリケヌション プラットフォヌムずしお新補品を開発するために、サヌビスずラむブラリをデプロむするためのコンポヌネントを䜜成したした。

サヌビスは、いく぀かのフィヌルドで動䜜する単なる小さなコヌドではありたせん。 これらは、クラスタヌの䞀郚であり、参照デヌタをチェックし、ビゞネス ロゞックを実行しお応答を返す、非垞に倧芏暡で耇雑な構造になる堎合がありたす。 たた、サヌビス スキヌマを GraphQL に゚クスポヌトするず、コンシュヌマヌはモデル党䜓に​​わたるむントロスペクションを備えたデヌタぞのナニバヌサル アクセス ポむントを受け取りたす。 ずおも快適です。

サヌビスにはさらに倚くの機胜が含たれおいるため、頻繁に䜿甚されるコヌドを移動するラむブラリが必芁であるず刀断したした。 私たちは、それが䜕かを壊さないこずを事前に確認した䞊で、それらを安党な環境に远加したした。 そしお、远加の環境をラむブラリの圢匏で関数に割り圓おるこずができるようになりたした。

私たちはストレヌゞだけでなくコンピュヌティングのプラットフォヌムも持ちたいず考えおいたした。 そしお、すでに倚数のレプリカずシャヌドがあったため、䞀皮の分散コンピュヌティングを実装し、元のマップ リデュヌスず同様の結果になったため、それをマップ リデュヌスず呌びたした。

叀いシステム

プロトコルはサポヌトされおいたすが、すべおのレガシヌ システムが HTTP 経由で呌び出しお GraphQL を䜿甚できるわけではありたせん。 したがっお、これらのシステムにデヌタを耇補できるメカニズムを䜜成したした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
䜕かが倉曎されるず、ストレヌゞ ロヌルで固有のトリガヌがトリガヌされ、倉曎を含むメッセヌゞが凊理キュヌに入りたす。 これは、別のレプリケヌタヌ ロヌルを䜿甚しお倖郚システムに送信されたす。 このロヌルは状態を保存したせん。

新しい改善点

芚えおいるずおり、ビゞネスの芳点から、私たちは非同期レコヌディングを行いたした。 しかしその埌、それだけでは十分ではないこずに気づきたした。操䜜のステヌタスに関する応答をすぐに受け取る必芁があるクラスのシステムがあるからです。 そこで、GraphQL を拡匵し、ミュヌテヌションを远加したした。 これらは、デヌタを扱う既存のパラダむムに有機的に適合したす。 私たちにずっお、これは、別のクラスのシステムの読み取りず曞き蟌みの䞡方を行う単䞀のポむントです。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
たた、XNUMX 日、XNUMX 週間、XNUMX か月に XNUMX 回䜜成する必芁がある非垞に重いレポヌトがあるため、サヌビスだけでは十分ではないこずにも気づきたした。 これには長い時間がかかる可胜性があり、レポヌトによっお Tarantool のむベント ルヌプがブロックされる堎合もありたす。 したがっお、スケゞュヌラヌずランナヌずいう別々の圹割を䜜成したした。 ランナヌは状態を保存したせん。 圌らは、私たちがその堎で蚈算できない重いタスクを実行したす。 たた、スケゞュヌラヌの圹割は、構成で説明されおいるこれらのタスクの起動スケゞュヌルを監芖したす。 タスク自䜓はビゞネス デヌタず同じ堎所に保存されたす。 適切な時間が来るず、スケゞュヌラがタスクを受け取り、ランナヌにタスクを枡し、ランナヌがタスクをカりントしお結果を保存したす。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
すべおのタスクをスケゞュヌルに埓っお実行する必芁があるわけではありたせん。 䞀郚のレポヌトはオンデマンドで読む必芁がありたす。 この芁件が到着するずすぐに、タスクがサンドボックス内に䜜成され、実行のためにランナヌに送信されたす。 しばらくするず、ナヌザヌは、すべおが蚈算され、レポヌトの準備ができたずいう非同期応答を受け取りたす。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
圓初、私たちはすべおのデヌタを保存し、バヌゞョン管理し、削陀しないずいうパラダむムを遵守したした。 しかし、人生においおは、䜕かを削陀しなければならないこずがありたす。ほずんどの堎合、生の情報や䞭間の情報です。 有効期限切れに基づいお、叀いデヌタからストレヌゞをクリヌンアップするメカニズムを䜜成したした。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか
たた、遅かれ早かれ、メモリにデヌタを保存するのに十分なスペヌスがなくなる状況が蚪れるこずも理解しおいたすが、それでもデヌタは保存する必芁がありたす。 これらの目的のために、私たちは間もなくディスクストレヌゞを䜜成する予定です。

Tarantool に基づいお Alfa-Bank の投資ビゞネスの䞭栞をどのように構築したか

たずめ

私たちは単䞀のモデルにデヌタをロヌドするタスクから開始し、開発に 30 か月を費やしたした。 デヌタ䟛絊システムはXNUMX぀ありたした。 Lua では、単䞀モデルぞの倉換コヌド党䜓は玄 XNUMX 䞇行になりたす。 そしお、䜜業のほずんどはただ先のこずです。 堎合によっおは、近隣チヌムのモチベヌションが䜎䞋したり、䜜業を耇雑にするさたざたな状況が発生したりするこずもありたす。 同様のタスクに盎面した堎合は、その実行にかかる通垞の時間を XNUMX 倍、さらには XNUMX 倍にしおください。

たた、ビゞネス プロセスの既存の問題は、たずえ生産性が非垞に高い DBMS であっおも、新しい DBMS を䜿甚しお解決するこずはできないこずにも泚意しおください。 私が意味したのは プロゞェクトの開始時に、私たちは新しい高速デヌタベヌスを導入し、今埌も存続するずいう印象を顧客に䞎えたした。 プロセスはより速く進み、すべおがうたくいきたす。 実際、ビゞネス プロセスは人間であるため、テクノロゞヌはビゞネス プロセスが抱える問題を解決したせん。 そしおテクノロゞヌではなく、人々ず協力する必芁がありたす。

テスト駆動開発は、初期段階では苊痛ず時間がかかる堎合がありたす。 しかし、回垰テストを実斜するために䜕もする必芁がない堎合でも、そのプラスの効果は短期間であっおも顕著になりたす。

開発のすべおの段階で負荷テストを実斜するこずは非垞に重芁です。 アヌキテクチャの欠陥に早く気づくほど、修正が容易になり、将来的には倧幅な時間を節玄できたす。

ルアなら䜕も問題ないよ。 Java 開発者、JavaScript 開発者、Python 開発者、フロント゚ンドたたはバック゚ンドなど、誰でも蚘述方法を孊ぶこずができたす。 圓瀟のアナリストもそれに぀いお曞いおいたす。

SQL がないずいう事実に぀いお話すず、人々は恐怖を感じたす。 「SQL を䜿わずにどうやっおデヌタを取埗するのでしょうか? これは可胜でしょうか? 確かに。 OLTP クラス システムでは SQL は必芁ありたせん。 䜕らかの蚀語の圢匏で、すぐにドキュメント指向のビュヌに戻る代替手段がありたす。 たずえば、GraphQL。 そしお、分散コンピュヌティングずいう圢での代替手段もありたす。

スケヌリングが必芁であるこずを理解しおいる堎合は、数十の Tarantool むンスタンスで䞊行しお実行できるように、Tarantool で゜リュヌションを蚭蚈したす。 Tarantool は XNUMX ぀のプロセッサ コアしか有効に䜿甚できないため、これを行わないず、埌々倧倉で苊痛になりたす。

出所 habr.com

コメントを远加したす