アクセスを制限するためにハイパーメディアを使用してみませんか?
使用最初のプロセスをinitateする
POST /A
、のようなもの。それが完了したときの結果は、
<ResultsOfProcessA>
<Status>Complete</Status>
<ProcessB href="/B"/>
</ResultsOfProcessA>
は、第二のプロセスをinitateへのリンクをたどって、第二のプロセスを開始するために従うこと
POST /B
をリンクを提供し、一部のために繰り返す必要C.
誤って動作しているクライアントは、手順Bへのリンクをキャッシュし、将来のリクエストでシーケンスを回避するために再利用を試みる可能性があります。ただし、ステップAを実行するときに何らかのトークンを割り当てたり、トークンをステップBおよびCに渡してクライアントがURLを手動で構築できないようにする必要はありません。
あなたのコメントをさらに読むと、AがBの前後で実行できる状況があるようです。この場合、プロセスA、B、Cの全体のステータスを表すリソースDを作成することをお勧めします。 BおよびC)。クライアントがDを取得すると、それに続くことが許されるURIが提示されます。クライアントがAプロセスを開始すると、Dリソースは処理中にBリンクを削除する必要があります。逆に、BがAの前に開始されたときに起こるはずです。
このテクニックのもう1つの利点は、状態がDで表示できるのでAまたはBが実行されていることが明らかです。実行されたDはCのリンクを含むことができます。
ハイパーメディアは、Dの同じコピーを持つ2つのクライアントを持つ可能性があり、両方ともプロセスAが実行されていないと考えられる可能性があるため、同時に実行しようとします。これは、Dの「Last Modified」タイムスタンプの何らかの種類を持つことによって対処することができ、Dの状態が変わるたびにそのタイムスタンプを更新することができます。これにより、後の要求が拒否される可能性があります。あなたのシナリオの記述に基づいて、これはもっと重要なケースであり、ハイパーメディアはプロセスを並行して実行しようとするほとんどの試みをキャッチするように見えます。
@Marcus:これは内部アプリケーションである可能性もありますが、この段階で制限が組み込まれたものを設計することは悪い考えです。あなたは*スケールする必要はないと思うかもしれませんが、確信が持てますか?後でラインの下で自分自身を頭痛を保存し、いくつかのベストプラクティスに従ってください! – jkp
@jkp、Point taken。 –