分散トランザクションのトピック(D):TCCの分散トランザクションソリューションズ

内容:

のTCC 4.分散トランザクションソリューション 

4.1。TCCが大事です

TCCは、Confifirmは、キャンセルしてみ三つの言葉の略で、TCCは、3つの分岐オペレーションを実現するために、各トランザクションが必要です。事前に試しは、Confifirmが確認され、失効キャンセル。ビジネスおよびリソース予約を行うための動作を確認してみてください、Confifirmは、ビジネスの確認に操作を行うキャンセルとロールバック操作で逆の動作を実現するようにしてください。TMは、任意のトランザクションのブランチがすべての操作は、TMは、すべての枝取引にConfifirm運転を開始し、成功しているしようとTMは、すべての枝のトランザクションが操作キャンセル開始し、操作が失敗してみてください最初にすべてのブランチ取引の立ち上げ操作を試してみましたConfifirmは/失敗時に行った操作をキャンセルし、TMは再試行されます。 

image.png

支店の取引状況を失敗しました: 

image.png

TCCは、3つの段階に分かれています。

  1. チェック(一貫性)およびリソース予約(アイソレーション)で、これは操作の唯一の予備的な段階であり、そしてそれに続くConfifirmのまとめが本当に完全なビジネス・ロジックを構成することができる。ビジネスの舞台をやってみてください
  2. 正常に実行されたすべてのブランチ取引を試した後Confifirmステージは、確認申請に開始Confifirm段階で行われます。通常の状況下では、TCCの使用はConfifirmステージが間違っていないと考えられています。それは次のとおりです。長いほど成功した試してみてください、Confifirmいくつかの成功。Confifirmステージは本当に間違っている場合は、再試行メカニズムが導入されるか、または手動処理されなければなりません。
  3. 段階を取り消し操作の実行エラーが予約されたリソースを解放し、キャンセルされたサービスの状態をロールバックする必要があるの下分岐トランザクションの実装です。通常の状況下では、ステージにキャンセルとみなされるTCCの使用はまた、いくつかの成功を収めています。ステージは本当に間違ってキャンセルした場合、再試行メカニズムが導入されるか、または手動処理されなければなりません。

TMトランザクションマネージャは、TMのトランザクションマネージャは、スタンドアロンサービスとして実装するだけでなく、TMとしてグローバルトランザクションの開始剤の役割を可能にすることができる、TMは、独立した公共になることである組立システムアーキテクチャとソフトウェアの再利用を検討することです。

トランザクションコンテキストを記録するためのグローバル・トランザクションID分散トランザクションコールチェーン全体で記録開始グローバル取引の際に発生TM、および記録トラックの状態、および再試行するConfifirm障害必要性をキャンセルする、冪等を達成するために必要です、関係なく同じに何回リクエストを参照しないべき等の操作は、結果は同じです。 

4.2.TCCソリューション 

次のような数多くのこれらのタイプの市場で現在入手可能なTCCフレームワーク:(次のデータ収集日は2019年7月11日です) 

フレーム名 Gitbubアドレス 星の数
TCC-トランザクション github.com/changmingxi... 3850
Hmily github.com/yu199195/hm... 2407
ByteTCC github.com/liuyangming... 1947
EasyTransaction github.com/QNJR-GROUP/... 1690

話SeataにもTCCをサポートしていますが、Seata TCCのモード春クラウドは、サポートを提供していません。私たちの目標は、原理を理解することで、操作のTCCのトランザクション調整を処理し、そのためより軽量フレームを作るために傾斜して理解しやすいので、最終的にはHmilyを決定します。

