0

PHP 5 で「トランザクション コーディネーター」の実装を作成するためのアイデアや資料への参照を誰かが提供してくれることを願っています。このドライバーは、マルチベンダーの単一ビジネス プロセス統合に基づいています。潜在的な障害点があるため、大量の if、スイッチ、try..catch を使用したスパゲッティ コードを避け、メソッド呼び出しをインターセプトし、後続の呼び出しへの応答を追跡し、メソッド属性に問い合わせて、どの補正関数を決定するかを決定できるコーディネーターを用意したいと考えています。トランザクションを取り消すために使用します。その意図は、「ACID」のような処理を作成することです。最後に参照できるのは、.Net の TransactionScope オブジェクトです。

サンプル シナリオ:

ServiceA
ServiceB
ServiceC

ServiceA->DoSomething() - passes
ServiceB->DoSomething() - passes
ServiceC->DoSomething() - fails

この時点で、A と B は何らかの補償戦略を採用して、データベース、サード パーティの統合、または元の状態に戻す機能を呼び出す必要があります。

私が最初に考えたのは、何らかのタイプの AOP を使用して、コンペンセータへの参照と、反転アクティビティを完了するための状態要件を保持することです。コーディネーターは、コンペンセーターの呼び出しを可能にするために、実行を追跡するだけでなく、実行の状態を返す必要があります。

4

1 に答える 1

1

あなたはそれをすることができないので、ACIDを試さないでください。偽造しようとすると、ある時点でリークが発生するため、そもそも試さない方がよいでしょう。あなたが自分で書いたように、サービスAを使用して1つのステップを実行し、後でサービスCが失敗したことを確認すると、実行した1つのステップを元に戻すようにサービスAに指示する必要があります。単一のステップを元に戻す方法がない場合、回避策は、サービスAで最初からやり直し、トランザクション内の最後のステップなしでリセットと以前に実行したすべてのステップを実行することです。これはACIDにはまったく聞こえません。ふりをすると、ある時点で失敗します。

プロセスをモデル化するときは、有限状態マシンを使用します。これは、サービスが実行できることと実行できないこととは無関係ですが、実行する必要のあるステップ、おそらくどの順序で、ステップが失敗した場合に何を実行するかを追跡する機能があり、どの時点でも比較的簡単に拡張できます。

if、switch、try / catchの混乱に終わる可能性があるというあなたのコメントに関して:それは完全にあなた次第ですが、プロセスの実装とは何の関係もありません。

ステートマシンの実装を探しているのであれば、PHPの実装はそれほど多くありません。PEARには非常にPHP4スタイルの古いものが1つあり、それでも機能して機能する可能性があります(http://pear.php.net/package/FSMを参照)が、より適切な実装はhttps://githubです。 com / Metabor / Statemachine-この男は「ステートマシン」をいたるところに書いています。たとえば、コールバックを介して作業を行うコードをトランジションに渡し、イベントを介してトランジションを変更するなど、非常に優れた機能がいくつかあります。これには、ステートマシンが実行できることと実行できないことを完全に制御できるという利点があり、実行できる場合は、コールバックを介して実行されます。

優れた機能は、定義された状態と遷移を画像として取得できることです。

于 2012-10-11T18:53:21.793 に答える