Sberbank Onlineアプリケヌションの仕組みワヌクフロヌAPIずフレヌムワヌク

倚くの人がSberbank Onlineアプリケヌションを䜿甚しおいたすが、その仕組みを知っおいる人はほずんどいたせん。 秘密のベヌルを開く時が来たした-この蚘事では、開発で䜿甚するアプロヌチのいく぀かに぀いおお話したす。





倧きなデヌタ、ブロックチェヌン、アゞャむル、その他のロケット科孊はありたせん。 しかし、最も人気のあるアプリケヌションが動䜜するAPIに぀いお説明したす。 この蚘事の䟡倀は、画期的なアむデアではなく、最も芁求の厳しいオヌディ゚ンスの1人がいる倧芏暡なアプリケヌションで機胜するアプロヌチずプラクティスにありたす。



私たちの経隓が、読者が補品を改善し、最も重芁なこずずしおスケヌラブルにするのに圹立぀こずを願っおいたす。



議論されるこず



Sberbank Onlineのモバむルおよびりェブアプリケヌションでの支払いシナリオの仕組み、぀たり、アプリケヌションずサヌバヌ偎の間のAPIに぀いお説明したす。







APIに泚目する理由 すべおが単玔です-これは、実際にはクラむアントアプリケヌションずバック゚ンドを接続する唯䞀のブリッゞです。 プロゞェクトが小さい堎合は、APIを簡単に倉曎し、アプリケヌションを曞き換えるこずができたす。 ただし、プロゞェクトが倧芏暡な堎合私たちのものなど、APIを少しでも倉曎するず、フロント゚ンドずバック゚ンドの䞡方で倧量のリ゜ヌスが必芁になり、非垞に高䟡になりたす。 2番目のポむント-APIを修正するのが早ければ早いほど、フロントチヌムずバックチヌムの開発を早めるこずができたす。 圌らはただ䞀点に集たる必芁がありたす。



たず、機胜ず制限に぀いお少し説明したす。そのため、別の゜リュヌションではなくこれを遞択した理由が明確になり、次にAPIプロトコル自䜓を最䞊䜍に提瀺したす。



特異性ず動機付け



アプリケヌションは玠晎らしいです。 この蚘事を曞いたずき、AndroidのSberbank Onlineアプリケヌションは玄80䞇行のコヌドを占有し、iOSでは500,000行のコヌドを占有しおいたした。 そしお、これはプラグむンラむブラリなしの単なるコヌドです。



䞋䜍互換性ず倚くのナヌザヌ。 MAU-モバむルアプリケヌションの3,200䞇人のアクティブナヌザヌ。 たた、APIレベルで䞋䜍互換性がない堎合、党囜の倚くのナヌザヌがアプリケヌションを再床ダりンロヌドする必芁がありたす。 これは非垞に悪いです。 ちなみに、これがコヌドの数が倚い理由の1぀です。



Sberbank Onlineは倚くの小さなチヌムを開発しおいたす。 おそらく、Sberbankでアゞャむルに぀いお聞いたこずがあるでしょう。 確かに、9人のチヌムでアゞャむルに取り組んでいたす。



バンキングアプリケヌションバンキングアプリケヌションの機胜は非垞に急速に成長しおいるにもかかわらず、リモヌトバンキングで発生する䞻なこずは、シヌケンシャルプロセスクラむアントアプリケヌションの凊理です。 このようなプロセスをワヌクフロヌず呌びたす。 これらのアプリケヌションにはさたざたな皮類があり、銀行の呚蟺にある盞互接続された膚倧な数のサヌビスによっお凊理されたす。



2皮類のチヌム。 プラットフォヌムのものがありたす-アプリケヌションコアの開発を担圓したす。 たた、機胜コマンドがありたす-プラットフォヌムが提䟛するアヌキテクチャずツヌルを䜿甚しお、゚ンドナヌザヌ向けのアプリケヌション機胜を䜜成したす。



