2016-07-18 8 views
0

このAPIエンドポイントはwww.example.com/endpointと呼ばれ、多くのデバイスがポストしています(私はIOT会社で働いています)。私たちは全体をNodeJSで実装しており、1台のデバイスからn台のデバイスにスケーリングしている間に固まっています。デバイスは、このAPIエンドポイントでパケットを送信します。このAPIエンドポイントから複雑なビットのコード(arnd 1000行)を実行し、デバイスの状態をデータベース(mongoDB)に保存します。今問題はです。私がデバイス1からパケットを受信し、それを実行している途中でデバイス2からパケットを取得すると、NodeJSはデバイス1の実行をそのまま残し、デバイス2からのパケット2のサービスを開始します。広範なconsole.log()ステートメント
今、理想的な世界です。私はノードが現在の進行状況をパケット1で保存しておきたいと思います。後で処理される待ち行列にパケット2を保存する。私がパケット1で終わったら、パケット2を取り出して処理します。
私はRabbitMQとkueのようなライブラリを知っていて、それをキューに格納して後で処理するのですが、ですが、どの実行環境から別の実行にコンテキストを切り替えるのですか?
これは私の考え方です。他の解決方法もあります。問題についてのあなたの考えを聞きたいと思います。NodeJSで同時実行またはコンテキストスイッチを実装する方法

+0

複雑なコードは何をしていますか?それは純粋に計算的ですか、それともデータベース/ファイル/ネットワークのやりとりのような(たくさんの)I/Oを含んでいますか?ノードは多くの並行I/Oをかなりうまく処理できます。 – robertklep

+0

多くのコールバックが含まれています... –

+0

これは「たくさんのI/O」を意味すると仮定すると、何か他のものがあなたの問題を引き起こしていると思います。 – robertklep

答えて

1

Q:NodeJSで並行処理またはコンテキスト切り替えを実装する方法。

A:短い答え:不可。 Javascriptはシングルスレッドなので


Q:今、問題がある。私がデバイス1からパケットを受信し、それを実行している途中でデバイス2からパケットを取得すると、NodeJSはデバイス1の実行をそのまま残し、デバイス2からのパケット2のサービスを開始します。広範囲にconsole.log()文

AすでにI/Oのための非ブロッキングでイベント駆動型モデルに基づいていますNodeJS多くの場所で読んだことがあるかもしれませんが。 device1のコードはすでにそれだけでコールバックにasynchronous functionに待っているポイントまでアップ処理されているため、ノードはdevice2に奉仕するdevice1途中で捨てているように見える理由

理由でした。例えば。データベース書き込みを実行する。だから、それまでの間、それが利用可能である一方で、それはdevice2のサービスdevice2

同様のケースへ行ってきました - それはリターンのために保留中、イベントがイベントキューにプッシュされますasync機能を打つ一度。 Nodeは、応答が戻ってきた場合はdevice1に戻ることがあります。または、他のデバイス、deviceNかもしれません。

私たちは、nodeプロセスが単独の応答でWebアプリケーション全体をロックしないため、NodeJSは非ブロックであると言います。代わりに、次のイベント(本質的にコードブロック)をキューから取り出して実行します。したがって、実際にはイベントキューには何も利用可能でない限り、常にビジー状態です。


Q:私はキューに格納し、後でそれを処理するためのRabbitMQとKUEなどのライブラリを知っているが、どのように私のコンテキストは、別の実行を切り替えるのですか?

A: 前述のとおりです。 2016年の時点では、Javascriptがスレッド化することはまだできません。 NodeJSはであり、計算量が多くなるように設計されたではありません。要求を処理することのみに焦点を合わせる必要があります。したがって、コードは軽く非ブロックであることが望ましいです。基本的には、ファイルやデータベースへの書き込みや、非同期関数で呼び出しをラッピングすることによって他のプロセスにHTTP要求(ネットワーク)を行うといった、大量のI/O処理を残したいと思うでしょう。

NodeJSは銀色の技術ではありません。アプリケーションがイベントスレッドで多くの計算作業を行うことが予想される場合、Nodeは恐らくテクノロジーの良い選択ではありませんが、世界の終わりではありません。

を参照してください: https://nodejs.org/api/child_process.html

またNIOThreading能力を持っているJavaのような選択肢を検討する必要があります。

関連する問題