:EasyTransactionは、分散トランザクションのためのフル機能を備えたフレームワーク、そのホーム・ページから、以下の機能を抜粋したものですhttps://github.com/QNJR-GROUP/EasyTransaction
- トランザクションフォームを複数備えたフレームは、トランザクションのすべてのタイプのフレームを取得します
- 様々な形態が混在総務ことができ
- 電力およびその他の機能は、ビジネスデータベースの追加消費のフレームワークを有効にする高性能は、データベースのビジネスのビジネスシステムのボトルネックのほとんどは、唯一の行の25のバイトを書き込みます
- オプションのフレームは、処理障害を達成し、コールするべき等の順序が来る大幅に事業開発の負荷を軽減するだけでなく、ビジネスデータベースの電力の増加や他の制御線を有効に
- ビジネス・コードは侵入せず、完全にすることができ
- ネストされたトランザクションをサポートしています
- 追加の展開コーディネーター、異なるAPPサービス連携は独自の業務を開始していないが、また、シングルポイント障害を避けるために、
- 分散トランザクションIDの実装では、各サービスの監視を容易にするために、APPID、サービスタイプ、分散トランザクションサービスIDに関連付けられてもよいです
本稿では、その主な成果の各パッケージのEasyTransactionコアの役割を共有しています。
考えることよりも、Seataアーキテクチャを読むhttps://www.cnblogs.com/skyesx/p/10674700.html断片化しすぎてここでのポイントは次の場合に直接確認するために、これを見るためにデバッグコードと組み合わせ、およびデモ
、コンテキストパック
メインクラス
LogProcessContext
コンテキスト情報を格納するためのETトランザクション。開いているトランザクションET(ET最初の長距離通話、またはアクティブなコールstartSoftTrans方式)で、このクラスのインスタンスを作成し、で、ローカルコンテキストSpringのトランザクションにバインド:
TransactionSynchronizationManager.bindResource()
バインディングを実行します。必要によって、ETのコンテキストを取得するとき
TransactionSynchronizationManager.getResource()
達成。
ETコンテキストが含まれる主な内容は以下のとおりです。
- 事務の最終状態
- グローバル・トランザクション・ログのすべて
- 外部グローバル・トランザクション・ログにフラッシュできません
- トランザクションIDの内容など
第二に、コアパッケージ
このパッケージには、主にクラスであります
EasyTransFacade
TransactionHook
ConsistentGuardian
ExecuteCacheManager
クラスEasyTransFacade
それは、ビジネスの呼び出し側のインタフェースを定義する2つだけ含まれています。
public void startEasyTrans(String busCode,long trxId);
public <P extends EasyTransRequest<R,E>,E extends EasyTransExecutor, R extends Serializable> Future<R> execute(P params);
最初は、グローバル・トランザクションを有効にするために使用され、主な操作は次のとおりです。
- 現在のトランザクションにローカルスプリングマウントTransactionHook、コードは、ETキーノードに埋め込むことができるように(例えば、ローカル・トランザクション等、ローカル・トランザクションがロールバックされ、前にコミット)
- 状態はいつでも、現在の春のローカル・トランザクションにET ETグローバル・トランザクションを得ることができるようにLogProcessContextは、現在の春現地情勢に結合します。
- 現在では、グローバル・トランザクションを特定するのに重要な役割を果たしているビジネスのライブラリを、実行する書き込みトランザクションを記録し、現地情勢投入時の状態クラッシュ回復
第二は、リモート・トランザクション・メソッドの実装を表します。
- 対応するクラスは、対応するプロセッサを得る呼び出してオブジェクトパラメータ(例えば、プロセッサTCC、信頼性のあるメッセージング・プロセッサ、等)、コール、コールを続けるために専用の後続のセクションの特定の形態を実行します
ベースの注釈インターフェースコールはこれらの2つの方法をカプセル化することによって作られています。
クラスTransactionHook
ローカル・トランザクション・スプリング、拡張サポートグローバルトランザクションの実行中にメソッドによって定義されたメインフレームETネイティブコードスプリングトランザクション、ET TransactionSynchronizationの接続点、。次の2つの方法の主な拡張
beforeCommit(boolean readOnly)
afterCompletion(int status)
beforeCommit方法でしょう
- 取引前の春には、ディスクトレイを落下しないすべてのローカルグローバルトランザクションログをコミット
- そして、実行するすべてのリモート呼び出しが実行されません(ETは、このグローバル・トランザクションとバッチ実行の蓄積を遅らせるしようとします)
- 失敗したグローバル・トランザクション、例外がスローされた場合、トランザクションロールバック(含むをローカルおよびグローバル)
afterCompletion方法でしょう
- ET事務の最終状態の決定に最終結果の現地業務(/ロールバック/不明コミット)とETの親トランザクション(コミット/ロールバック/不明)の状態を取得します(コミット/ロールバック/不明)
- 事務ETのこの状態の最終段階後、最終的な合意処理の非同期実行(consistentGuardian.processを呼び出します)
类ConsistentGuardian
このクラスには、キャンセル/ TCC Conifrimに信頼性のあるメッセージをメッセージを送信するように、最終的なET同じグローバルトランザクションを処理するために使用されます。
最後のマッチング処理は、通常、同期動作にスローされます(TCCはTRY-のような)ローカルトランザクションの実行に対応する非同期実行スレッドプールを完了したが、失敗した場合、補償(回復パッケージ)のすべての詳細が明らかになり、その後の詳細な説明されます
グローバル・トランザクション・ログに基づいて、クラスの主なメカニズムは、それによって、(例えば、ログTCC TCCトランザクションログに対応するプロセッサから取得した)ログ取得処理に対応する、前に書き込まれています
- (まだ決まっていない場合の現状場合ET)現在のトランザクションETの最終状態を解析
- トランザクション・ログ・ハンドラETへの最終的な状態を渡すプロセスの典型的な例は、トランザクションログに対応する順次の処理に処理されます。
- 対応するログは、メソッドTRYが存在する場合
- ログをCANCEL / TRYと対応CONFRIMを見つけることができません
- 最終的なETトランザクションの状態に応じて、対応するCONFIRMを呼び出す/方法をCANCEL
クラスExecuteCacheManager
このクラスは、主に以下の期待ETを提供しています
- ET書き込みバッチトランザクションログ(IOを減らすために)
- リモートサービス呼び出しの一括同時実行(対応するリモートシリアル待ち時間を減らすために)
その主な成果は、ということです
- 各着信Callebleオブジェクトは、オブジェクトFutrureの書き換えを介して戻されるため
- 任意のgetメソッドの前にFutrueが呼び出されていない場合はCallableオブジェクトが実行されることはありません前に、すべてが合格しました。
- GETの将来のいずれかが呼び出されると、すべてがここにログに書き込まれた呼び出し可能なバッチ実行になります同時コールのバッチおよびバッチリモート実行を含めます
第三に、パッケージデータソース
主にそれはメインサービスデータソースに作用する、以下の二つのインターフェースを含みます。
DataSourceSelector
TransStatusLogger
クラスDataSourceSelector
このクラスは、アプリケーション・サービス・データ・ソースの複数の対応するデータソースセレクタ自体を達成するために必要とされる場合、この方法は主に以下を含む、データ・ソースとトランザクション・マネージャに対応する現在のトランザクション/要求を取得するために使用されています
DataSource selectDataSource(String appId,String busCode,long trxId);
DataSource selectDataSource(String appId,String busCode,EasyTransRequest<?, ?> request);
第1の方法は、対応する開口部を選択することである場合ETトランザクションデータソース
対応するデータ・ソースは、発呼者の要求を受信したときに、第2の方法が選択される(冪等のために、抗サスペンションプロセス、必要性を無視するならば)
このインタフェースは、単一のデータ・ソースを直接で実現することができるデフォルトの実装が含まれてい
SingleDataSourceSelector
クラスTransStatusLogger
このクラスは、主に書き込みトランザクションのステータスが、記録はETトランザクションは、対応する業務トランザクション(春ローカルトランザクション)で、現在のデータベースのテーブルを作成するときにオンとコミットに提出されるETのために決定され、ロールバックを記録するために使用されますロールバック。
詳細は、直接の実装を参照してください。
第四に、パッケージの実行者
パッケージが異なるキュータトランザクション開始(サービスへのリモート呼び出し側)位置関連処理クラス、トランザクションの異なるタイプ(TCC、信頼性の高いトランザクション、等)を持っている記憶され、TCCの例では、トランザクションの実装の他のタイプを説明するためには類似しています。
TccMethodExecutor
このクラスは、3つのインタフェースを実装します
- EasyTransExecutor
- LogProcessorの
- DemiLogEventHandler
EasyTransExecutorインターフェースはメソッドを定義します
<P extends EasyTransRequest<R,E>,E extends EasyTransExecutor,R extends Serializable> Future<R> execute(Integer sameBusinessCallSeq, P params);
それは、具体的には、実行TCCのTRY方法に対応EasyTransFacade.executeクラスに使用される方法
- この方法は、対応するTRY RPCリクエストクラスRunnableをパッケージ化コール
- このコール(主にこの呼び出しの特定のパラメータを含む、対応するリモート・メソッド)に対応するグローバル・トランザクション・ログの構築
- 次いで、上記のセクションに記載さExecuteCacheManagerクラスメソッドを渡します
LogProcessorのインターフェースは、mainメソッドが含まれているトランザクションログを処理する方法を定義します
boolean logProcess(LogProcessContext ctx, Content currentContent)
この方法は、着信ログ・タイプがPreTccCallContent(TCCが要求に対応するログTRY)である場合、それが通知するメッセージを送信し、現在のETトランザクション・ログを処理した後の情報(カテゴリConsistentGuardian意志をペアリングの最終ログを監視し決定しますすべて一致した結果が)、あればログをペアリングする必要があります
- 正常耳ペア(または対応するログCONFIRM見つけるCANCEL)メッセージを、それ以降の処理がありません
- ペアリング障害監視(CONFIRMの不在に対応する/ログCANCEL)メッセージ、対応する動作確認を実行するか、現在の状態と、対応するログレコードに基づいて、ETトランザクションをキャンセル
トランザクションの他の形が似ているの実装、それらを繰り返しません
第五に、回復パッケージ
トランザクションを回復するために、すべての詳細を明らかにするためには、最終的な合意を達成します。
コードが複雑ではない、あなたが自分で見ることができます。
シックス・パックフィルター
このパッケージは、主として着信側のフィルタに作用ET対応するフィルタに使用されます。我々は、などの処理能力、のフィルタ拡張実装ET機能ポート、によって呼び出されるネストされたトランザクション、ように呼び出しコンテキストの処理の増加、および処理することができます。
七、パック冪等
そのような懸濁液冪等側対応するパケット処理を実現
そして、他の主要国と反懸濁法の原則:
- 経由のリモート呼び出しは、現在のコールサービス開口ログへのログを書き込むと、対応する呼IDを記録する場合、MD5に対応するパラメータを呼び出します
- 更新結果がログに保存されたときに結果が返されます
- 彼らが復帰する前に、一貫している場合は、MD5一貫性のパラメータは、結果が保存する場合はチェックされているかどうかをチェックし記録を超える再送要求は、IDに対応する存在するとき
- アンチサスペンション同様に、ログでは、として、呼び出されているものの方法が記録されます
- 要求に対応するログを見つけることができませんが、現在の操作をキャンセルする場合は、直接成功したフレームを返します。
- 正常に実行されてキャンセル、上述した後、時間が実行されたキャンセル見つけ、再び方法を、試すようになった、エラーが試すに直接返されます
八、パッケージidgen
独自のIDを処方された場合、パッケージの方法に対応する、ETに分散トランザクションIDを生成するために呼び出されません。IDを指定しない場合は、自動的に生成されます。
九、パッケージログ
ETは、クラスに対応するトランザクションログを定義し、その読み書きインタフェース。
トランザクションログはそれらを繰り返さないで、前TccExecutorの章で言及されています。
私たちは、直接、次のインターフェイスを実装するために、達成するために、トランザクション・ログ・ストレージを拡張する必要があります
TransactionLogReader
TransactionLogWritter
(ETトランザクションログは、同じトランザクションでビジネス取引を読み書きとする必要があり、また同じトランザクションではありません)
テン、パッケージマスター
APPIDに同じパッケージで補償一貫した最終フォールバックマスタとして選択します。
実際には、任意のインスタンスが下のAppIDは、同時に複数のマスタを持つことができ、あまり正確ではない選択が存在する(ただし、意味がありません、パフォーマンスのも無駄)
XIのパケットモニタ
、のために、ダッシュボードパッケージを提供する拡張の使用を監視するためのETのインスタンスの状態
XIIのパケットプロトコル
顧客が直接直接一部の顧客の親クラス、構成インターフェース、コンフィギュレーション・ノートなどが含まれる分散トランザクションサービスパッケージを、定義するために
XIIIパッケージprovider.factory
対応するスプリング豆から取得して記憶迅速かつ容易に対応する定義によってETは対応するBeanを取得するように実装
第四に、パッケージキュー
メッセージキューの実装に対応する拡張子を追加するには、パッケージには、対応するインタフェースを実現しています
XVのRPCパッケージ
同上
シックスティーン、パッケージのシリアライズ
使用するETフレーム直列化された形式、自己拡張
XVIIパッケージstingcodec
圧縮文字列は、置換文字列は、ストレージ効率を改善するために、デジタルIDであります