1. ホーム
  2. ジャバスクリプト

[解決済み】Node.jsとCPUに負荷のかかるリクエスト

2022-04-28 04:19:05

質問

Node.jsのHTTPサーバーをいじり始め、サーバーサイドのJavascriptを書くのがとても好きなのですが、何かが私のウェブアプリケーションにNode.jsを使い始めることを妨げています。

非同期I/Oのコンセプトは理解していますが、画像操作や大きなデータセットのソートなど、手続き型コードが非常にCPUに負担をかけるエッジケースについて、やや懸念しているのです。

私が理解しているように、ユーザーのリストを見たり、ブログの記事を見たりするような単純なWebページのリクエストでは、サーバーは非常に高速になります。しかし、グラフィックを生成したり、何千もの画像のサイズを変更するような非常にCPU集約的なコード(例えば管理者のバックエンド)を書きたい場合、リクエストは非常に遅くなります(数秒)。このコードは非同期ではないので、この数秒の間にサーバーに来るすべてのリクエストは、私の遅いリクエストが完了するまでブロックされることになります。

一つの提案は、CPUに負荷のかかるタスクにWeb Workersを使うことでした。しかし、ウェブ ワーカーは別の JS ファイルを含んで動作するので、きれいなコードを書くのが難しくなるのではないかと心配です。CPUに負荷のかかるコードがオブジェクトのメソッドにある場合はどうでしょうか?CPUに負荷のかかるメソッドごとにJSファイルを書くのは、ちょっと嫌ですね。

また、子プロセスを生成するという案もありましたが、そうするとさらにコードのメンテナンス性が悪くなります。

この(と思われる)障害を克服するために何か提案はありますか?CPUの重いタスクが非同期で実行されるようにしながら、Node.jsできれいなオブジェクト指向のコードを書くにはどうしたらいいでしょうか?

解決方法は?

必要なのは、タスクキューです 長時間実行するタスクをウェブサーバの外に出すことは良いことです。各タスクを別々のjsファイルに保存しておくことは、モジュール化とコードの再利用を促進します。これにより、長期的にデバッグや保守が容易になるような方法でプログラムを構成する方法を考えざるを得なくなります。タスクキューのもう一つの利点は、ワーカーを別の言語で書くことができることです。タスクをポップし、作業を行い、レスポンスを書き戻すだけです。

こんな感じ https://github.com/resque/resque

なぜそれを作ったのか、githubの記事です。 http://github.com/blog/542-introducing-resque