Dodo Pizzaのように、圌らは技術的な゚ラヌのために1時間で800䞇人を倱い、その埌戻っおきたした







Yandex.Tellerのパヌトナヌであるセンセヌショナルな技術的゚ラヌ「Dodo Pizza」の話は、同瀟のシステムアヌキテクトであるAndrei Morevskyから語られたした。すぐにマむクを䜜者に転送したした。







サンクトペテルブルクで最初のドヌドヌピッツェリアを開くためにサプサンに行きたす。そのずき、支払い枈みの泚文の耇数のキャンセルに関する通知を突然受け取りたす。 そしお、耇数のものだけではありたせん-私たちのシステムは、1時間で800䞇ルヌブルの支払い枈みの泚文をロヌルバックするこずができたした







今、この話は笑顔を匕き起こすだけですが、その朝はたったく面癜くありたせんでした。 したがっお、むンシデントの技術的な詳现ず結論を共有し、同時にDodo Pizza泚文凊理システムに぀いお少しお話したいず思いたす。







その朝、私たちはすぐにYandex.Kassaチヌムに連絡し、そのような状況は通垞2〜3回のトランザクションで発生し、個別に解決されるこずを知りたした。 そのような操䜜ごずに、支払いシステムチヌムは特定の銀行に連絡しお芁求を亀換する必芁があるため、問題は耇雑に芋えたした。 受け取っおいないお金を返枈したこずに気づいたのは特にがっかりでした。これらはテスト泚文でした。







少し遡及的および損倱情報。

サヌバヌは784䞇ルヌブルの支払いをキャンセルしたした。 幎間売䞊高が玄30億のネットワヌクの堎合、これは重倧なお金です。 さらに、これは最終ラりンドで集められた投資の10以䞊です。 同意したすが、䟡栌は1぀の間違いに察しお深刻すぎたす。







同じ日に、ネットワヌクの創蚭者であるFedor Ovchinnikovが゜ヌシャルネットワヌクに関する事件を報告し、その話はすぐにニュヌスサむトに広がりたした。







そしおすぐにネタバレ-それはすべおうたく終わりたした



私たちは資金を返枈するために最善を尜くしたしたが、読者はこれが䞀般的にどのように起こるかに぀いお戞惑い、「プログラマヌ」に察する報埩の遞択肢を無謀に敎理したした。 はい、私は個人的に知り合いから玄12の䞍快なメッセヌゞを受け取りたした。みんなはすべおが私ず䞀緒にうたくいくかどうかに興味があり、「䞇が䞀に備えお」空垭を提䟛したした。







週末に、Yandex.Kassaの経営陣たで、党員が問題に぀ながりたした。 支払いシステムチヌムは、誀った返品をキャンセルするための操䜜に぀いおパヌトナヌ銀行ず合意するこずができたした。 それは本圓に倧きな仕事でした。1䞇件以䞊のトランザクションを手動で゜ヌトする必芁がありたした。







その結果、圌らは私たちにお金を返したしたが、銀行手数料の振蟌みで15䞇ルヌブルを倱いたしたが、顧客のSMS通知にさらに4䞇ルヌブルが費やされたした..







原因ず結果を求めお



Dodo Pizzaは初日から独自の情報システムDodo ISを開発しおいたす。

珟圚、このシステムは24時間䜓制で9か囜の183のピザ屋にサヌビスを提䟛しおいたす。 5幎間の開発の間に、泚文の原始的なブロックから、泚文、キッチンでの䜜業、スケゞュヌリング、圚庫、財務など、ビゞネスのほがすべおの偎面を管理する本栌的なクラりドERPシステムに移行したした。







Dodo ISをいく぀かの環境でテストしたす。補品マネヌゞャヌぞのデモンストレヌション甚のサンドボックス、統合ルヌプがありたす。 運甚環境に投入する前に、アナリストずQAが安定した環境で最終バヌゞョンをテストしたす。 怜蚌には、実際のデヌタを䜿甚したす。これは、定期的に「戊闘」ベヌスからコピヌしたす。 もちろん、実皌働環境の境界を越えるずきのすべおのデヌタ-**環境**は非個人化されたす。







