5

「Backup Database」などの管理ユーティリティを小さな Web アプリに追加したいと考えています。ユーザーがボタンをクリックすると、HTTP 応答がすぐに返されますが、長時間実行される可能性のあるプロセスがバックグラウンドで開始されています。

Java では、これはおそらく独立したスレッドを生成することによって実装され、Scala ではアクタを使用して実装されます。しかし、node.js で適切なイディオムは何ですか? (コードスニペットを歓迎します)

私は今、ドキュメントを読み直しています。これは本当にノード 101 の質問のようですが、それは私がこれに取り組んでいるところです... とにかく、これが基本的なシナリオであることを明確にするために:

function onRequest(request, response) {
    doSomething();
    response.writeHead(202, headers);
    response.end("doing something");
}

function doSomething(){
     // long-running operation
}

doSomething() をバックグラウンドで実行したままにして、応答をすぐに返すようにします。

別の OS レベルの ChildProcess を生成しないと不可能と思われるノードのシングル スレッド モデルを考えると、わかりました。私の誤解。

私のコードでは、バックアップに必要なものはほとんどが I/O ベースであるため、ノードはそれを適切な非同期方式で処理する必要があります。私がやろうと思うことは、doSomething を response.end の後にシフトすることです。それがどのように動作するかを見てください。

4

2 に答える 2

5

スーパートピが言ったように、 Child processを見ることができます。しかし、これが連続して何度も発生すると、サーバーのパフォーマンスが低下すると思います。次に、代わりにそれらをキューに入れる必要があると思います。ジョブをオフライン (分散) で処理するには、非同期メッセージ キューを確認する必要があると思います。メッセージキューのいくつかの (2 つを挙げると) 例は、 beanstalkdgearmanです。

于 2012-04-08T22:30:08.953 に答える
3

問題がわかりません。必要なのはdoSomething()、非同期操作を開始することだけです。すぐに返されonRequest、応答を書き戻すと、クライアントは「OK、開始しました」というメッセージを受け取ります。

function doSomething() {
    openDatabaseConnection(connectionString, function(conn) {
        // This is called some time later, once the connection is established.
        // Now you can tell the database to back itself up.
    });
}

doSomethingデータベース接続が確立されるまでそこに座ったり、バックアップするように指示するまで待ったりしません。後で実行されるコールバックを登録して、すぐに戻ります。舞台裏では、データベース ライブラリがおそらくいくつかのスレッドを作成して、非同期を正常に動作させますが、コードはそれについて心配する必要はありません。すぐに戻り、すぐにクライアントに応答を送信すると、非同期コードが非同期で実行され続けます。

(実際には、これを同期的に実行するのはより多くの作業です。responseオブジェクトをに渡し、バックアップが完了した後、最も内側のコールバック内で呼び出しdoSomethingdoSomething行う必要がありresponse.endます。もちろん、それはここでやりたいことではありません。これはまさにあなたのコードが行うことです。)

于 2012-04-18T12:24:49.503 に答える