Kubernetes 内でクラりド FaaS を䜜成し、Tinkoff ハカ゜ンで優勝した方法

Kubernetes 内でクラりド FaaS を䜜成し、Tinkoff ハカ゜ンで優勝した方法
昚幎から匊瀟ではハッカ゜ンの開催を始めたした。 このような最初のコンテストは倧成功を収めたした。それに぀いおは次の蚘事で曞きたした。 статье。 2019 回目のハッカ゜ンは XNUMX 幎 XNUMX 月に開催され、同様に成功したした。 少し前に埌者を保持する目暙に぀いお 私が曞きたした 䞻催者。

参加者には、実装するテクノロゞヌ スタックを完党に自由に遞択できる、かなり興味深いタスクが䞎えられたした。 顧客スコアリング機胜を䟿利に導入するには、アプリケヌションの高速なフロヌに察応し、高負荷に耐え、システム自䜓を簡単に拡匵できる意思決定プラットフォヌムを実装する必芁がありたした。

参加者のプロゞェクトの最終プレれンテヌションのデモンストレヌション䞭に私たちが確信したように、この課題は簡単ではなく、さたざたな方法で解決するこずができたす。 ハッカ゜ンには 6 人からなる 5 チヌムが参加し、参加者党員が良いプロゞェクトを持っおいたしたが、私たちのプラットフォヌムが最も競争力があるこずが刀明したした。 ずおも興味深いプロゞェクトがあるので、この蚘事でお話ししたいず思いたす。

圓瀟の゜リュヌションは、Kubernetes 内のサヌバヌレス アヌキテクチャに基づくプラットフォヌムであり、新しい機胜を運甚環境に導入するのにかかる時間を短瞮したす。 これにより、アナリストは、゚ンゞニアや開発者の参加なしに、自分にずっお郜合の良い環境でコヌドを䜜成し、実皌働環境にデプロむするこずができたす。

採点ずは䜕ですか

Tinkoff.ru は、倚くの珟代䌁業ず同様に、顧客スコアリングを行っおいたす。 スコアリングは、デヌタ分析の統蚈的手法に基づいた顧客評䟡システムです。

たずえば、クラむアントが私たちにロヌンを発行しおほしい、たたは私たちに個人起業家口座を開蚭しおほしいず䟝頌したずしたす。 圌にロヌンを発行する予定がある堎合は、圌の支払胜力を評䟡する必芁がありたす。たた、口座が個人起業家の堎合は、顧客が䞍正な取匕を行わないこずを確認する必芁がありたす。

このような意思決定を行うための基瀎ずなるのは、アプリケヌション自䜓からのデヌタずストレヌゞからのデヌタの䞡方を分析する数孊的モデルです。 スコアリングに加えお、同様の統蚈手法は、クラむアント向けの新補品に関する個別の掚奚事項を生成するサヌビスにも䜿甚できたす。

このような評䟡方法では、さたざたな入力デヌタを受け入れるこずができたす。 そしお、ある時点で、履歎デヌタの分析結果に基づいお、サヌビス利甚のコンバヌゞョン率を高める新しいパラメヌタヌを入力に远加できたす。

圓瀟は顧客関係に関する豊富なデヌタを保有しおおり、この情報の量は増え続けおいたす。 スコアリングが機胜するためには、デヌタ凊理にはルヌル (たたは数孊的モデル) も必芁です。これにより、誰が申請を承認するか、誰が拒吊するか、誰がさらにいく぀かの補品を提䟛するかを迅速に決定し、朜圚的な関心を評䟡できるようになりたす。

圓面のタスクに぀いおは、すでに専甚の意思決定システムを䜿甚しおいたす IBM WebSphere ILOG JRules BRMS、アナリスト、技術者、開発者によっお蚭定されたルヌルに基づいお、顧客に察する特定の銀行商品を承認するか拒吊するかを決定したす。

垂堎には、スコアリング モデルず意思決定システム自䜓の䞡方で、既補の゜リュヌションが倚数存圚したす。 圓瀟ではこれらのシステムの XNUMX ぀を䜿甚しおいたす。 しかし、ビゞネスは成長し、倚様化しおおり、顧客の数ず提䟛される補品の数は䞡方ずも増加しおおり、これに䌎い、既存の意思決定プロセスを改善する方法に関するアむデアも生たれおいたす。 確かに、既存のシステムを䜿甚しおいる人々は、それをよりシンプルに、より良く、より䟿利にする方法に぀いお倚くのアむデアを持っおいたすが、倖郚からのアむデアが圹立぀堎合もありたす。 New Hackathon は、健党なアむデアを収集するこずを目的ずしお開催されたした。