安定した環境では、泚文に関係のない支払いのキャンセルなど、戊闘条件を完党に再珟しようずしたす。 実際の状況では、そのような支払いは、支払いプロセスの゚ラヌ、たたはナヌザヌによる泚文のキャンセル手順が誀っお完了したこずが原因で発生する堎合がありたす。 テスト環境でキャンセルがどのように発生するかを確認するために、特別なタスクがスケゞュヌルに埓っお起動され、テヌルがクリヌンアップされたす。







事件の前日、マヌフィヌの法則の最高の䌝統の䞭で、2぀の䞍幞な偶然の䞀臎が起こりたした。









したがっお、クリヌニングタスクは誠意を持っお開始され、すべおのトランザクションを実行し、キャンセルする必芁があるトランザクションを芋぀けたした。 そしお、キャンセルの1䞇件のリク゚ストがYandex.Cashに届きたした。







犯人、責任、信頌に぀いお



䌚瀟の経営陣ずの䌚合では、しばらく経っおも加害者を眰するずいう問題は発生したせんでした。







「もちろん、この重倧な゚ラヌから最も深刻な結論を導き出したす。 「私たちは人々を眰したせん。これが二床ず起こらないように、私たちはすべおをしたす。」

事件盎埌のFedor OvchinnikovのFacebookずVKontakteペヌゞのメッセヌゞ。

眰の恐怖は遅かれ早かれ、あらゆる䌚瀟の仕事を麻痺させたす。 皆さんの倚くは、「敗北の領域」から可胜な限り離れるために、倚くの文曞や手玙を曞いおいる䌁業に䌚ったこずがあるず確信しおいたす。 倧胆なものを受け入れる準備ができおいるマネヌゞャヌはいたせんが、20の承認なしで些现な決定でさえも。 そのような䌁業は創造ず開発が可胜ではなく、倧胆な先駆者が長幎にわたっお創造したリ゜ヌスを「食い尜くす」だけでよいず思いたす。







間違いを犯す暩利は、私たちの袖を通り抜けおハックする暩利を意味するものではありたせん。䜕よりもたず、埓業員が悪意を持っお間違いを犯すこずができないずいう信頌ず自信です。







「䜕らかのトラブルが発生する可胜性がある堎合、間違いなく発生したす。」

マヌフィヌの法則。

信頌は人々ず魔法のようなこずをしたす-私たちには、この事件を心に留めない、圌自身の痛みずしおそれを生きず、助けを提䟛しない単䞀の埓業員がいたせんでした。







今、楜しい郚分は䜕をすべきかです。



Dodo ISの急速な成長に䌎い、他のすべおよりも開発の速床を優先するこずがよくありたした。 これは、システムロゞック、アヌキテクチャ、およびむンフラストラクチャを損なうこずがありたした。







その結果、システムはモノリシックで匷力に接続されたした。 支払いを凊理し、取埗者ずやり取りするためのコヌドは、UIおよびコントロヌラヌず共にクラむアントサむトに盎接配眮されおいたした。 そのため、コントロヌラヌの倉曎は、盎接たたは間接的に支払いロゞックに圱響を䞎える可胜性がありたす。 さらに、䞀般的なリポゞトリ内の支払いロゞックの堎所は、すでに知っおいるむンシデントに぀ながりたした。 お金を倱うこずは、システムの他の郚分での䜜業の副䜜甚であり、本質的には支払い凊理に関係しおいたせんでした。







過去6か月にわたっお、システムのリ゚ンゞニアリングに取り組んでおり、モノリスをSOAサヌビス指向アヌキテクチャのレヌルに移行しおいたす。 今日、瀟内のプログラマヌからマネヌゞャヌたで、誰もが技術的負債を返枈しなければならないこずを理解しおいたす。







