0

次の方法に関するアドバイスを探しています。

  1. 特定の長時間実行プロセス(〜10-30秒)のWebサイトからの要求を受信します
  2. ウェブサイトのバックエンドはジョブをスケジュールし、分散キューに入れます.. SQS / Kue/resqueの可能性があります
  3. ワーカーはジョブをキューから取り出して処理します。店舗はどこかに結果をもたらします。
  4. Webサイトのバックエンドは、ジョブ完了イベントをサブスクライブし、処理されたジョブの結果を取得します。
  5. ウェブサイトのバックエンドは、タスクの結果とともにウェブサイトへのリクエストを閉じます。

1、2、3は問題ありません。キューに入れられたタスクの結果をバックエンドに返して、リクエストを閉じるのが難しいと感じています。

Webサイトからのポーリングはオプションではありません。タスクの処理にかかる時間に関係なく、リクエストは開いたままにしておく必要があります。nodejsを使用しています。

4

1 に答える 1

1

2〜4はすべてサーバー側で発生しています。結果の期待される結果の場所(サーバー側)をポーリングし、最終的に表示されたときに結果を返すことを妨げるものは何もありません。

  1. クライアントがリクエストを送信する
  2. サーバーはジョブを開始し、結果のポーリングを開始します
  3. 結果が返されるため、サーバー側のポーリングループが終了します
  4. サーバーは結果をクライアントに送り返します
  5. クライアント/サーバー接続は最終的に切断されます

ジョブが終了したときにURLを実行できれば、さらに効率的なコードを実行できます。この場合、サービスには2つのエンドポイントがあります。1つはクライアントがプロセスを開始するためのもので、もう1つはジョブキューが呼び出すことができるものです。

  1. クライアントがリクエストを送信する
  2. サーバーはジョブを開始します...応答コールバックをグローバルオブジェクトに保存して、閉じられないようにします(ここではexpressのようなものを想定しています)

    openJobs.push({id:12345、res:res}); jobQueue.execute({id:12345、data:{...}});

  3. ジョブが終了して結果を保存したら、IDを使用してサービスURLを呼び出します

  4. ジョブが実際に終了したことを確認し、openJobsリストからジョブを削除できます。
  5. 元の応答を終了します

    openJob.res.send(data);

  6. これにより、データが送信され、元のクライアントサーバー接続が閉じられます。

全体的な結果として、ポーリングはまったくありません...これはすばらしいことです。

もちろん...これらのシナリオのいずれかで、サーバーがバッチの途中でシャットダウンした場合、あなたは失敗します...これが、このシナリオでsocket.ioのようなものをお勧めする理由です。ジョブの結果をどこかにキューに入れ、socket.ioはリスト上のコールバックをポーリング/待機し、新しいアイテムがあるときにクライアントにプッシュします。サーバーがクラッシュしても大したことはないので、これはより良い方法です。サーバーが復旧すると、クライアントは再接続します。

于 2013-01-26T09:10:05.660 に答える