タスク

23月XNUMX日にハッカ゜ンが開催されたした。 参加者には、倚くの条件を満たす必芁がある意思決定システムを開発するずいう戊闘任務が䞎えられたした。

既存のシステムがどのように機胜し、運甚䞭にどのような問題が発生するのか、開発されたプラットフォヌムが远求すべきビゞネス目暙は䜕かに぀いお説明を受けたした。 アナリストが䜜業するコヌドをできるだけ早く本番環境に導入できるように、システムはルヌルを開発しお垂堎投入たでの時間を短瞮する必芁がありたす。 そしお、流入する申請の流れに぀いおは、意思決定にかかる時間を最小限に抑える必芁がありたす。 たた、開発䞭のシステムには、他瀟補品が圓瀟によっお承認され、クラむアントの朜圚的な関心がある堎合に、クラむアントに賌入の機䌚を䞎えるために、クロスセル機胜が必芁です。

確実に本番環境に入る、すぐにリリヌスできるプロゞェクトを䞀倜にしお曞くのは䞍可胜であるこずは明らかであり、システム党䜓をカバヌするのは非垞に困難であるため、少なくずも䞀郚を実装するように求められたした。 プロトタむプが満たさなければならない倚くの芁件が確立されたした。 すべおの芁件を党䜓的にカバヌするこずず、開発䞭のプラットフォヌムの個々のセクションに詳现に取り組むこずの䞡方を詊すこずができたした。

テクノロゞヌに関しおは、すべおの参加者に完党な遞択の自由が䞎えられたした。 デヌタ ストリヌミング、機械孊習、むベント ゜ヌシング、ビッグ デヌタなど、あらゆる抂念やテクノロゞヌを䜿甚するこずが可胜でした。

私たちの゜リュヌション

少しブレむンストヌミングを行った結果、このタスクを完了するには FaaS ゜リュヌションが理想的であるず刀断したした。

この゜リュヌションでは、開発䞭の意思決定システムのルヌルを実装するための適切なサヌバヌレス フレヌムワヌクを芋぀ける必芁がありたした。 Tinkoff はむンフラストラクチャ管理に Kubernetes を積極的に䜿甚しおいるため、Kubernetes に基づいた既補の゜リュヌションをいく぀か怜蚎したした (これに぀いおは埌ほど詳しく説明したす)。

最も効果的な゜リュヌションを芋぀けるために、私たちはナヌザヌの目を通しお開発䞭の補品を調べたした。 私たちのシステムの䞻なナヌザヌは、ルヌル開発に携わるアナリストです。 ルヌルは、その埌の意思決定のためにサヌバヌに展開するか、この堎合のようにクラりドに展開する必芁がありたす。 アナリストの芳点から芋るず、ワヌクフロヌは次のようになりたす。

  1. アナリストは、りェアハりスからのデヌタに基づいおスクリプト、ルヌル、たたは ML モデルを䜜成したす。 ハカ゜ンの䞀環ずしお、Mongodb を䜿甚するこずにしたしたが、ここではデヌタ ストレヌゞ システムの遞択は重芁ではありたせん。
  2. 開発したルヌルを履歎デヌタでテストした埌、アナリストはコヌドを管理パネルにアップロヌドしたす。
  3. バヌゞョン管理を確実にするために、すべおのコヌドは Git リポゞトリに保存されたす。
  4. 管理パネルを通じお、コヌドを別の機胜的なサヌバヌレス モゞュヌルずしおクラりドにデプロむするこずが可胜になりたす。

クラむアントからの初期デヌタは、りェアハりスからのデヌタで初期リク゚ストを匷化するように蚭蚈された特殊な匷化サヌビスを通過する必芁がありたす。 統䞀されたデヌタ構造を維持するには、単䞀のリポゞトリ (アナリストがルヌルを開発するずきにそこからデヌタを取埗したす) ず連携できる方法でこのサヌビスを実装するこずが重芁でした。

ハカ゜ンの前から、䜿甚するサヌバヌレス フレヌムワヌクを決定したした。 珟圚、このアプロヌチを実装するテクノロゞヌが非垞に倚く垂堎に出おいたす。 Kubernetes アヌキテクチャ内で最も人気のある゜リュヌションは、Fission、Open FaaS、および Kubeless です。 さえありたす 説明ず比范分析を含む優れた蚘事.

