2016-05-02 23 views
0

1つのSpringサービスは、1つのJavaデプロイメントユニット(JVM)で実装されています。別のSpringサービスは別のJVMに実装されています。 1st jvmから2nd jvmへのサービスコール。サービスインターフェイスは、http経由で休むか、またはsoapすることができます。単一のトランザクションを複数のjvmsに保持する必要があります。つまり、すべてのサービスが失敗した場合、ロールバックする必要があります。これを行う方法。任意のコード例。複数のJava jvmsでの単一トランザクション

答えて

0

RESTは、アトミックトランザクションへに関してSOAPベースのWebサービスとまったく同じ問題に直面しています。ステートフルな接続はなく、すべての操作はただちにコミットされます。一連の操作を実行することは、他のクライアントが中間状態を見ることができることを意味する。

、場合を除き、もちろん、あなたがデザインすることで、このの世話をします。まず、自分自身に質問してください:私は原子操作の標準セットを持っていますか?これは一般的なケースです。たとえば、銀行業務では、1つのアカウントから合計を削除し、同じ合計を別のアカウントに追加することは、多くの場合、必須のアトミック操作です。しかし、REST APIは基本ビルディング・ブロックだけをエクスポートするのではなく、プロセス全体をカプセル化する単一の「転送」操作を提供する必要があります。これにより、望ましい原子性が得られます。また、クライアントコードをもっと簡単にします。このappracohは低い粒状サービス、または高レベルのバッチ操作として知られています。

所望のアトミック動作シーケンスの単純な、事前定義されたセットが存在しない場合、問題はより深刻です。一般的な解決方法は、バッチコマンドパターンです。 1つのRESTメソッドを定義してトランザクションの開始点を定義し、別のRESTメソッドを定義してトランザクションの終了点を定義します( 'コミット'要求)。これらの一連の操作の間に送信されたものは、サーバーによってキューに入れられますが、コミット要求が送信されるまでコミットされません。

このパターンは大幅にサーバーを複雑に - それは、クライアントごとの状態を維持しなければなりません。通常、最初の操作( 'begin transaction')はトランザクションID(TID)を返し、その後のすべての操作(コミットを含む)はこのTIDをパラメータとして含める必要があります。

トランザクションのタイムアウトを強制することをお勧めします。最初の「トランザクション開始」リクエストからの経過時間が長すぎる場合、または最後のステップ以降、サーバーはトランザクションを中止する権利を持ちます。これにより、DoS攻撃の可能性が排除され、あまりにも多くのトランザクションを開いたままにすることで、サーバーがリソースを浪費します。クライアントの設計は、各操作がタイムアウト応答をチェックする必要があることに留意する必要があります。

「ロールバック」APIを提供することによって、クライアントがトランザクションを中断できるようにすることもお勧めします。

この複雑な設計シナリオでは、複数の同時トランザクションを使用するコードを設計する際に通常必要な注意が適用されます。可能であれば、トランザクションの使用を制限し、代わりに高水準のバッチ処理をサポートしてください。

私はちょうどディレクターよ、この情報のないクレジットを取らない、信用はThis article

に行くまたTransactions in REST?

をお読みくださいあなたはここにhttp://www.it-soa.eu/en/resp/atomicrest/userguide/index.html

関連する問題