2016-03-31 18 views
0

私は最近、新しい要求が受信されるたびに再起動せずに、スタンドアロンのサービスとして実行することになっている以下のようなNode.jsのコードの一部、見た:それは、新しいMySQL接続を毎回開くどのように非ブロッキングmysqlクライアントは実際に動作しますか?

switch(action) { 
    case 'a': 
     connectMysql(function(mysqlConnection) { 
      // some queries X 
     }); 
     break; 
    case 'b': 
     connectMysql(function(mysqlConnection) { 
      // some queries Y 
     }); 
     break; 
    /***** more actions *****/ 
} 

をこれを書いた人は、このアプローチはクエリが並行して実行されることを保証し、同じ時間に膨大なリクエスト量がある場合には互いにブロックしないと考えています。

私はnode.jsのmysqlクライアントがノンブロッキングで、何もブロックしないと思っていたので、これは私を本当に混乱させました。

クエリがスタックされた可能性がある場合、プロセスが多すぎるリクエストを処理していた可能性があります。また、より多くのmysql接続は間違いなく助けになります。

または、非ブロッキングクライアントは単にクエリを非同期で送信することを意味しますが、クエリが多すぎるとmysqlサーバー側でクエリがブロックされる可能性があります。

答えて

1

MySQLプロトコルでは、主にサーバーに接続するときに1つのスレッドしか占有せず、スレッドごとに未解決のクエリが1つしか存在しないため、クエリの多重化が許可されません。したがって、ノード用のMySQLモジュールは、通常、便宜のために何らかの種類のキューを実装します。

いくつかのMySQLモジュールには、サーバーへの接続数の上限を維持しながら、1接続あたりの制限を回避するための組み込み接続プーリングが用意されています(あまり圧倒しないようにサーバーやソケットファイル記述子をローカルに使い果たす)。 IMHO最終的には、並行処理が行われる限り、プーリング・オプションが最善の解決策です。

非ブロック的な側面は、クエリが完了するまで待つ間に何か他のことをやめないことを意味します。これにより、他のWebサーバリクエスト、発砲タイマーなどに応答するなど、クエリを待つ間に他のことを行うことができます。

+0

ありがとうございます。 基本的にmysqlサーバは1つの接続から順番にクエリを実行しますが、一部のクライアントはこの複数のクエリの問題に追いつくためにキューまたは接続プールを実装します。 私が掲示したコードは何とかこの問題を解決しましたが、接続プールを作成する方が無制限の接続を開くのではなく、より良い選択肢になるでしょう。 – nevermind

+1

修正してください。 – mscdex

関連する問題