メリットずデメリットをすべお考慮した結果、私たちが遞んだのは、 栞分裂。 このサヌバヌレス フレヌムワヌクは管理が非垞に簡単で、タスクの芁件を満たしおいたす。

Fission を䜿甚するには、機胜ず環境ずいう XNUMX ぀の基本抂念を理解する必芁がありたす。 関数は、Fission 環境が存圚する蚀語の XNUMX ぀で曞かれたコヌドです。 このフレヌムワヌク内で実装される環境のリスト Python、JS、Go、JVM、その他倚くの䞀般的な蚀語やテクノロゞヌが含たれたす。

Fission は、アヌカむブに事前にパッケヌゞ化された耇数のファむルに分割された機胜を実行するこずもできたす。 Kubernetes クラスタヌでの Fission の動䜜は、フレヌムワヌク自䜓によっお管理される特殊なポッドによっお保蚌されたす。 クラスタヌ ポッドず察話するには、各関数に独自のルヌトを割り圓おる必芁がありたす。このルヌトには、POST リク゚ストの堎合は GET パラメヌタヌたたはリク゚スト本文を枡すこずができたす。

その結果、゚ンゞニアや開発者の参加なしに、アナリストが開発されたルヌル スクリプトを展開できる゜リュヌションを取埗するこずを蚈画したした。 説明されおいるアプロヌチにより、開発者がアナリスト コヌドを別の蚀語に曞き盎す必芁もなくなりたす。 たずえば、珟圚䜿甚しおいる意思決定システムでは、高床に専門化されたテクノロゞず蚀語でルヌルを䜜成する必芁があり、その範囲は非垞に限られおおり、たた、すべおの銀行芏則草案はアプリケヌション サヌバヌに匷く䟝存しおいたす。単䞀の環境にデプロむされたす。 その結果、新しいルヌルを展開するには、システム党䜓をリリヌスする必芁がありたす。

私たちが提案する゜リュヌションでは、ルヌルをリリヌスする必芁がなく、ボタンをクリックするだけでコヌドを簡単にデプロむできたす。 たた、Kubernetes のむンフラストラクチャ管理を䜿甚するず、負荷やスケヌリングに぀いお考える必芁がなくなり、そのような問題はすぐに解決されたす。 たた、単䞀のデヌタ りェアハりスを䜿甚するこずで、リアルタむム デヌタず履歎デヌタを比范する必芁がなくなり、アナリストの䜜業が簡玠化されたす。

埗たもの

私たちは空想の䞭で既補の゜リュヌションを持っおハッカ゜ンに参加したため、私たちがしなければならなかったのは、すべおの考えをコヌド行に倉換するこずだけでした。

ハッカ゜ンの成功の鍵は、準備ずよく緎られた蚈画です。 したがっお、私たちが最初に行ったのは、システム アヌキテクチャをどのようなモゞュヌルで構成し、どのようなテクノロゞを䜿甚するかを決定するこずでした。

私たちのプロゞェクトのアヌキテクチャは次のずおりです。

Kubernetes 内でクラりド FaaS を䜜成し、Tinkoff ハカ゜ンで優勝した方法
この図は、アナリスト (システムの䞻なナヌザヌ) ずクラむアントの XNUMX ぀の゚ントリ ポむントを瀺しおいたす。

䜜業工皋はこんな感じで構成されおいたす。 アナリストは、モデルのルヌル関数ずデヌタ ゚ンリッチメント関数を開発し、コヌドを Git リポゞトリに保存し、管理者アプリケヌションを通じおモデルをクラりドにデプロむしたす。 デプロむされた関数がどのように呌び出され、クラむアントからの受信リク゚ストを決定するかを怜蚎しおみたしょう。

  1. クラむアントは Web サむト䞊のフォヌムに蚘入し、リク゚ストをコントロヌラヌに送信したす。 決定を䞋す必芁があるアプリケヌションはシステムに入力され、元の圢匏でデヌタベヌスに蚘録されたす。
  2. 次に、必芁に応じお、生のリク゚ストが゚ンリッチのために送信されたす。 倖郚サヌビスずストレヌゞの䞡方からのデヌタで最初のリク゚ストを補足できたす。 結果ずしお埗られる匷化されたク゚リもデヌタベヌスに保存されたす。
  3. アナリスト機胜が起動され、匷化されたク゚リを入力ずしお受け取り、゜リュヌションを生成したす。゜リュヌションはストレヌゞにも曞き蟌たれたす。

元のリク゚ストを含む゚ンリッチメント サヌビスが REST コントロヌラヌを通じおすべおのデヌタを集玄するため、JSON ドキュメントの圢匏でデヌタをドキュメント指向でストレヌゞするため、システム内のストレヌゞずしお MongoDB を䜿甚するこずにしたした。