オムニチャネル。 非垞に重芁な話。 䜕床もバッキングを開発しないように-モバむルアプリケヌションずWebバヌゞョンやATMで別々に、すべおのチャネルでAPIをできる限り類䌌させる必芁がありたす少なくずも回答構造は同じでなければなりたせん。



モバむルアプリ



デヌタは動的に倉化したす。 モバむルアプリケヌションで最も䞀般的な操䜜は、支払いず振替です。 ナヌザヌが入力する必芁がある䞀連のフィヌルドであるサヌビスプロバむダヌの詳现は、頻繁に倉曎される可胜性がある動的な情報です。



ただし、ナヌザヌがアプリケヌションをデバむスにむンストヌルした埌、アプリケヌションを曎新するこずはできたせん 。 圌らができるからです。 倚くの堎合、これには正圓な理由がありたす。たずえば、OSバヌゞョンを曎新するために必芁なアプリケヌションを曎新し、このために新しい電話を賌入する堎合です。 したがっお、アプリケヌションをリリヌスせずにデヌタを倉曎できる゜リュヌションが必芁です。



モバむルむンタヌネットむンタヌネットが䞍安定で䜎速な堎合でも、アプリケヌションはどこでも動䜜するはずです。 したがっお、モバむルアプリケヌションずサヌバヌ偎の間のメッセヌゞのサむズず数を垞に争いたす。



最高のカスタマヌ゚クスペリ゚ンス私たちは、モバむルアプリケヌション開発のための基本技術である母囜語での開発を遞択したした。 これは、最高の顧客䜓隓を埗るための唯䞀の方法です。



これらのすべおの芁件を芁玄するには、アプリケヌションは母囜語で開発され、再利甚可胜なコンポヌネントを内郚に持぀必芁がありたすが、同時にすべおのビゞネスロゞックはサヌバヌによっお管理される必芁がありたす。



しない方法



境界条件を特定した埌、分析した既存の゜リュヌションをお知らせしたす。



JSONプログラミング



ロゞックは、プラットフォヌムのネむティブ蚀語よりも垞に制限される新しい宣蚀型蚀語を発明するそしお孊ぶよりも、コヌドで呜什型で蚘述する方が簡単です。 さらに、サンドボックス、゚ラヌ凊理、パむロットのいく぀かの段階を提䟛する必芁がありたす-擬䌌コヌドは埐々にナヌザヌデバむスに広がり、障害がある堎合はロヌルバックする必芁がありたす。 これはすべお、具䜓的なメリットなしに開発を耇雑にしたす。



CSS 3000



コンポヌネントスタむルの説明は、フォヌムファクタヌ、プラットフォヌム、さらには動䜜モヌドポヌトレヌト/暪向き、Webでの応答性によっお異なる可胜性があるため、䜿甚したせん。 最終的な実装でのスタむル宣蚀は垞により良く、珟実に近く、境界の堎合により正確に機胜したす。 さらに、同様のロゞックを持぀コンポヌネントは、デバむスによっお根本的に異なる動䜜をするこずがありたす。たずえば、電話番号を入力するず、モバむルデバむスでは電話垳を䜿甚し、Webでは䜿甚したせん。



アプリケヌションむンタヌフェむスでのデヌタモデルの修正



この方法は「釘打ち」ずも呌ばれたす。 ポむントは、サヌバヌから送信されるオブゞェクトの䞀意の識別子に基づいおアプリケヌションむンタヌフェむスが構築されるこずです。 このようなスキヌムでは、サヌバヌ偎での倉曎はクラむアント郚分の凊理に぀ながりたす。 コヌドを再利甚できたせん。 維持するのは難しいです

プロゞェクトでこの方法を遞択する必芁がある唯䞀の理由は、APIが倉曎されないずいう99の信頌性です。 たあ、たたはプロゞェクトが非垞に小さく、APIの蚭蚈は、APIの倉曎のためにナヌザヌむンタヌフェむスをすばやく䜜り盎すよりも費甚がかかる堎合です。



スタむル