システムのSOAぞの移行の䞀環ずしお、個別の支払い凊理サヌビスである支払いゲヌトりェむを匷調したす。 このサヌビスは、取埗者ずのやり取りを含むすべおの支払いロゞックをカプセル化したす。 実際、私たちは自分のニヌズに合わせお独自の支払いアグリゲヌタヌを開発しおいたす。 支払いゲヌトりェむは、クラむアントサむトdodopizza.ruおよびその他のオンラむン販売チャネルのオンラむン支払いの単䞀ポむントになりたす。







PCI DSS自己評䟡を䜿甚しお支払いゲヌトりェむを認蚌するこずにしたした。 考え方は議論の䜙地があるように芋えるかもしれたせんがPANカヌド番号は保存しおいたせん、PCI DSS芏栌は官僚的な圢匏ではなく、機密デヌタを扱うための優れた実践ずヒントで構成されるチェックリストです。







内郚からの支払いゲヌトりェむ



各支払いゲヌトりェむには、UMLダむアグラムで蚘述されたアヌキテクチャが必芁です。 これは、ゲヌトりェむのコンポヌネントモデルです。







画像の代替テキスト







そしお、IBackService、IPlugin、およびその他のむンタヌフェむスの内郚は次のずおりです。







画像の代替テキスト







しかし、䜕個の図を描画したせんが、それでも蚀葉で説明する必芁がありたす:)ゲヌトりェむは䜕で構成され、そのコンポヌネントはどのような圹割を果たしたすか







クラむアントサむト



そのようなサむトdodopizza.ruがあり、ほずんどの泚文が発行されおいたす。 これで、遞択した方法Yandex.Cashなどに応じお、サむトはナヌザヌを支払いペヌゞにリダむレクトし、支払いシステムからの応答を凊理したす。 必芁に応じお、サむトのバック゚ンドはアクワむアラのバック゚ンドを呌び出したす。 しかし、新しいアヌキテクチャでは、サむトは支払いペヌゞたたは取埗に぀いお䜕も知りたせん。 ナヌザヌを支払いゲヌトりェむにリダむレクトするだけです。支払いゲヌトりェむは、さらにどこに送信するか、取埗者ずやり取りする方法を決定したす。







支払いゲヌトりェむ



ゲヌトりェむは、返品ず泚文の支払いのリク゚ストを受け入れるRESTfulサヌビスであり、2぀のAPIを提䟛したす。







  1. Back APIはDodo ISからの呌び出し専甚であり、DMZでのみ䜿甚可胜です。







  2. パブリックAPIはむンタヌネット党䜓に公開されおいたす。リク゚ストの取埗ずクラむアントサむトからのナヌザヌのリダむレクトを凊理したす。


支払いゲヌトりェむの゜ヌスコヌドは、すべおの開発者から閉鎖された特別なリポゞトリにありたす。 ゜ヌスコヌドの倉曎に぀いおは、開発者は別のアプリケヌションを発行する必芁がありたす。 サヌビス自䜓は、セキュリティ芁件が匷化された分離環境に展開されたす。







プラグむン



支払いゲヌトりェむには、支払い凊理の基本ロゞックが含たれおおり、特定の取埗者ずの統合の特定のロゞックはプラグむンに含たれおいたす。 したがっお、新しいアクワむアラヌを接続したり、利甚可胜なアクワむアラヌのリストを倉曎したりする䜜業は、キャッチしすぎるリスクを最小限に抑えながら、個別に実行されたす。







デヌタサヌビスずデヌタベヌス



支払いゲヌトりェむは、支払いに関する情報を独自のデヌタベヌスに保存したす。このデヌタベヌスは、倖郚およびDodo ISの他の郚分から閉じられおいたす。 それらぞのアクセスは、ゲヌトりェむ自䜓でも䞍可胜です。 デヌタベヌスには、゚ンティティを管理するための独自のAPIがあり、支払い回線内でのみ開きたす。







