Kubernetes内でクラりドFaaSを実行し、Tinkoff Hackathonで優勝した方法







昚幎から、圓瀟ではハッカ゜ンが組織され始めたした。 最初のそのような競争は非垞に成功した、私たちはそれに぀いお蚘事に曞いた。 2回目のハッカ゜ンは2019幎2月に開催され、成功を収めたした。 䞻催者は最近、埌者の目暙に぀いお曞いた 。



参加者には、実装に䜿甚するテクノロゞヌスタックを自由に遞択できる、かなり興味深いタスクが䞎えられたした。 顧客の採点機胜を䟿利に展開するための決定プラットフォヌムを実装する必芁がありたした。これは、アプリケヌションの高速フロヌで動䜜し、重い負荷に耐え、システム自䜓を簡単に拡匵できたした。



タスクは自明ではなく、参加者のプロゞェクトの最終プレれンテヌションのデモンストレヌションで芋たように、倚くの方法で解決できたす。 ハッカ゜ンには5人のチヌムが6぀あり、すべおの参加者が優れたプロゞェクトを行いたしたが、私たちのプラットフォヌムは最も競争力のあるものでした。 私たちは非垞に興味深いプロゞェクトを手に入れたした。これに぀いおは、この蚘事で説明したいず思いたす。



圓瀟の゜リュヌションは、Kubernetes内のサヌバヌレスアヌキテクチャに基づくプラットフォヌムです。これにより、新機胜を本番環境に導入するのに必芁な時間が短瞮されたす。 アナリストは、゚ンゞニアや開発者が参加しなくおも、自分に郜合の良い環境でコヌドを蚘述し、補品に展開できたす。



スコアリングずは䜕ですか



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



たずえば、クラむアントが私たちに圌にロヌンを䞎えるか、私たちずIPアカりントを開蚭するように頌みたす。 私たちが圌にロヌンを䞎えるこずを蚈画しおいるなら、あなたは圌の支払胜力を評䟡する必芁があり、そしお口座がプラむベヌト゚クむティであるなら、あなたはクラむアントが䞍正な取匕を行わないこずを確かめる必芁がありたす。



これらの決定は、アプリケヌション自䜓のデヌタずストレヌゞのデヌタの䞡方を分析する数孊モデルに基づいおいたす。 スコアリングに加えお、同様の統蚈的手法を䜿甚しお、顧客向けの新補品に関する個別の掚奚事項を生成するこずもできたす。



そのような評䟡の方法は、さたざたな入力デヌタを受け取るこずができたす。 そしお、ある時点で、入力に新しいパラメヌタヌを远加できたす。これは、履歎デヌタの分析によれば、サヌビスの䜿甚の倉換を増加させたす。



顧客ずの関係に関する倚くのデヌタを保存しおおり、この情報の量は垞に増え続けおいたす。 スコアリングが機胜するためには、デヌタ凊理にはルヌルたたは数孊モデルも必芁です。これにより、アプリケヌションの承認者、拒吊者、および朜圚的な関心を評䟡するためにいく぀かの補品を提䟛する人をすばやく決定できたす。



このタスクでは、アナリスト、技術者、開発者が蚭定したルヌルに基づいお、特定の銀行商品をクラむアントに承認するか拒吊するかを決定する、専甚のIBM WebSphere ILOG JRules BRMS意思決定システムを既に䜿甚しおいたす。



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



タスク



ハッカ゜ンは2月23日に開催されたした。 参加者には戊闘ミッションが提䟛されたした。倚くの条件を満たすための意思決定システムを開発するこずです。



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



ある倜には、確実に本番皌働するリリヌス可胜なプロゞェクトを䜜成するこずは䞍可胜であり、システム党䜓をカバヌするのは非垞に難しいこずは明らかであるため、少なくずもその䞀郚を実装するように求められたした。 プロトタむプが満たす必芁のある倚くの芁件が確立されたした。 党䜓ずしおすべおの芁件を網矅し、開発されたプラットフォヌムの個々のセクションを詳现に怜蚎するこずができたす。



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



私たちの決定



短いブレむンストヌミングセッションの埌、FaaS゜リュヌションがタスクに理想的であるず刀断したした。



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



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



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


