WCFを使用した分散トランザクション
-
22-07-2019 - |
質問
基本アーキテクチャ:それぞれが同じWCFサービスをホストするn個の物理ボックスが、ロードバランサーを開始しました。トランザクションをサポートしない 単一のデータベースインフラストラクチャにアクセスする各ボックス-尋ねないでください:(
したがって、アプリのデータアクセスレイヤーでは、分散トランザクションの何らかの方法が必要です。私のオプションは何ですか?
私のシステムのクライアントは、基本的なWebサービス(BasicHttpBinding)と光沢のある新しいWCFクライアント(NetTcpBindingまたはNetNamedPipeBinding)を使用して通信するレガシーアプリになります。
編集1
E.g。物理ボックス1のWCFレイヤーへの単一の呼び出しがあります。 EditEntity(...)。この呼び出しは、データベースへの2つの書き込みをトリガーします。最初の書き込みの後、別のクライアントが、2番目の物理ボックスのWCFサービスの2番目のインスタンスの同じエンティティに対してEditEntity(...)を呼び出します。 2番目のボックスでは、この特定のエンティティのトランザクションがすでに実行されていることをどのように知ることができますか?
ありがとう。
解決
先へ進むのに十分かどうかはわかりませんが、私が正しく読んでいるなら、WCFサービスを介してトランザクションをサポートできるかどうかを確認しようとしていますか? DBはトランザクションをサポートしておらず、WCFエンドポイントはロードバランサーの背後にありますか?これは正しいですか?もしそうなら...
DBにはトランザクションサポートがないため、WCF層に移行します。これは、WCFサービスへの単一の呼び出しがトランザクションを十分に包含することを保証できるように、メソッドの粒度の粗いレベルを示唆しています。トランザクションを複数のWCF呼び出しに分散させないでください。問題が発生します。
UPDATE:接続間の永続性を保証するロードバランサーで使用できる戦略がありますが、ここでは役立ちません。 EditEntity()を連続して呼び出しており、最初のエントリがトランザクションを開始することであり、2番目のエントリがトランザクションを完了することである場合、サービスは十分な粒度ではありません。
これら2つの呼び出しを1つのメソッド、つまりEditEntityComplete()に統合します。
2つではなく1つのメソッドを作成できない理由はありますか?
UPDATE#2:問題の言い換え-単一のメソッドが、トランザクションをサポートしないデータベース内でエントリを実行します。問題のメソッドは、順番に完了する必要がある一連のステップを実行します。 WCFメソッドは、適切な順序でステップ完了に違反する並行性競合の機会を表します。
そのため、関数からの戻りデータが必要ないと仮定して、WCFエンドポイントからの要求をログに記録できる非同期キューを検討してください。次に、単一のバックグラウンドプロセスからキューを処理します。
最終改訂:
データストアを変更しないという要件を再検討します。
複数のクライアントの要件、データストアでのスケール、ロードバランシング、およびトランザクションサポートの必要性を考えると、最後の提案として、データベースの変更をプッシュします。これを理解することは静的な要件ですが、多くの単純なデータベースプラットフォームが提供するトランザクションサポートを実装しようとすると、多大な労力を費やします。この機能を再作成しようとすると、利点はほとんどありませんが、多くの欠点があります。