2〜4はすべてサーバー側で発生しています。結果の期待される結果の場所(サーバー側)をポーリングし、最終的に表示されたときに結果を返すことを妨げるものは何もありません。
- クライアントがリクエストを送信する
- サーバーはジョブを開始し、結果のポーリングを開始します
- 結果が返されるため、サーバー側のポーリングループが終了します
- サーバーは結果をクライアントに送り返します
- クライアント/サーバー接続は最終的に切断されます
ジョブが終了したときにURLを実行できれば、さらに効率的なコードを実行できます。この場合、サービスには2つのエンドポイントがあります。1つはクライアントがプロセスを開始するためのもので、もう1つはジョブキューが呼び出すことができるものです。
- クライアントがリクエストを送信する
サーバーはジョブを開始します...応答コールバックをグローバルオブジェクトに保存して、閉じられないようにします(ここではexpressのようなものを想定しています)
openJobs.push({id:12345、res:res}); jobQueue.execute({id:12345、data:{...}});
ジョブが終了して結果を保存したら、IDを使用してサービスURLを呼び出します
- ジョブが実際に終了したことを確認し、openJobsリストからジョブを削除できます。
元の応答を終了します
openJob.res.send(data);
これにより、データが送信され、元のクライアントサーバー接続が閉じられます。
全体的な結果として、ポーリングはまったくありません...これはすばらしいことです。
もちろん...これらのシナリオのいずれかで、サーバーがバッチの途中でシャットダウンした場合、あなたは失敗します...これが、このシナリオでsocket.ioのようなものをお勧めする理由です。ジョブの結果をどこかにキューに入れ、socket.ioはリスト上のコールバックをポーリング/待機し、新しいアイテムがあるときにクライアントにプッシュします。サーバーがクラッシュしても大したことはないので、これはより良い方法です。サーバーが復旧すると、クライアントは再接続します。