REST Webサービスの同時実行性とべき等性は相互に排他的ですか?それとも、サービスを並行性とべき等性の両方にすることができるように実行できますか?バージョンプロパティの使用などの楽観的ロック手法を使用すると、メソッドが妨げられるようです私が間違えなければ、べき等であるために?
たとえば、ユーザーAがPerson.Name
を更新したいとします。
現在Person.Version = 1
ユーザーAが設定
Person.Name = "Name X"
Person.Version = 2
今Person.Version = 2
ユーザーAは、Person.Version = 2
値を使用して同じ要求を送信します。 Person.Version
値3
を期待しているため、失敗します。
REST Webサービスの同時実行性とべき等性は相互に排他的ですか?それとも、サービスが同時実行とべき等の両方になるように実行できますか?
はい、もちろん
ユーザーAがPerson.Version = 2の値で同じリクエストを送信します。 Person.Version値3を予期しているため、失敗します。
いくつかの異なる考えを混乱させていると思います。
から Gregor Hohpe
べき等という用語は、数学でそれ自体に適用された場合と同じ結果を生成する関数を説明するために使用されます。つまり、f(x) = f(f(x))です。
メッセージングでは、この概念はメッセージを1回または複数回受信しても同じ効果を持つメッセージに変換されます。これは、受信者が同じメッセージの複製を受信した場合でも、問題を引き起こすことなくメッセージを安全に再送信できることを意味します。
したがって、システムで最初に気付くのは、同じメッセージを2回送信するreceiverのeffectは、正確に1回送信します。
利点は、送信者がackを受信するために必要な回数だけメッセージを繰り返すことが安全であることです。
さて、あなたの例では、あなたはそれ以上のものを期待しているようです、それは繰り返されたメッセージが同じ応答を生成するということです。これはシステムにとって素晴らしいプロパティですが、もう少し作業が必要です。
基本的なプロットは、サーバーが重複したメッセージを受信し、それがすでに処理されているかどうかを確認することです。素朴なアプローチは、バージョンを見て、このバージョンで適用された変更がすでに適用されているかどうかを確認することです。
具体的には、サーバーは2番目のメッセージを取得し、すでにバージョン2であることを確認し、名前が現在「Person X」と等しいことを確認し、成功を返します。
他の誰かが重複するメッセージの間に別の変更を加えた場合、それはそれほど良い答えではありません。
実際の実装はより複雑です-その基本的な形式は、送信した応答を追跡することであり、重複したメッセージを受け取ったときに、same応答を送り返します前に送った。 di Dahan はこのアプローチをカバーしています。応答の永続性はドメインモデルにあるため、メッセージングはまだステートレスであり、REST制約を満たします。
あなたの例では、あなたは正しいべき等サービスを持っています。 1コール後のリソース状態は、3、5、または100コール後のリソース状態と同じです。 2番目、3番目などの呼び出しが4xxエラーを返すことは問題ではありません。
HTTP RFCから:
https://tools.ietf.org/html/rfc7231#section-4.2.2
たとえば、aがPUT要求を送信し、基になる接続が閉じられた場合、応答が受信されると、クライアントは新しい要求を確立してべき等の要求を再試行できます。元のリクエストが成功した場合でも、リクエストが繰り返されると同じ効果が得られることがわかっています。ただし、レスポンスは異なる場合があります。
DELETEメソッドも同様です。
https://stackoverflow.com/questions/4088350/is-rest-delete-really-idempotent
べき等性とは、同じリクエストを2回または100回行っても結果に影響しないことを意味します。重要な点:requestは結果を変更しません。サーバーの状態は他の何かによって変更される可能性があり、結果として結果が変わりますが、べき等には影響しません。
べき等ではないもの:「次の10件のレコードをください」。 「最初のアイテムを削除」。べき等(種類):「John Smithに関するすべてのレコードを削除する」。 1回または100回実行してもサーバーには影響しません。削除されたレコード数が通知されるだけです。
並行環境では、データへのアクセスは常に キャップ定理 に従います。つまり、次の中から実装を選択できます。
従来のRESTサービスでは、更新はDBに直接送信されます。DBはデータの処理方法を調整します。ほとんどの場合、最新の更新のみを保持します。バージョン管理されたシステムが必要な場合は、古い行を更新する代わりに新しい行を追加します。