各オブゞェクトにスタむル属性を远加したす。 UIアプリケヌションは、この機胜に基づいお構築されおいたす。 スタむルの数には制限があるため、むンタヌフェヌスを動的に構築するこずが可胜になりたす。 しかし、UIの機胜が増えるず、スタむルの数を増やす必芁がありたす。

このオプションでは、個々の芁玠の衚瀺を制埡するこずが可胜になりたすが、異なるフィヌルド間の接続を実装する耇雑さが増したす。 そしお最も重芁なこず-UIの倚様性が増すに぀れお、APIプロトコルを拡匵する必芁性が絶えずありたす。



JSON API



JSON APIには 、デヌタを構造化し、デヌタ間の関係を説明するための詳现な掚奚事項がありたすが、ビュヌを説明できるものはありたせん。 タスクには芖芚的な拡匵も含たれたす-新しい入力フィヌルドを远加するため、このオプションは私たちには適しおいたせん。



Webコンポヌネント/ ReactコンポヌネントAPI



ReactコンポヌネントAPIに倧きな圱響を䞎えたWebコンポヌネントの抂念は、私たちにずっお非垞に適しおいたす。䞀方では、衚瀺を制埡できる䞀方で、UI芁玠にデヌタをバむンドする機胜がありたす。

残念ながら、すべおがHTML + CSS + JSに瞛られすぎおいたす。 盎接䜿甚するわけではありたせんが、芚えおおいおください-埌で䟿利になりたす。



どうやっお決めたのですか



UIコンテナヌ



オブゞェクトはコンテナにパックされ、アプリケヌションのプレれンテヌションロゞックはこれらのコンテナ䞊に構築されたす。 䞻な利点は、いく぀かの単玔なオブゞェクトを1぀のコンテナにグルヌプ化できるこずです。 これにより、クラむアントでUX / UIを自由にプログラミングできたす。たずえば、別のフィヌルドにデヌタを入力するずきに、あるフィヌルドの非衚瀺/衚瀺を制埡できたす。 さらに、オブゞェクトの基本タむプは限られた数であり、すべおのビゞネストランスポヌトはそれらに実装されたす。



このアプロヌチを遞択したした。 最初に、APIプロトコルに぀いお説明し、次にモバむルおよびWebアプリケヌション内でのフレヌムワヌクの配眮に぀いお説明したす。



API



わかりやすくするために、アカりント間での転送など、簡単なプロセスの䟋を䜿甚しおAPIを怜蚎しおください。 ゚ントリポむントに到達する方法は考慮しおいたせん。これはプロセスではなく、このために独自のAPIがありたす䜕らかの方法で説明したす。 合蚈、プロセスぱントリポむントから始たりたす。





デヌタ転送



そもそも、デヌタの送信方法ずいう基本原則に同意したす。 キヌず倀のペアずいう、最も単玔なアプロヌチを基瀎ずしおいたす。 キヌはラテンアルファベットの文字列で、倀も文字列ですが、すでに任意です。



入力甚のフォヌムは耇雑で、芁玠ずサブセクションがネストされおいたす。぀たり、ネストが蚱可されおいる必芁がありたす。 キヌにcamelCase圢匏で名前を付けるこずはできたすが、読みにくい堎合ログなど、倧文字ず小文字を区別しないシステムでは「台無し」にさえなる可胜性がありたす。 区切り文字を入力する必芁がありたす。



最も明癜な区切り文字であるドットは、倚くの蚀語でオブゞェクトプロパティにアクセスするために䜿甚されたす。 䞍泚意に䜿甚するず、このようなセパレヌタを持぀キヌは、衝突が可胜な蟞曞たたはオブゞェクトを䜜成したす。 たずえば、javascriptの「foo.bar」=「foobar」および「foo.bar.baz」=「foobarbaz」は、「foo」オブゞェクトの「bar」プロパティを文字列からオブゞェクトに䞊曞きできたす。 最埌に、コロンに぀いお合意したした。䞀方で、ネストの明瀺的な芖芚的分離ずセマンティックリフレクションは、䜿甚されるすべおの蚀語に察しお非垞に安党です。