Hmily高性能分散トランザクションTCCオープンソースのフレームワークです。(JDK1.8)を開発するJava言語に基づいて、ダボ、春クラウドと分散トランザクションの他のRPCフレームワークをサポートしています。これは、現在、次の機能をサポートしています。 

  • ネストされたトランザクション(ネストされたトランザクションのサポート)をサポートしています。
  • 非同期読み込みと書き込みトランザクションログの、およびパフォーマンスのRPCフレームワークの使用差はないためかく乱フレームワーク。
  • サポートSpringBoot-スタータープロジェクトが使用する、シンプルを開始します。
  • RPCフレームワークのサポート:ダボ、motan、springcloud。
  • ローカルトランザクションストレージサポート:Redisの、MongoDBの、飼育係、fifile、mysqlの。
  • トランザクションログのシリアル化をサポートします。java、ヘシアン、kryo、protostuffff。
  • アスペクトAOPカットのアイデアを使用してシームレスに春、自然なサポートクラスタと統合されています。
  • RPCのトランザクションの回復、回復タイムアウト例外。 

他の透明しようとする参加者にマルチトランザクションコールを傍受することにより、分散トランザクション処理を参加ローカルおよびリモートメソッドメソッドインターセプトを用いHmily AOPは、Confifirmは、方法キャンセル;転送トランザクションコンテキストとトランザクション・ログ・レコードを、適宜、補償、再試行などが挙げられます。

Hmilyストレージをログに記録するトランザクション・コーディネーション・サービスを必要とするが、データを提供する必要性(mysqlの/のMongoDB /飼育係/ Redisの/ fifile)ではありません。

Hmily 1つのインターフェイスだけのニーズが、それのトライ事業であること、露光されるよう、TCCサービスや一般的なサービスを実現します。Confifirm Confifirmは/キャンセルので、/、グローバル・トランザクションを提出する必要が/ロールバックが提供されたという理由だけで、ビジネス・ロジックを取り消し、ビジネスだけHmily TCCにする必要があるが、取引の枠組みの中で見つけることができ、そのほかのビジネスサービスは、知覚と呼ばれる必要はありません。 

TCCを例外処理3種類の空のロールバック冪等であることに注意してください、サスペンション: 

空のロールバック:

TCCのリソースがない場合には二段階方式これは、直接成功返された空のロールバック、であることを認識する方法のニーズをキャンセル、キャンセルと呼ばれるメソッドを呼び出す試してみてください。

その理由は、サービスのダウンタイムやネットワークの異常で支店は、支店総務は実際には、これは試し相、障害復旧を実現していないときに、分散トランザクションのロールバックが2段キャンセル呼ぶ、失敗として記録呼び出したときにということですそれによって、空のロールバックを形成する方法。

アイデアを解決する鍵は、空のロールバックを識別します。アイデアは単純に行わあれば、ロールバックし、正常である、段階かどうかを知る必要がありました。いない実行すれば、それは空のロールバックです。すでに述べたように、TMは、分散トランザクションコールチェーン全体でグローバル・トランザクションの開始時に記録されたグローバル・トランザクション、グローバルトランザクションIDを生成したと述べました。レコードを挿入します初段てみ法では、グローバル・トランザクションIDとブランチトランザクションIDを含む、余分なテーブルに分岐トランザクション・レコードを追加し、それが実行段階を表しています。レコードが存在する場合、レコードを読んでインターフェースを取り消す、通常のロールバック、レコードが存在しない場合は、バック空圧延されます。 

冪等:

以上の説明により、二相を確保するために、プロトコルTCCの再試行メカニズムをコミットする、ことを学習されていないのデータの矛盾がしようとTCC、Confifirmの二つの段階を必要とし、キャンセル原因インターフェイス性を保証冪等、ように再利用したり、リリースのリソースにありません。あなたは、このような電力としてコントロールしていない場合は、そのような一貫性のないデータなどの深刻な問題を引き起こす可能性があります。

クエリを実行する前に、すべての州での「分岐トランザクション・レコード」の実行状態を向上させるソリューション。 

サスペンション:

懸濁液は、分散トランザクションのためであり、そして第二段階では、インターフェイスを行うが、最初のものよりインターフェイスを試しキャンセル。