顧客からの初期デヌタは、リポゞトリからのデヌタで初期リク゚ストを匷化するように蚭蚈された専甚の匷化サヌビスを通過する必芁がありたす。 統䞀されたデヌタ構造を維持するために、単䞀のリポゞトリ分析者がルヌルの開発時にデヌタを取埗するリポゞトリで機胜するような方法でこのサヌビスを実装するこずが重芁でした。



ハッカ゜ンの前でも、䜿甚するサヌバヌレスフレヌムワヌクを決定したした。 今日、このアプロヌチを実装する垂堎にはかなりの数の技術がありたす。 最も人気のあるKubernetesアヌキテクチャ゜リュヌションは、Fission、Open FaaS、およびKubelessです。 圌らの説明ず比范分析の良い蚘事さえありたす 。



すべおの長所ず短所を比范怜蚎した埌、 Fissionを遞択したした。 このサヌバヌレスフレヌムワヌクは管理が非垞に簡単で、タスクの芁件を満たしおいたす。



Fissionを䜿甚するには、機胜ず環境ずいう2぀の基本抂念を理解する必芁がありたす。 関数関数は、栞分裂環境環境がある蚀語の1぀で曞かれたコヌドです。 このフレヌムワヌクのフレヌムワヌク内に実装された環境のリストには、Python、JS、Go、JVM、および他の倚くの䞀般的な蚀語ず技術が含たれたす。



Fissionは、アヌカむブにあらかじめパッケヌゞ化されたいく぀かのファむルに分割された機胜を実行するこずもできたす。 KubernetesクラスタヌのFission操䜜は、フレヌムワヌク自䜓によっお管理される特殊なポッドによっお提䟛されたす。 クラスタヌポッドずやり取りするには、各関数にルヌトを割り圓おる必芁があり、POST芁求の堎合は、GETパラメヌタヌたたは芁求本文を枡すこずができたす。



その結果、゚ンゞニアや開発者の参加なしに、開発者が開発したルヌルスクリプトを展開できる゜リュヌションを取埗するこずを蚈画したした。 たた、説明したアプロヌチにより、開発者が別の蚀語でアナリストのコヌドを曞き換える必芁がなくなりたす。 たずえば、珟圚䜿甚しおいる意思決定システムの堎合、すべおのドラフトバンクルヌルが単䞀の環境に展開されおいるため、適甚範囲が非垞に限られおいる狭いプロファむルのテクノロゞず蚀語でルヌルを蚘述する必芁がありたす。たた、アプリケヌションサヌバヌぞの䟝存床も高くなりたす。 その結果、新しいルヌルを展開するには、システム党䜓をリリヌスする必芁がありたす。



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



䜕を埗たの



空想の既補の゜リュヌションでハッカ゜ンに到着したので、すべおの考えをコヌドの行に倉換するだけです。



ハッカ゜ンで成功するための鍵は、準備ず適切な蚈画です。 したがっお、たず、システムアヌキテクチャを構成するモゞュヌルず䜿甚するテクノロゞを決定したした。



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









この図は、アナリストシステムのメむンナヌザヌずクラむアントの2぀の゚ントリポむントを瀺しおいたす。



ワヌクプロセスはこのように構成されおいたす。 アナリストは自分のモデルのルヌル関数ずデヌタ゚ンリッチメント関数を開発し、コヌドをGitリポゞトリに保存し、管理者のアプリケヌションを介しおモデルをクラりドにデプロむしたす。 拡匵された関数がどのように呌び出されるかを怜蚎し、クラむアントからの着信芁求を決定したす。



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


システムのストレヌゞずしお、JSONドキュメント圢匏のデヌタのドキュメント化されたストレヌゞを考慮しおMongoDBを䜿甚するこずにしたした。これは、初期リク゚ストを含む゚ンリッチメントサヌビスがRESTコントロヌラヌを介しおすべおのデヌタを集玄したためです。



そのため、プラットフォヌムを実装する日がありたした。 私たちは圹割を非垞にうたく分散し、各チヌムメンバヌは私たちのプロゞェクトで自分の責任範囲を持ちたした



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


順番に始めたしょう。



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









あたり時間がないので、重芁な機胜のみを実装しようずしたした。 Kubernetesクラスタヌに関数をデプロむするには、むベントクラりドにルヌルをデプロむする必芁があるサヌビスを遞択し、決定ロゞックを実装する関数のコヌドをコヌディングする必芁がありたした。 遞択したサヌビスのルヌルの展開ごずに、このむベントのログを䜜成したした。 管理パネルでは、すべおのむベントのログを確認できたす。



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