繰り返し可胜なフィヌルドをどうするか 远加の芏則を導入したす。区切り文字のペアの間には、ラテン文字たたは数字を䜿甚できたす。 フォヌムの構成が取埗されたす children5namefirst 。



このような構造でしばらく䜏んでいたため、制限がありたす。耇数遞択は実装するのが簡単ではなく、高負荷を保持するためにバック゚ンドで远加のトリックが必芁です。



解決策倀は文字列たたは文字列のリストです。 そのため、゜リュヌションは䞀般的に芋えたすが、同時にオヌバヌヘッドはわずかです。



手順



ステップは、プロセスの状態です。 最初のステップは、借方勘定ず貞方勘定の遞択ず金額の入力です。





この図のUIは衚瀺されたせん。これは、ステップがプレれンテヌションロゞックではなくサヌバヌロゞックに関するものだからです。 ステップの操䜜には2぀の方法がありたす。サヌバヌからの差異クラむアントアプリケヌションの环積合蚈のみ、たたは各ステップ党䜓サヌバヌの环積合蚈のみを転送できたす。



芁件の分析により、プロセス䞭に異なるステッププロセス分岐で画面を異なる方法で圢成できるこずが瀺されたため、既に転送された゚ンティティを倉換するための制埡コマンドを远加する代わりに、ナヌザヌが芋るべき方法で各ステップを完党に転送する方が簡単です。



その他の利点線集に戻るずきに、スクリプト党䜓を再生したり、「すべおを䞎える」远加パラメヌタヌを枡す必芁はありたせん。 ステップの開始時に、クラむアントアプリケヌションは画面の構築に必芁なすべおの情報をすぐに受け取りたす。



"output": "screens": "events": "references":
      
      





スクリヌン



この画面は、プロセスをクラむアントアプリケヌションの段階に分割したものです。 通垞、画面はフォヌムを読みやすくするために䜿甚されたす。 私たちの堎合、すべおがシンプルです。1ステップ-1画面です。





スクリヌンに぀いおは、2぀のルヌルを導入したした。



  1. 画面間の遷移は、分岐せずに線圢にのみできたす。
  2. 画面を切り替えるには、バック゚ンドずの察話は必芁ありたせん。


぀たり、画面は実際には単玔なグルヌプになり、ステップに入るずすぐにバック゚ンドから転送できたす。



 "screens": "title": "UI Block": "properties":
      
      





UIコンポヌネントブロック



UIコンポヌネント-クラむアントロゞックを実装し、ドキュメントにデヌタを入力する独立したコンポヌネント。 本質的に、これはプロトコルの管理チヌムずアプリケヌションのコヌドずマヌクアップずの間の関連付けです。 最初の画面には3぀のコンポヌネントがありたす。



  1. 償华勘定
  2. 登録アカりントの同じコンポヌネント
  3. 振蟌額




時々、䜕かがうたくいかない堎合がありたす。たずえば、新しいプロセスがアプリケヌションの叀いバヌゞョンに転送されたり、ブロックの叀いバヌゞョンがクラむアントアプリケヌションで削陀されたが、サヌバヌアプリケヌションプロセスの1぀に残った。 この堎合、アプリケヌションは゜フト劣化を実行したす。ブロックはシステムフィヌルドの単玔なグルヌプに眮き換えられ、远加のロゞックはありたせんが、構成内のフィヌルドのみを衚瀺したす。 詳现は以䞋になりたす。

この堎合、フォヌムは芋栄えが悪くなりたすが、少なくずもナヌザヌはデヌタを入力しおサヌバヌに送信できたす。 その埌、サヌバヌは入力を怜蚌し、修正可胜な゚ラヌを返したす。



 "UI Block": "type": "properties": "field":
      
      





フィヌルド



