web-dev-qa-db-ja.com

べき等のWebサービス呼び出しを実装する方法

「不定期に接続された」モバイルデバイスが使用するWebサービスレイヤー用のWCFベースのソリューションを開発しています。追加の複雑さのため、サービスは(この段階では)キューイングを使用しないため、代わりに単純な要求/応答アプローチを運用します。

もちろん、モバイルデバイスであるため、挿入/更新中にデバイスが信号を失う可能性があります。 Webサービス自体がトランザクションを完了した可能性がありますが、クライアントがこのメッセージを受信することはありません。このため、サーバーは要求を再送信します。その時点でサーバーはこれを重複要求として認識し、最初のインスタンスで試行したのと同じ応答を返す必要があります。

したがって、私はサービスをべき等にすることを試みています。これを実現するために、RequestIDと、呼び出しを完了するために必要なパラメーターで構成されるRequest Paramter DTOオブジェクトを実装しています。

ただし、リクエストIDを監視する方法を実装するのが私の問題です。サービスは現在ステートレスであるため、現在想定できる唯一の方法は、データベースにServiceRequestテーブルを作成することです。これにより、RequestIDがプライマリとして使用されます。これを照会すると、クライアントが同じRequestIDを送信するため、要求がすでに処理されているかどうかがわかります。ただし、サービスはどのメッセージを返信するかを知る必要もあります。挿入/更新の場合、影響を受ける集約ルートIDも、リクエストテーブルに直接、またはRequestToObjectLookupテーブルに格納する必要があります。

つまり、これを実装するためのベストプラクティスの方法があるかどうかと思いますか?私の考えは、リクエストID、追加情報などを格納するServiceRequestテーブル(サービスに固有)を用意することです。結果オブジェクトIDへのルックアップ(保存/挿入/更新時)。そのため、新しいリクエストが来たときに、保存を実行するか、または以前に更新されたオブジェクト(最初のリクエストの試行で実行されたもの)を返すだけであるかに関係なく、リクエストの残りに進む前にこのテーブルを最初に参照できます。

(前述のように)残りの情報を取得するために関係を使用できるようにする必要があるため、リクエストで参照されるルート集約IDのみを保持する必要があると考えています。

8
Milambardo

IDに基づく削除のみを許可することで、削除をべき等にすることができます。 IDを「使用中」のままにし、有効期限が切れるようにする方法が必要です。

このような予約システムで;オブジェクトの作成は、最初にIDを予約してから、そのIDでオブジェクトを作成する2番目の呼び出し(基本的には新しい空のオブジェクトの更新)によって実行できます。 IDが要求されると、サーバーは空きIDを取得して、そのIDで初期化されていないオブジェクトを作成します。初期化の2回目の呼び出しには、以前に返されたID(および必要なすべてのデータ)が含まれます。つまり、2番目の呼び出しは、本質的にそれ自体が同義の更新呼び出しです(同じデータで複数回呼び出すと、同じ結果になります)。

予約が複数回発生すると、複数のIDが返され、初期化されたオブジェクトが残ります。これらの初期化されていないオブジェクトは、しばらくすると自動的にrhoombaによってクリーンアップできます。

これにより、クライアントに負担がかかり、IDを取得した場合に、initializeを呼び出す責任があることが保証されます。クライアントがトランザクションの途中で落ちた場合、クライアントは操作の独自のログを保持する必要があるため、たとえば、IDを取得し、オブジェクトの初期化でビジーであったことがわかります。

更新をべき等にするのはより困難ですが、比較と設定の操作(true/falseの結果)が役立ちます。

2
ratchet freak