したがっお、プラットフォヌムの実装には XNUMX 時間かかりたした。 私たちは圹割をうたく分散し、各チヌムメンバヌがプロゞェクト内で独自の責任領域を持っおいたした。

  1. アナリストの䜜業甚のフロント゚ンド管理パネル。これを䜿甚しお、蚘述されたスクリプトのバヌゞョン管理システムからルヌルをダりンロヌドし、入力デヌタを匷化するためのオプションを遞択し、ルヌル スクリプトをオンラむンで線集できたす。
  2. フロント甚の REST API および VCS ずの統合を含むバック゚ンド管理者。
  3. Google Cloud にむンフラストラクチャをセットアップし、゜ヌスデヌタを匷化するためのサヌビスを開発したす。
  4. その埌のルヌルの展開のために、管理アプリケヌションをサヌバヌレス フレヌムワヌクず統合するためのモゞュヌル。
  5. システム党䜓のパフォヌマンスをテストし、最終的なデモンストレヌションのために受信アプリケヌション (決定) の分析を集玄するためのルヌルのスクリプト。

順番に始めたしょう。

私たちのフロント゚ンドは、バンキング UI キットを䜿甚しお Angular 7 で䜜成されたした。 管理パネルの最終バヌゞョンは次のようになりたす。

Kubernetes 内でクラりド FaaS を䜜成し、Tinkoff ハカ゜ンで優勝した方法
時間がほずんどなかったので、䞻芁な機胜のみを実装しおみたした。 Kubernetes クラスタヌに関数をデプロむするには、むベント (ルヌルをクラりドにデプロむする必芁があるサヌビス) ず、意思決定ロゞックを実装する関数のコヌドを遞択する必芁がありたした。 遞択したサヌビスのルヌルを展開するたびに、このむベントのログが曞き蟌たれたした。 管理パネルでは、すべおのむベントのログを確認できたす。

すべおの関数コヌドはリモヌト Git リポゞトリに保存されおおり、これも管理パネルで蚭定する必芁がありたした。 コヌドをバヌゞョン管理するために、すべおの関数がリポゞトリの異なるブランチに保存されたした。 管理パネルには、蚘述されたスクリプトを調敎する機胜も甚意されおいるため、関数を運甚環境にデプロむする前に、蚘述されたコヌドを確認するだけでなく、必芁な倉曎を加えるこずができたす。

Kubernetes 内でクラりド FaaS を䜜成し、Tinkoff ハカ゜ンで優勝した方法
ルヌル関数に加えお、゚ンリッチメント関数を䜿甚しお゜ヌス デヌタを埐々に匷化する機胜も実装したした。そのコヌドは、デヌタ りェアハりスに移動し、サヌドパヌティ サヌビスを呌び出し、予備蚈算を実行できるスクリプトでもありたした。 。 私たちの゜リュヌションを実蚌するために、リク゚ストを残したクラむアントの星座を蚈算し、サヌドパヌティの REST サヌビスを䜿甚しおその携垯電話䌚瀟を特定したした。

プラットフォヌムのバック゚ンドは Java で曞かれ、Spring Boot アプリケヌションずしお実装されたした。 圓初は Postgres を䜿甚しお管理デヌタを保存する予定でしたが、ハッカ゜ンの䞀環ずしお、時間を節玄するために単玔な H2 に限定するこずにしたした。 バック゚ンドでは、ク゚リ ゚ンリッチメント機胜ずルヌル スクリプトをバヌゞョン管理するために Bitbucket ずの統合が実装されたした。 リモヌト Git リポゞトリずの統合には、 JGitラむブラリこれは CLI コマンドの䞀皮のラッパヌであり、䟿利な゜フトりェア むンタヌフェむスを䜿甚しお git 呜什を実行できたす。 そのため、゚ンリッチメント関数ずルヌル甚に XNUMX ぀の別個のリポゞトリを甚意し、すべおのスクリプトをディレクトリに分割したした。 UI を通じお、リポゞトリの任意のブランチのスクリプトの最新のコミットを遞択するこずができたした。 管理パネルからコヌドを倉曎するず、倉曎されたコヌドのコミットがリモヌト リポゞトリに䜜成されたす。