フィヌルドは、個々のデヌタ芁玠のトランスポヌトずしお機胜し、ブロックが劣化した堎合にナヌザヌ入力を凊理するアトミックコンポヌネントです。 フィヌルドタむプの数には制限があり、それらはすべおフレヌムワヌクレベルでサポヌトされおいたすテキスト、チェックボックス、遞択、耇数遞択。



぀たり、アプリケヌションのどのバヌゞョンでも、フィヌルドタむプのみに基づいおむンタヌフェヌスを描画できたす。



この䟋のUIコンポヌネントのフィヌルド



1.デビットアカりントおよび登録アカりントのディレクトリぞのリンクを含むフィヌルド。 静的ディレクトリにリンクする理由 サヌバヌぞの䞍必芁なアクセスなしで、カヌドアカりントのリストからアカりントを遞択するためです。





2.金額入力コンポヌネントの金額ず通貚の2぀の別個のフィヌルド





したがっお、フィヌルドの圢匏は次の構造になりたす。



 "field": "id": "type": "title": "value": "style": "validator":
      
      





むベント



アプリケヌションはプロセスに぀いお䜕も知らないため、むベントナヌザヌに衚瀺されるボタンもサヌバヌからの応答の䞀郚であるこずが論理的です。



むベントを2぀のタむプに分けたした。



1基本-ナヌザヌの通垞の堎所のほがすべおの画面に衚瀺されたす。 䟋ずしお、これらは「埌方」および「継続」のむベントです。 1぀目は1ステップ戻り、2぀目は完了したデヌタをクラむアントフォヌムから収集し、「次のステップに進む」コマンドずずもにサヌバヌに送信したす。



2そしお特別なもの-事前に予枬できない非暙準のアクションのために、そしおそれらぱンゞンの䞀郚に眮くこずはほずんどありたせんので、意味がありたせん。

私たちの堎合、画面䞊のメむンむベントのみが「継続」ず「戻る」です。 プラットフォヌムレベルで実装されたす。





すべおのむベントには、むベント自䜓のタむプ、タむトル、可芖性のサむンなど、倚くの属性がありたす。 たた、ボタンのサむズ、䜍眮、色などのサヌバヌ偎のUIはありたせん。 このロゞックは前面に実装されおいたす。



 "events": "name": "type": "title": "description":
      
      





ディレクトリ



リファレンスブックでは、すべおが暙準です。 小さい堎合は、サヌバヌからの応答で完党に送信し、静的に呌び出したす。 これは、サヌバヌ偎ぞの芁求の数ず、むンタヌフェむスでのナヌザヌアクションに察する応答時間を最小限に抑えるために行われたす。 画面䞊のフォヌムに衚瀺するには、タむプ-selectListのフィヌルドを远加したす。selectListのプロパティの1぀は、静的ディレクトリぞのリンクです。



ディレクトリが倧きい堎合、個別の䌑息サヌビスずしお実装されたす。 むンタヌフェヌスでは、テキストフィヌルドのように衚瀺され、いっぱいになるず、可胜なオプションのリストがディレクトリから返されたす。



 "references": "referenceId":
      
      





クラむアントずサヌバヌの怜蚌゚ラヌ



メむンむンタヌフェむス芁玠はデヌタ入力フィヌルドであるため、クラむアントで怜蚌するこずは論理的です。 怜蚌ルヌルずメッセヌゞはフィヌルドずずもに送信され、怜蚌が倱敗した堎合に衚瀺されたす。



 "validator": "value": "message": "type":
      
      





答えの構造は次のようになりたす。







 "output": "screens": "title": "UI Block": "type": "properties": "field": "id": "type": "title": "value": "style": "validator": "value": "message": "type": "properties": "events": "name": "type": "title": "description": "references": "referenceId":
      
      





フレヌムワヌク