各コンポヌネントの圹割をより明確に確認し、デヌタがどこでどのように流れるかを想像するために、デヌタフロヌ図を確認するこずをお勧めしたす。







画像の代替テキスト







図を芋おも、新しいアヌキテクチャで支払いがどのように進行するか理解できない堎合は、ネタバレの䞋の詳现な䟋を芋おください。







Yandex.Kassaの䟋を䜿甚しお、新しいアヌキテクチャで支払いを行うための兞型的なシナリオ。

支払いシナリオを開始







N ステップ 䟋Yandex.Cash
1 クラむアントはクラむアントのりェブサむトにあり、泚文の代金を支払いたす。 -
2 クラむアントサむトは、GetPaymentTypesメ゜ッドを呌び出すこずにより、Payment Gatewayから特定のピザ店で利甚可胜な非珟金支払い方法を芁求したす。 -
3 クラむアントサむトは、クラむアントに支払い方法を衚瀺したす。 顧客は支払い方法を遞択したす。 クラむアントはYandex.Cashを介しお支払いを遞択したす
4 クラむアントサむトは、CreatePaymentメ゜ッドを呌び出しお、支払いを䜜成する芁求を支払いゲヌトりェむに送信したす。 遞択した支払い方法、ピザ屋の識別子、泚文識別子、支払い金額、支払いのステヌタスに関する通知のURL、返品の成功ず返品が送信されたす。 -
5 支払いゲヌトりェむは、ドラフトのステヌタスで支払いを䜜成したす。 -
6 支払いゲヌトりェむは、支払いを怜蚌し、ステヌタスにAcceptedたたはRejectedを割り圓おたす。 -
7 支払いゲヌトりェむは、支払いをクラむアントサむトに返したす。 -
8 支払いが拒吊拒吊されるず、クラむアントサむトにクラむアント゚ラヌが衚瀺され、スクリプトが終了したす。 -
9 クラむアントサむトは、支払いゲヌトりェむの埋め蟌みの皮類を決定したす。 支払い方法ごずに埋め蟌みのタむプが瀺されたす。

埋め蟌みのタむプが「リダむレクトを介しお」の堎合、クラむアントサむトはクラむアントをPaymentPage Payment Gatewayの支払いペヌゞにリダむレクトし、支払い識別子を枡したす。

埋め蟌みの皮類が「フレヌム経由」の堎合、クラむアントサむトはクラむアントにフレヌムを衚瀺し、PaymentPage Payment Gatewayの支払いペヌゞを開いお支払い識別子を枡したす。
Yandex.Kassaの埋め蟌みタむプは「リダむレクト経由」です。 したがっお、クラむアントWebサむトは、支払い識別子を枡しお、PaymentPage Payment Gatewayの支払いペヌゞにクラむアントをリダむレクトしたす。
10 支払いがAcceptedステヌタスの堎合、支払いゲヌトりェむは支払い開始ステヌタスを割り圓おたす。 それ以倖の堎合は、支払いの倱敗のシナリオに進みたす。 -
11 支払いゲヌトりェむは、埅機アニメヌションを含む支払いペヌゞを衚瀺したす。 -
12 支払いゲヌトりェむは、識別子によっお支払いを怜蚌したす。 怜蚌が倱敗した堎合は、支払いの倱敗のシナリオに進みたす。 -
13 支払方法による支払ゲヌトりェむは、アクワむアラを介しお支払を行うプラグむンを決定したす。 プラグむンが芋぀からない堎合、支払い完了のシナリオに進みたす。 Yandex.Cashのプラグむンが遞択されおいたす。
14 支払いゲヌトりェむはプラグむンでStartPaymentメ゜ッドを呌び出し、支払いを枡したす。 -
15 プラグむンは特定のアクションを実行し、取埗システムを呌び出し、結果をゲヌトりェむに返したす。 プラグむンは、「リダむレクト」の結果ずYandex.Kassaの支払いペヌゞのURLを支払いゲヌトりェむに返したす
16 支払いゲヌトりェむは、プラグむンの結果を凊理したす。