あなたがトランザクションブランチを登録して、RPCコールを実行するために、RPCトライでトランザクションブランチを呼び出すときの理由は、ネットワークの混雑のこの時点でのRPCコールが発生した場合、RPC呼び出しのタイムアウトがタイムアウトRPCの後に通常存在し、ある、TMはRMの背中を通知します彼らは実際に実行参加者、および経営資源を試してみてください予約するための方法に到達する前にロール分散トランザクションは、完了後にRPCリクエストをバック圧延することができるだけ分散トランザクションを使用するためには、分散トランザクションの最初のフェーズでは、ビジネスのために予約しました資源その後、誰もが対処することはできませんが、このケースでは、我々は、リソース予約業務が処理を継続することはできません後、あるサスペンションと呼ばれます。

アイデアが完了した第二段階の実装を対処することであるならば、その段階ではもはや続けることはできません。トランザクションを実行するときに何もしてみは行われませんがある場合は、表に二段トランザクション・レコードがあった場合は、「分岐トランザクション・レコード」、グローバル・トランザクションのこの段階で決定されます。 

例えば、シーンAがBに30元転送され、AおよびBは、異なるサービスアカウントです。

シナリオ1: 

アカウントA

try:
      检查余额是否够30元 
      扣减30元 
confirm: 
cancel:
    增加30元

 

アカウントB

try:   
   增加30元 
confirm:    
cancel:   
   减少30元

 

シナリオ1点の説明:

1)アカウント我々はAの口座の残高を控除お金資源の最初のチェックがTCCにインターフェースを試してみて、そのため、ここでのバランスは前述の原理によれば、いわゆる経営資源である、あなたは最初の段階で経営資源と埋蔵量を確認する必要があります十分かどうか、十分には30元を控除した場合。経営資源は、インタフェース試してみるには、あなたが何もできないConfifirmの第二段階のインターフェースを控除しておりますので、Confifirmインタフェースは、正式な提出を表します。実行インターフェイスをキャンセルすると、トランザクション全体がロールバックされる表し、あなたは、インターフェイスが口座に30元バックを控除試してみてくださいROLLBACKアカウントAを取る必要があります。

2)アカウントB、第1の位相試しインタフェースで実現するために口座にお金を追加するBは、実行インターフェイスをキャンセルトランザクション全体がロールバックされる表し、アカウントBを取る必要があるリガ$マイナス30インターフェース試してみてくださいROLLBACK。 

解析のプログラムの1: 

  1. あなたは、アカウントAを実行しようとすると30元以上の賃金をキャンセルすることになっていません。
  2. 試みは、キャンセル、confifirmはそれはように電源とを達成する必要があります、別のスレッドを呼び出すことで、繰り返し呼び出されます。
  3. 実行が他のスレッドを消費しようとすることができます完了した後にBのアカウントは、30元トライ増加しました。
  4. トライアカウントBが複数で実行されていない場合は保存30元を取り消します。 

問題解決: 

  1. キャンセルの方法は、実行ファイルが正常に行わ後方にしてみてくださいキャンセル、メソッドを実行するかどうかを決定するアカウントの試みが必要です。
  2. 試す、キャンセル、confifirm実装方法の冪等。
  3. Bアカウントは更新がconfifirmの量に占める、口座の金額を更新しようとする方法では許可されません。
  4. アカウントBは、メソッドがトライ方法は、通常の実行が後方試みをキャンセル行われているか否かを判断する必要がキャンセル。

最適化: 

アカウントA

try:   
   try幂等校验    
   try悬挂处理    
   检查余额是否够30元    
   扣减30元 
confirm:    
cancel:   
   cancel幂等校验    
   cancel空回滚处理    
   增加可用余额30元

 

アカウントB

try:   
confirm:    
   confirm幂等校验    
   正式增加30元 
cancel:   

 

遂に

コンテンツ章で更新される背景には、私は読書に集中し続けることができ、私は良いポイントにどのような賞賛のサポートを感じることができます!

公開された83元の記事 ウォン称賛31 ビュー10000 +

おすすめ

転載: blog.csdn.net/lonely_bin/article/details/103824635