14

2 つのサーバーがあるとします。

1 つ目は、長時間 (数分から数時間) かかる計算を提供するサービスです。

2 番目のサーバーは、このサービスを使用してデータを計算します。

最初のサーバー用の REST API を設計しようとしていますが、これまでのところうまくいっています。しかし、長期にわたるタスクが終了したときに通知をモデル化する方法について、意見を聞きたいと思います。

これまでに2つのアプローチを検討しました。

  1. ポーリング - 2 番目のサーバーは時々結果を尋ねます。
  2. コールバック - 2 番目のサーバーは、完了後に最初に呼び出すサーバーの uri をセットアップします。しかし、これは REST API では少し臭いです。

どう思いますか?

4

3 に答える 3

7

あなたの状況のた​​めに私はポーリングを選びます。2番目のサーバーが最初のサーバーでジョブを作成する最初の要求を行うと、最終的なステータスページのURLを含む応答を取得する必要があります。次に、2番目のサーバーは5〜15分ごとにそのURLをポーリングして、ジョブのステータスを確認します。最初のサーバーがそのURLをRSSまたはAtomフィードにする場合、ユーザーはRSSリーダーを同じURLに向けて、ジョブが完了したかどうかを確認することもできます。人と機械の両方が単一のソースから情報を取得できる場合、それは本当の勝利です。

于 2010-09-07T00:05:36.957 に答える
4

この同様の質問で既に回答したことに加えて、通知に Atom Publishing Protocol を使用することをお勧めします (2 番目のサーバーに公開できます)。

于 2010-09-06T15:46:36.423 に答える
1

Python を使用している場合は、RabbitMQ と Celery を利用して作業を行うことができます。Celery を使用すると、キューに項目を作成し、それを実行しているもの (例: Django) の実行を一時停止して、キュー プロセッサの出力が利用可能になったときにそれを消費できるようにします。ポーリングまたはコールバックは必要ありません。

于 2010-09-06T15:36:00.363 に答える