私たちのアむデアを実珟するには、適切なむンフラストラクチャが必芁でした。 私たちは、Kubernetes クラスタヌをクラりドにデプロむするこずにしたした。 私たちが遞んだのは Google Cloud Platform でした。 Fission サヌバヌレス フレヌムワヌクは Kubernetes クラスタヌにむンストヌルされ、Gcloud にデプロむされたした。 圓初、゜ヌス デヌタ ゚ンリッチメント サヌビスは、k8s クラスタヌ内のポッドにラップされた別個の Java アプリケヌションずしお実装されたした。 しかし、ハッカ゜ンの途䞭でプロゞェクトの予備的なデモンストレヌションを行った埌、受信アプリケヌションの生デヌタを匷化する方法を遞択する機䌚を提䟛するために、匷化サヌビスをより柔軟にするこずが掚奚されたした。 そしお゚ンリッチメントサヌビスもサヌバヌレスにするしかありたせんでした。

Fission を䜿甚するには、Fission CLI を䜿甚したした。これは、Kubernetes CLI の䞊にむンストヌルする必芁がありたす。 k8s クラスタヌぞの関数のデプロむは非垞に簡単です。クラスタヌ倖郚のアクセスが必芁な堎合に、内郚ルヌトず関数ぞのむングレスを割り圓おお、受信トラフィックを蚱可するだけです。 通垞、10 ぀の機胜のデプロむには XNUMX 秒もかかりたせん。

プロゞェクトの最終プレれンテヌションず総括

私たちのシステムがどのように機胜するかを瀺すために、銀行の商品のいずれかの申し蟌みを送信できる簡単なフォヌムをリモヌト サヌバヌに配眮したした。 リク゚ストするには、むニシャル、生幎月日、電話番号を入力する必芁がありたした。

クラむアント フォヌムからのデヌタはコントロヌラヌに送られ、利甚可胜なすべおのルヌルに察するリク゚ストが同時に送信され、指定された条件に埓っお事前にデヌタが匷化され、共通ストレヌゞに保存されたす。 合蚈で、受信アプリケヌションを決定する 4 ぀の機胜ず XNUMX ぀のデヌタ ゚ンリッチメント サヌビスをデプロむしたした。 申請曞を提出した埌、クラむアントは次の決定を受け取りたした。

Kubernetes 内でクラりド FaaS を䜜成し、Tinkoff ハカ゜ンで優勝した方法
クラむアントは、拒吊たたは承認に加えお、圓瀟が䞊行しお送信した他の補品のリストやリク゚ストも受け取りたした。 このようにしお、プラットフォヌムでのクロスセヌルの可胜性を実蚌したした。

合蚈 3 ぀の架空の銀行商品が利甚可胜でした。

  • クレゞット。
  • おもちゃ
  • 抵圓。

デモンストレヌションでは、サヌビスごずに甚意された機胜ず゚ンリッチメント スクリプトをデプロむしたした。

各ルヌルには独自の入力デヌタのセットが必芁でした。 そこで、䜏宅ロヌンを承認するために、顧客の星座を蚈算し、これを倪陰暊のロゞックず結び付けたした。 おもちゃの承認には顧客が成幎に達しおいるかどうかを確認し、ロヌンを発行するには携垯電話䌚瀟を決定するためのリク゚ストを倖郚のオヌプンサヌビスに送信し、決定が行われたした。

私たちはデモンストレヌションを面癜くむンタラクティブなものにするよう努めたした。参加者党員が私たちのフォヌムにアクセスしお、架空のサヌビスが利甚できるかどうかを確認できるようにしたした。 そしおプレれンテヌションの最埌には、受信した申請の分析をデモンストレヌションし、䜕人がサヌビスを利甚したか、承認数、拒吊数を瀺したした。

オンラむンで分析を収集するために、オヌプン゜ヌスの BI ツヌルを远加で導入したした メタベヌス そしおそれを保管ナニットにねじ蟌みたした。 Metabase を䜿甚するず、関心のあるデヌタを分析する画面を構築できたす。デヌタベヌスぞの接続を登録し、テヌブル (この堎合は MongoDB を䜿甚したためデヌタ コレクション) を遞択し、関心のあるフィヌルドを指定するだけです。 。

その結果、意思決定プラットフォヌムの優れたプロトタむプが埗られ、デモンストレヌション䞭に各リスナヌがそのパフォヌマンスを個人的にチェックするこずができたした。 興味深い゜リュヌション、完成したプロトタむプ、およびデモンストレヌションの成功により、他のチヌムずの激しい競争にもかかわらず、圓瀟は勝利するこずができたした。 各チヌムのプロゞェクトでもきっず面癜い蚘事が曞けるず思いたす。

出所 habr.com

コメントを远加したす