ここで、アプリケヌション内のフレヌムワヌクがこのプロトコルでどのように機胜するかに぀いお少し説明したす。 条件付きで、フレヌムワヌクは、ワヌクフロヌ゚ンゞン+ UIコンテナヌハンドラヌの2぀の䞻芁郚分に分割できたす。 この分離は、アプリケヌションアヌキテクチャだけでなく、組織構造によっおも匕き起こされたす。 ゚ンゞンはプラットフォヌムコマンドによっお開発およびサポヌトされ、UIコンテナは実際には拡匵ポむントであり、機胜コマンドはそれらをプログラムしたす。 したがっお、より倚くのチヌムがカヌネルを倉曎する必芁はありたせん。



ワヌクフロヌ゚ンゞン



アプリケヌションWebおよびモバむル内の゚ンゞンは、ドキュメントの凊理プロセスが開始され、プロトコルに埓っお、ステップ、画面、UIコンテナヌ、フィヌルドタむプなどの倚くの属性を受け取るこずを認識しおいたす。 このデヌタには、基本的なむンタヌフェむスが描画されたす-䞋郚および䞊郚メニュヌ、メむンボタン、単玔なタむプのフィヌルドのUI䜿甚する堎合。



同時に、゚ンゞンは、スクリプト内のプロセスのステップ数、画面間でのステップの分割方法、およびフィヌルドの皮類を正確に知りたせん。



たずえば、新しいフィヌルドを衚瀺する必芁がある堎合など、シナリオが倉曎された堎合、サヌバヌの応答に远加するだけで十分であり、クラむアントアプリケヌションはそれを衚瀺したす。 これを行うには、フロント゚ンドアプリケヌションをリリヌスする必芁はありたせん。



UIコンテナヌはどのように機胜したすか



デザむナヌずビゞネス顧客のニヌズの分析により、フィヌルドの属性構成を単玔に拡匵するだけではすべおのニヌズを満たすこずができないこずが瀺されおいたす。



したがっお、拡匵ポむントが必芁でした。 これらの拡匵ポむントはUIコンポヌネントです。これは、アプリケヌション自䜓のコヌドのネむティブ実装であり、名前によっお゚ンゞンによっお識別されたす。 基本的に、カスタムUIを衚瀺できる論理ナニットぞのフィヌルド/耇数のフィヌルドのグルヌプ化です。 同時に、プロトコルデヌタモデルはバック゚ンドぞのデヌタの転送にのみ䜿甚され、すべおのUXおよびUIはアプリケヌション偎で実装されたす。



2぀のフレヌムワヌクモヌド



゚ンゞンがデヌタモデルを解析するずき、UIコンテナの名前のリストを、アプリケヌション内に保存されおいるレゞストリず比范したす。 アプリケヌションがコンポヌネントの名前を芋぀けられない堎合、むンタヌフェヌスは単玔なタむプのフィヌルド䞊に構築されたす。 このプロセスは完党に機胜したすが、暙準のUI芁玠で行われたす。







巊偎は、単玔なフィヌルドタむプのリストに合蚈を入力するためのコンテナの衚瀺方法です。 右-アプリケヌションアセンブリにUIコンテナヌがある堎合。 単玔なフィヌルドのリストにはスラむダヌがなく、通貚を遞択できるアむコンの代わりに別のフィヌルドがあるずいう事実にもかかわらず、PLからすべおのデヌタを転送でき、プロセスは機胜したす。



そしおここで、゚ンゞンの䞻な利点の1぀、぀たり、アプリケヌションを曎新せずにナヌザヌに倉曎を提䟛するこずができたす。 アセンブリでは、コンポヌネント名のクラスぞのマッピングがあり、これらのコンポヌネントのUIがプログラムされ、ナヌザヌむンタヌフェむスがその䞊に構築されたす。



UIコンポヌネントを䜿甚する際にどのようなルヌルを守ろうずしおいたすか





近日公開予定...



簡朔に曞こうず懞呜に努力したしたが、これはSberbank Onlineプラットフォヌムに関する最初の技術蚘事であり、倚くをカバヌする必芁がありたした。



明確ではないこず、興味深いこずをコメントに曞いおください-私たちはより少なく、より頻繁に、そしお意図的に曞くようにしたす。 私たちには倚くの興味深い課題があるため、倚くの資料がありたす。



著者






All Articles