銀行間送金業務は、典型的な分散型トランザクションのシナリオです。 A が銀行間で B に送金する必要がある場合、2 つの銀行のデータが関係します。転送の ACID は、データベースのローカル トランザクションでは保証できず、分散トランザクションを通じてのみ解決できます。 分散トランザクション分散環境では、分散トランザクションは BASE 理論に従って、可用性、パフォーマンス、および劣化したサービスのニーズを満たし、一貫性と分離の要件を軽減します。
一方、分散トランザクションも ACID 仕様に部分的に準拠しています。
サガSaga は、データベース論文 SAGAS に記載されている分散トランザクション ソリューションです。基本的な考え方は、長いトランザクションを複数のローカルの短いトランザクションに分割し、それらを Saga トランザクション コーディネータが調整することです。各ローカルトランザクションが正常に完了した場合、正常に完了します。ステップが失敗した場合、補正操作が逆の順序で 1 回呼び出されます。 現在、SAGA に使用できるオープンソース フレームワークは主に Java 言語であり、その中でも seata が代表的です。この例では Go 言語を使用し、使用される分散トランザクション フレームワークは https://github.com/yedf/dtm です。これは分散トランザクションを非常にエレガントにサポートします。 SAGA の構成を詳しく説明しましょう。 DTM トランザクション フレームワークには、従来の XA 分散トランザクションと同じように、次の 3 つのロールがあります。
正常に完了した SAGA シーケンス図を見てみましょう。SAGA 分散トランザクションを簡単に理解できます。 SAGAの実践銀行振込の例では、フォワード操作で振込と振出を行い、補正操作で反対の調整を行います。 まず、口座残高テーブルを作成します。
まずはユーザーの口座残高を調整するためのコアビジネスコードを書いてみましょう
次に、具体的な順方向演算・補正演算処理関数を書いてみます。
この時点で、各サブトランザクションの処理関数は正常であり、次にSAGAトランザクションが開かれ、分岐呼び出しが行われます。
この時点で、完全な SAGA 分散トランザクションが記述されました。 完全な成功例を実行したい場合は、この例yedf/dtmcli-py-sampleを参照してください。実行は非常に簡単です。
ネットワーク異常の処理dtm に送信されたトランザクションで転送操作を呼び出すときに短時間の障害が発生した場合はどうなりますか? SAGA トランザクション プロトコルに従って、dtm は未完了の操作を再試行します。こういう時、私たちは何をすべきでしょうか?障害は、転送操作の完了後にネットワーク障害が発生したか、転送操作中にマシンがクラッシュした可能性があります。口座残高の調整が正しいことをどのように確認すればよいでしょうか? このようなネットワーク異常を適切に処理することは、分散トランザクションにおける大きな問題です。異常には、重複リクエスト、空補償、停止の 3 種類があり、すべて適切に処理する必要があります。 DTM は、上記の異常な状況におけるビジネス ロジックが正しい順序で 1 回だけ正常に送信されるようにするためのサブトランザクション バリア機能を提供します。 (サブトランザクションバリアの詳細については、分散トランザクションの最も古典的な 7 つのソリューションのサブトランザクションバリアのセクションを参照してください) 処理機能を次のように調整します。
ここでのbarrier_from_req(request).call(cursor, busi_callback)呼び出しは、サブトランザクションバリア技術を使用して、busi_callbackコールバック関数が1回だけ送信されるようにします。 TransIn サービスを複数回呼び出すことができますが、残高は 1 回だけ調整されます。 ロールバックの処理銀行がユーザー 2 の口座に異常があることを発見し、ユーザー 2 に金額を振り込もうとしたときに失敗を返した場合、どうなるでしょうか。転送操作が失敗を返すように処理機能を調整します
トランザクション失敗の相互作用のタイミング図を示します。 ここに一つあります。 TransIn の転送操作は何も実行されず、失敗を返しました。このとき、TransIn の補正操作を呼び出すと、逆調整がうまくいかなくなるのでしょうか? 心配しないでください。以前のサブトランザクション バリア テクノロジにより、送信前に TransIn エラーが発生した場合でも、補償は何も行われないことが保証されます。送信後に TransIn エラーが発生した場合、補正操作によってデータが 1 回送信されます。 エラーを返す TransIn を次のように変更できます。
最終結果のバランスは依然として正しいものになります。この原則は、分散トランザクションの最も古典的な7つのソリューションのサブトランザクションバリアリンクに記載されています。 まとめこの記事では、SAGA の理論的知識を紹介し、通常の正常完了、異常な状況、および正常なロールバックを含む SAGA トランザクションの作成プロセスの完全な例を示しました。この記事を通じて読者の皆様にはSAGAへの深い理解を頂けたのではないかと思います。 この記事で使用されている dtm は、強力な機能を備えた新しいオープンソースの Golang 分散トランザクション管理フレームワークです。 TCC、SAGA、XAなどのトランザクションモード、トランザクションメッセージをサポートし、Go、Python、PHP、Node、CSharpなどの言語をサポートします。同時に、非常にシンプルで使いやすいインターフェースも提供します。 この記事を読んだ後は、ぜひプロジェクト https://github.com/yedf/dtm にアクセスし、スターを付けてサポートしてください。 |
<<: Kubernetesがサービスディスカバリを実装する方法について話す
>>: CentOS は、kafka にログを収集するために filebeat をインストールします
ウェブサイトの最適化において、ウェブマスターは皆、Baidu 関連ドメインが実際には Baidu バ...
スマートオーブンなどの接続デバイスから産業研究用のデータ収集機器まで、モノのインターネットは急速に成...
今年の検索エンジン市場は、6月下旬から7月上旬にかけての百度のKステーション事件に始まり、その後も断...
もし百度の将来のアルゴリズムが外部リンクのIPソースの数を計算できるほど正確であれば、これは可能です...
今年、百度のアルゴリズムが継続的に改善・調整されたため、自分のウェブサイトや友人のウェブサイトのコン...
ソフト記事はもともと非常に優れたマーケティングおよびプロモーション手法でしたが、残念ながら、ソフト記...
分析は iOS クライアント バージョンに基づいています。斗魚V2.450パンダV2.2.6.158...
cmivps の香港 VPS のデフォルト設定は中国本土最適化ですが、私が使用した多くのネットワーク...
登録不要のホスト、登録不要のクラウドホスト:登録不要のホスト(登録不要のクラウドホスト)は、香港、台...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています対外貿易ウ...
世界最大のソーシャルプログラミングおよびコードホスティングウェブサイトであるGitHubは、最近、有...
最近開催された2021 Alibaba Cloud Financial Data Intellige...
先日終了した2022年カタールワールドカップの期間中、世界中の多くの主流ライブストリーミングプラット...
著者: ninetyhe、Tencent CDG バックエンド開発エンジニア古いものを見直して新しい...
公開アカウントでツイートする方法は誰もが知っていると思いますが、とても簡単です。公式アカウントの運用...