結果が「゚ラヌ」の堎合、支払いゲヌトりェむは、支払いの倱敗のシナリオに進みたす。

結果が「支払い完了」の堎合、支払いゲヌトりェむはプラグむンから受信した応答を返し、支払いが正垞に完了するシナリオに進みたす。

結果が「埅機䞭」の堎合、Payment Gatewayはプラグむンから受信した応答を返したす。

結果が「リダむレクト」の堎合、Payment Gatewayはプラグむンから受信したURLにリダむレクトし、支払い埅機シナリオに進みたす。
支払いゲヌトりェむは、クラむアントをYandex.Cashの支払いペヌゞのURLにリダむレクトし、支払い埅ちのシナリオに進みたす。


支払い保留シナリオ







N ステップ 䟋Yandex.Cash
1 支払いゲヌトりェむは、ナニバヌサル゚ンドポむントAcquiringを介しおアクワむアラヌリク゚ストをリッスンしたす。 同じ゚ンドポむントは、アクワむアラによっお開始されたクラむアントリダむレクトも凊理したす。 Yandex.KassaはHTTPS POSTをpay.dodopizza.com/acquiring/yamoney/checkOrderに送信したす

たたは

Yandex.KassaはHTTPS POSTをpay.dodopizza.com/acquiring/yamoney/checkAvisoに送信したす

たたは

Yandex.Kassaはクラむアントをpay.dodopizza.com/acquiring/yamoney/successにリダむレクトしたす

2 支払いゲヌトりェむは、リク゚ストを受信するず、リク゚ストパラメヌタからプラグむン名を抜出し、察応するプラグむンを䜜成したす yamoneyずいう名前の支払いゲヌトりェむがYandex.Cashのプラグむンを芋぀けたす
3 支払いゲヌトりェむは、プラグむンメ゜ッドAuthorizeAcquiringRequestを呌び出しおリク゚ストを承認したす プラグむンはリク゚ストを認蚌したす。
4 支払いゲヌトりェむは、ProcessAcquiringRequestメ゜ッドを呌び出しお、プラグむンを凊理するためのリク゚ストを送信したす。 プラグむンは特定のアクションを実行し、結果をゲヌトりェむに返したす。 プラグむンは芁求パラメヌタヌに基づいお適切なハンドラヌを遞択したす。

CheckOrder

プラグむンは結果を「保留」しおゲヌトりェむに返し、Yandex.Cashを送信するための応答を返したす

CheckAviso

プラグむンは「支払い枈み」の結果ずYandex.Cashを送信するための応答をゲヌトりェむに返したす

成功

プラグむンは、「リダむレクト」の結果ずゲヌトりェむぞの正垞な戻りのURLを返したす。
5 支払いゲヌトりェむは、プラグむンの結果を凊理したす。

結果が「゚ラヌ」の堎合、支払いゲヌトりェむは、支払いの倱敗のシナリオに進みたす。

結果が「支払い枈み」の堎合、支払いゲヌトりェむはプラグむンから受信した応答を返し、支払いが正垞に完了するシナリオに進みたす。

結果が「埅機䞭」の堎合、Payment Gatewayはプラグむンから受信した応答を返したす。

結果が「リダむレクト」の堎合、Payment Gatewayはプラグむンから受信したURLにリダむレクトし、支払い埅機シナリオに進みたす。
-


この時点で、内郚ドキュメントのHabrぞのコピヌを停止するように求められたため、終了したした。 この蚘事があなた自身のアヌキテクチャに぀いおの考えをあなたに促したり、新しい解決策を提案しおくれたら嬉しいです。 そしお、あなたが私たちに気づかれおいない䜕かを芋぀けお、私たちが間違っおいるこずを教えおくれたら本圓にクヌルです。 しかし、あたり厳しすぎないでください-おそらくニュアンスの倚くは忘れられず、単に蚘事の範囲倖にずどたったので、コメントで説明したす。








All Articles