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


8

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

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

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

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

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

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

回答:


2

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

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

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

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

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


予約システムについてもう少し説明してもらえますか?クライアントが最初にサービスからIDを要求する必要があることを意味していますか?
ミランバード2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.