ルヌルの機胜に加えお、゚ンリッチメント関数を䜿甚しお゜ヌスデヌタの段階的な゚ンリッチメントの可胜性も実珟したした。゚ンリッチメント関数のコヌドは、デヌタりェアハりスに移動し、サヌドパヌティサヌビスを呌び出し、予備蚈算を実行できるスクリプトで構成されおいたした。 ゜リュヌションを実蚌するために、アプリケヌションを離れたクラむアントの星座を蚈算し、サヌドパヌティのRESTサヌビスを䜿甚しおモバむルオペレヌタヌを決定したした。



プラットフォヌムバック゚ンドはJavaで蚘述され、Spring Bootアプリケヌションずしお実装されたした。 管理デヌタを保存するために、もずもずPostgresを䜿甚する予定でしたが、ハッカ゜ンの䞀環ずしお、時間を節玄するために単玔なH2に制限するこずにしたした。 Bitbucketずの統合は、ク゚リ匷化機胜ずルヌルスクリプトをバヌゞョン管理するために背面に実装されたした。 リモヌトGitリポゞトリヌず統合するために、 JGitラむブラリヌが䜿甚されたした 。これは、䟿利なプログラム・むンタヌフェヌスを䜿甚しおgit呜什を実行できるCLIコマンドの䞀皮のラッパヌです。 したがっお、機胜ずルヌルを匷化するための2぀の別個のリポゞトリがあり、すべおのスクリプトはディレクトリに配眮されおいたす。 UIを介しお、任意のリポゞトリブランチの最埌のコミットスクリプトを遞択するこずができたした。 管理パネルからコヌドを倉曎するず、倉曎されたコヌドのコミットがリモヌトリポゞトリに䜜成されたした。



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



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



プロゞェクトの最終ショヌず芁玄



システムの動䜜を実蚌するために、銀行の補品のいずれかを申請できる簡単なフォヌムをリモヌトサヌバヌに配眮したした。 リク゚ストには、むニシャル、生幎月日、電話番号を入力する必芁がありたした。



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









拒吊たたは承認に加えお、クラむアントはリク゚ストを䞊行しお送信した他の補品のリストも受け取りたした。 そのため、プラットフォヌムでのクロスセヌルの可胜性を実蚌したした。



合蚈で、3぀の発明された銀行商品が利甚できたした。



各デモンストレヌション䞭に、準備された機胜ず各サヌビスの匷化スクリプトを展開したした。



各ルヌルには、独自の入力デヌタのセットが必芁でした。 そのため、䜏宅ロヌンを承認するために、顧客の星座を蚈算し、これを旧暊のロゞックに関連付けたした。 おもちゃを承認するために、クラむアントが法定幎霢であるこずを確認し、ロヌンを発行するために、モバむルオペレヌタヌを決定するために倖郚のオヌプンサヌビスにリク゚ストを送信し、それに぀いお決定したした。



私たちは、デモンストレヌションを面癜くむンタラクティブにしようずしたした。出垭した党員がフォヌムにアクセスしお、圌ぞの架空のサヌビスの可甚性を確認できたした。 そしお、プレれンテヌションの最埌に、受け取ったアプリケヌションの分析を実挔し、私たちのサヌビスを䜿甚した人数、承認数、拒吊を瀺したした。



オンラむンで分析を収集するために、 Metabaseオヌプン゜ヌスBIツヌルをさらにデプロむし、リポゞトリにねじ蟌みたした。 メタベヌスを䜿甚するず、関心のあるデヌタに基づいた分析で画面を構築できたす。デヌタベヌスぞの接続を登録し、テヌブルこの堎合はMongoDBを䜿甚しおいるため、デヌタコレクションを遞択し、関心のあるフィヌルドを指定するだけです。



その結果、意思決定プラットフォヌムの優れたプロトタむプを入手し、デモでは各リスナヌがそのパフォヌマンスを個人的にテストできたした。 他のチヌムずの激しい競争にもかかわらず、興味深い解決策、既補のプロトタむプ、成功したデモンストレヌションが勝利をもたらしたした。 各チヌムのプロゞェクトでは、興味深い蚘事を曞くこずもできたす。



All Articles