環境
RESTアーキテクチャスタイルのステートレス性により、各リクエストは完全に独立しており、サーバーはクライアントに関する情報を決して保存しません。
したがって、どのクライアントがリソースのロックを取得するかをサーバーストアに要求するため、悲観的な同時実行制御は適していません。次に、Etag
ヘッダーを使用して、オプティミスティック並行性制御が使用されます。(ところで、私がそこに尋ねたように/programming/30080634/concurrency-in-a-rest-api)
問題
楽観的同時実行制御メカニズムの主な問題は、すべてのクライアントがいつでも任意の操作を実行できるようにすることです。
そして、RESTの無国籍原則を破ることなく、それを回避したいと思います。つまり、すべてのクライアントがいつでも操作を実行することはできません。
質問
私の考えでは、次のような準楽観的同時実行制御メカニズムで可能です。
- クライアントはトークンを要求できます
- 生成できるトークンは1つだけで、有効期間は限られています
- リソース(POSTやPUTなど)で操作を実行するには、クライアントはこのトークンをリクエストの本文(またはヘッダー?)の一部として渡す必要があります。トークンを持たないクライアントは、これらの操作を実行できません。
これは、楽観的同時実行制御に非常に似ていますが、「すべてのクライアントがすべての操作を実行できる」とは逆に、1つのクライアントのみが一部の操作(トークンを取得したクライアント)を実行できる点が異なります。
このメカニズムはRESTアーキテクチャスタイルと互換性がありますか?それはその制約のいずれかを破りますか?私はSOについて質問することを考えていましたが、これはソフトウェア設計に関連する、よりハイレベルな質問のようです。
Etag
?ではEtag
、あなたの操作が完全になることを確認してくださいことはありません、あなたが任意の操作を実行することはありません決して状況を持っている可能性があります。ロックがあれば、少なくとも操作は確実に行えます。したがって、単純なロックを持つことは、「高い競合」と「まれな競合」が発生する可能性がある環境のちょうど中間です。
Transaction
。明示的にリソースとしてモデル化する必要があります。