2017-07-07 10 views
0

Node.jsはシングルスレッドです。 Javascript V8エンジンといくつかの内部ライブラリはマルチスレッドです。 I/Oの場合、ノードはマルチスレッド可能なOSへのI/Oを委譲します。ノードがシングルスレッドのときにnode.jsに接続プールが必要なのはなぜですか?

私のnode.jsアプリケーションがredisまたはsql/mariadbサーバーに接続している場合は、redisまたはmysqlの接続プールは必要ないはずです。

開発者は、1つのredisまたはmysql接続を作成し、それを再利用してデータを送信/取得します。データが到着すると、ノードはコールバックを呼び出してデータを処理します。

Java/.NETとの接続プーリングは理解していますが、マルチスレッドであるため、Java/.NETの接続プーリングには明らかな利点があります。

私の質問は、ノードがシングルスレッドのときにnode.jsに接続プールが必要な理由は何ですか?それの利点はありますか?開発者がそれをしなくても、ノードは基礎となるOSとJavaScriptエンジンのマルチスレッド機能を活用しませんか?

おかげ

答えて

2

ノードは、あなたコードシングルスレッドを実行します。しかし、Node.jsには実際には、あなたのコードにアクセスできないスレッドプールがあります。スレッド機構はlibuvで実装されています。 libuv bookを詳しく見て、libuvの内部の仕組みについて説明します。

基本的に、コードはイベントループ(シングルスレッド)のコンテキスト内で実行されます。非同期作業は、プールから使用可能なスレッドにオフロードされ、イベントループは、非同期作業がいずれかのスレッドによって完了するまでポーリングします。いったん完了すると、非同期呼び出しによって登録されたコールバック関数が呼び出され、イベントループの次のI/O Callback Phaseの間に処理されます。 Event Loopとそのフェーズについては、Node.js docsで詳しく読むことができます。

このイベントループスタイルでアプリケーションを構築する利点の1つは、マルチスレッドアプリケーションに通常関連するクリティカルセクションコーディング(ミューテックス、セマフォなど)の抽象化です。

+0

コメントやリンクありがとうございます。したがって、ノードはI/O用の内部スレッドプールを使用するので、redis接続プールまたはmysql接続プールを使用する利点はありますか? – Avneet

+0

もちろん、これらの接続プールでは、新しい接続を開くのを待つオーバーヘッドがある代わりに、複数の接続を共有して使用できるようになります。これは、正しく実装されたときの最適化です。 – peteb

+0

@Avneetまた、redisとmysqlのスレッドプールはあなたのコードと同じようにlibuvで実行されています。したがって、これらのパッケージによって作成された個別のプールはありません。あなたのコードはそれらのパッケージで実装され、コードはシングルスレッドで実行され、それらのプールは単に仕事を待っているだけのオープンな接続を提供します。接続を開くのを待つ必要はありません。 – peteb

0

複数の「ブロッキング」DB接続(ここではRDBMSと仮定)を1つのスレッドでも保持できるため、接続プールが必要です。接続プールがなければ、ノードなどの非同期/非ブロッキングシステムでも、追加のDBリクエストごとに各接続が最初から作成されます。

例:

request 1 - insert user -- wait for response (assume it's 5 secs) 
request 2 - insert invoice - wait for response (assume it's 3 secs) 
request 3 - insert another invoice 

お知らせその要求3が完了する要求1と2を待たずに、すぐに処理されます。この1つのスレッドでは、既にDBに接続するために3つのリソースを使用しています。あなたがDB操作を必要とするたびにそれぞれを作成する必要があると想像してください。接続プールから1つを取得するほうがはるかに高速です!

関連する問題