21

静的で大規模 (>100M) で複雑なメモリ内データ構造にアクセスし、クエリを受け入れ、そのデータの小さなスライスを HTTP 経由でクライアントに提供する Node アプリがあります。

ほとんどのクエリは、10 分の 1 秒で回答できます。ノード万歳!

ただし、特定のクエリでは、このデータ構造の検索に数秒かかります。他の誰もが待たなければならないので、これは最悪です。

より多くのクライアントに効率的にサービスを提供するために、ある種の並列処理を使用したいと考えています。

しかし、このデータ構造は非常に大きいため、数百メガバイトを消費しないように、ワーカー間またはスレッド間で共有したいと考えています。データ構造が書き込まれないため、これは完全に安全です。他の言語の典型的な「fork()」でそれができます。

ただし、私が知る限り、Node.js で並列処理を行う標準的な方法はすべて、これを明示的に不可能にします。安全のために、彼らはあなたが何かを共有することを望んでいません.

しかし、方法はありますか?

バックグラウンド:

このデータ構造をデータベースに配置したり、memcached を使用したりすることは現実的ではありません。

WebWorker API ライブラリなどでは、シリアル化された短いメッセージのみをワーカーに出し入れできます。

ノードのクラスターは「fork」という名前の呼び出しを使用しますが、実際には既存のプロセスのフォークではなく、新しいプロセスを生成しています。繰り返しになりますが、共有メモリはありません。

おそらく本当に正しい答えは、共有メモリへのファイルシステムのようなアクセス、別名 tmpfs、または mmap を使用することでしょう。これとまったく同じように mount() と mmap() を利用できるノード ライブラリがいくつかあります。残念ながら、同期シークと読み取りの上に複雑なデータ構造アクセスを実装する必要があります。私のアプリケーションでは、辞書の配列の配列などを使用しています。それをすべて再実装する必要がないのはいいことです。

4

4 に答える 4

0

waf でのビルドは古いスタイル (ノード 0.6 以下) で、新しいビルドは gyp で作成されます。

ノード クラスター ( http://nodejs.org/api/cluster.html )を確認する必要があります。これが詳細を知らずに役立つかどうかは明らかではありませんが、これは fork を使用して同じマシン上で複数のノード プロセスを実行します。

于 2013-02-14T06:46:35.393 に答える
0

実際、ノードは生成プロセスをサポートしています。Node のフォークが実際のフォークにどれほど近いかはわかりませんが、試してみることができます。

http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

ちなみに、Nodeがそれに不向きだというのは本当ではありません。他の言語/Web サーバーと同様に適しています。サーバーの複数のインスタンスを異なるポートでいつでも起動し、プロキシを前に置くことができます。

さらにメモリが必要な場合は、メモリを追加してください。:)それはそれと同じくらい簡単です。また、そのすべてのデータを Redis や Memcached などの専用のメモリ内データベース (または複雑なクエリが必要な場合は Couchbase) に配置することを検討する必要があります。もうそのデータを複製することを心配する必要はありません。

于 2013-02-14T08:11:46.257 に答える
0

ほとんどの Web アプリケーションは、その寿命の大半をネットワーク バッファとデータベースの読み取りの待機に費やしています。Node.js は、この io バウンド作業に優れているように設計されています。あなたの仕事が本当に CPU に縛られているのなら、別のプラットフォームの方が良いかもしれません。

それはさておき...

  1. process.nextTick (おそらくネストされたブロックでさえも) を使用して、高価な CPU 作業が適切に非同期であり、スレッドをブロックできないようにします。これにより、1 つのクライアントが高価なリクエストを行っても、他のすべてのクライアントに悪影響が及ばないようになります。

  2. node.js クラスターを使用して、システム内の各 CPU のワーカー プロセスを追加します。ワーカー プロセスはすべて単一の HTTP ポートにバインドし、Memcached または Redis を使用してメモリ状態を共有できます。ワーカーには、インプロセス メモリ キャッシュの同期を維持するために使用できるメッセージング API もありますが、一貫性の制限がいくつかあります。

于 2015-02-03T20:45:09.033 に答える