2012-02-22 8 views
0

取得が成功した場合、ドキュメントはキューから自動的に削除されることを理解した上で、クライアントがサーバーの出力キューの先頭にあるドキュメントを(HTTP経由で)要求できるようにします。サーバーごとに複数のクライアントが存在することは決してありませんが、クライアントはマルチスレッド化される可能性があります。キューへのランダムアクセスはありません。ヘッドアイテムのみを検索(および削除)することができます。私は、このシナリオがここで、またはWeb上の他の場所で議論されているのを発見していない。ここに私が考えることができる様々なアプローチがあります:空のボディをPOSTにして、応答にデータを渡しますか?

(1)クライアントはGET要求を送信できます。しかし、GETは副作用があるとは考えられていないので、これは良い考えのようには見えません。

(2)クライアントは、キューの先頭でドキュメントを取得するGETと、キューの先頭にあるドキュメントを削除するDELETE(空または無視されるURL)の2つの要求を送信できます。しかし、これは2つの呼び出しを必要とするため、特にクライアントの複数のスレッド/プロセスがファイルを取得しようとすると、さまざまな問題が発生する可能性があります。

(3)クライアントが空の本文を含むPOST要求を送信する可能性があります。キューの先頭に文書がある場合、サーバーは本文に文書を含む応答を返し、文書をキューからも削除します。これは、データを投稿して単純なリターンコードを受け取るという精神的モデルと一致しない点で、やや直感的ではありませんが、そうでなければ私はそれが好きです。私は、通過中に失われた応答と文書が欠落することを心配していません。私は接続がこれを防ぐのに十分安全であると期待しています。

この状況を処理する別のHTTPメソッドがあるといいですが、そうでないので、(3)が最良のアプローチだと思います。同意する?同意しない?

更新:下記のDan675の投稿を読んだ後、(4)を追加しました。

(4)クライアントはDELETE要求を送信することができます。この要求では、サーバーが文書内の文書との応答を送信できます(もちろん、文書をキューから削除することもできます)。繰り返しますが、これはやや直感的ではありません(通常、「スタックの上にあるアイテムを削除してください」と言わないでください)。

+0

URLは常に同じですが、「アクション」ごとに異なるドキュメントを使用していますか? – dash

+0

はい、URLは常に同じです。はい、ドキュメントは毎回異なるはずです(複数の入力キューに同じメッセージが送信されない限り、これは防止できません)。 – Alan

+1

私は1)が最も単純だが、意味的に間違っている、2)正しいが、実装がより複雑である、3)良い妥協であるが、まだ意味論的に間違っていることに同意する。 – dash

答えて

1

最初に2回、次に1回、GETしてから削除してください。

削除が成功すると、クライアントの要求は有効です。それ以外の場合は、要求全体が失敗したかのように処理し、キューの上部にあるものを再度取得しようとします。これにより、要求が失敗したために追加のオーバーヘッドが発生しますが、他のオプションのいずれかを実行することはお勧めしません。

これを行う別の方法は、最初に多分、一番上のアイテムを何らかの方法で '予約済み'としてマークし、次にGETとDELETEを行うことです。このようにすると、このサーバー側のキューを走査し、「予約されていない」最上位の項目を探すことが可能になります。

+0

+1予約されたキューでそれを取り出し、予約済みのキューから取り出して予約済みのキューから削除する。良いアイデア。 – dash

+0

あなたは操作の速度に関心があり、これらの提案でオーバーヘッドを導入したくないと思われるので、あなたの新しいオプションであるナンバー4が最も有効であると言います。 – Dan675

+0

私はちょうど、既存のキューまたは別のものでアイテムを予約することが、特に一番上のアイテムだけがアクセス可能でなければならないので、私たちを買うだろうと思っていると思います。文書が取り出されると、文書を削除できることが分かります。 – Alan

関連する問題