コレクションを PUT すると、コレクション全体を挿入するか、既存のコレクションを単一のリソースであるかのように置き換えます。これは、コレクションの GET、DELETE、または POST に非常に似ています。これはアトミック操作です。PUT の個々の呼び出しの代わりに is を使用すると、連絡先はあまり RESTfull ではない可能性があります (ただし、これについては議論の余地があります)。
HTTP パイプラインを調べて、同じソケットの複数の PutContact リクエストを送信することをお勧めします。リクエストごとに、その 1 つのリクエストの標準 HTTP ステータスを返すことができます。
過去に SOAP を使用してバッチ更新を実装したことがありますが、システムに負荷がかかっているときに予期しない問題がいくつか発生しました。注意しないと同じ問題に遭遇すると思います。
- たとえば、バッチ更新の途中でデータベースがタイムアウトし、障害、信頼性、トランザクションなどの面で地獄が崩壊する可能性があります。そして、貧弱なクライアントは実際に更新されたものを把握して再試行する必要がありました.
- 更新するレコードが多すぎると、時間がかかりすぎて HTTP 要求がタイムアウトになりました。それはワームの別の缶を開けました。
- もう 1 つの懸念は、更新中にどれだけのデータを受け入れるかということでした。10MB の連絡先で十分でしたか? おそらく1MB?より大きなバッファは、メモリ使用量とセキュリティに関して多くの意味を持ちます。
したがって、HTTP パイプラインを検討することをお勧めします。
アップデート
私の提案は、連絡先のバッチ作成を非同期プロセスとして処理することです。「ジョブ」は「バッチ作成」プロセスと同じであると想定してください。したがって、サービスは次のようになります。
public class JobService
{
// Post
public void Create(CreateJobRequest job)
{
// 1. Create job in the database with status "pending"
// 2. Save job details to disk (or S3)
// 3. Submit the job to MSMQ (or SQS)
// 4. For 20 seconds, poll the database to see if the job completed
// 5. If the job completed, return 201 with a URI to "Get" method below
// 6. If not, return 202 (aka the request was accepted for processing, but has not completed)
}
// Get
public Job Get(string id)
{
// 1. Fetch the job from the database
// 2. Return the job if it exists or 404
}
}
キューからのものを消費するバックグラウンド プロセスは、データベースを更新するか、代わりにサービスに対して PUT を実行して、ジョブのステータスを実行中および完了に更新できます。
処理されたばかりのデータをナビゲートしたり、エラーに対処したりするには、別のサービスが必要になります。
バックグラウンド プロセスは、検証エラーを許容する必要がある場合があります。そうでない場合、またはサービスが検証を行う場合 (応答時間を保証できないデータベース呼び出しなどを行っていないと仮定して)、クライアントが問題を修正してリクエストを再送信するのに十分な情報を含む CreateJobResponse のような構造を返すことができます。時間のかかる検証を行う必要がある場合は、バックグラウンド プロセスで行い、ジョブを失敗としてマークし、クライアントがエラーを修正してリクエストを再送信できるようにする情報でジョブを更新します。これは、クライアントがジョブが失敗したという事実で何かを実行できることを前提としています。
Create メソッドがジョブ リクエストを多くの小さな「ジョブ」に分割する場合、それがアトミックではない可能性があるという事実に対処する必要があり、ジョブが正常に完了したかどうかを監視するために多くの課題が発生します。