2016-11-21 8 views
0

私は毎分0〜3000リクエスト(不規則、パターンなし)からのリクエストを受け取るnodeJsアプリケーションを持っています。リクエストの約80%〜90%がmysqlの挿入操作または更新操作を引き起こします。可能性のある理由は、nodejsのmysqlキュー制限の到達問題を引き起こす可能性があります

ノードのバージョン - 使用nodejsフレームワークは、私は接続を取得していますRestify

でreadlineの6.2
を使用して、Debian-のlinux-gnuのための14.14按分5.5.44、(x86_64版) - 4.2.2
MySQLバージョンサイズのmysql接続プールから。

私は時間(散発的) "mysqlキューの限界に達した"問題を参照してください。何が、おそらく、この問題を引き起こす可能性があります?(別に以下の原因から)

  1. 接続が適切に閉じられていない
  2. キューのサイズが十分ではありません(私は、最適なキューのサイズを決定するにはどうすればよい?)nodejsと
  3. 問題
  4. mysqlクエリの問題(この問題に関するクエリには、どのような問題がありますか?)
  5. ノードjsフレームワークを使用したProbelmを使用する(expressJsを使用すると解決しますかこれ?)

EDIT1 ここでは、私は

connectionPool.getConnection(function (err, conn) { 
    if (err) { 
     return callback(err); 
    } else { 
     let args = [param1, param2]; 
     let query = "SELECT..."; 

     conn.query(query, args, function (err, rows) { 
      conn.release(); 
      if (err) { 
       return callback(err); 
      } else { 
       return callback(null, rows); 
      } 
     }); 
    } 
}); 

データベースを照会しているかのフレームであるEDIT2 ここで私は今のところ持っているMySQLの設定です。私はこれらの値についてほとんど考えていません。彼らは大丈夫ですか?

{ 
    "connectionLimit": 10, 
    "acquireTimeout": 60000, 
    "host": "*****", 
    "port": "3306", 
    "user": "*****", 
    "password": "****", 
    "database": "*****", 
    "charset": "UTF8_GENERAL_CI", 
    "debug": false, 
    "waitForConnections" : true, 
    "queueLimit" : 15000 
} 
+0

nodeでmysqlに接続するためにどのフレームワークを使用していますか?接続が多すぎると、別のエラーが発生する可能性があります。キューのサイズは、mysqlに接続するためのnodejsフレームワークの構造であると思われます。間違っていないと、ここに問題がある可能性があります。私は非常にノードまたはmysqlがこの問題の理由だと疑っています。 –

+0

私はdbに接続するためにmysql nodejsドライバを使用しています。それは最も安定した人気のあるドライバと思われた https://www.npmjs.com/package/mysql –

+0

そして、キューサイズはドライバのコンストラクタであり、nodejsコードで行われました –

答えて

1

これは、いわゆる「プーリング接続」を使用してパフォーマンスの観点からは良いアイデアです。

接続プーリングは、データベース接続のキャッシュを維持して、接続を解放した後で再利用できるようにするメカニズムです。 Node.js MySQLプールは、複数の接続を直接処理するために使用することができます以上 - 接続を再利用してください。例:

var express = require("express"); 
var mysql  = require('mysql'); 
var app  = express(); 

var pool  = mysql.createPool({ 
    connectionLimit : 100, //important 
    host  : 'localhost', 
    user  : '***', 
    password : '***', 
    database : 'database_name', 
    debug : false 
}); 

function db_connect(req,res) {  
    pool.getConnection(function(err,connection){ 
     if (err) { 
      res.json({"code" : "error", "status" : "Error in database connection."}); 
      return; 
     }  
     console.log('Connection ID: ' + connection.threadId); 
     connection.query("SELECT * FROM `table1`",function(err,rows){ 
      connection.release(); 
      if(!err) { 
       res.json(rows); 
      }   
     });  
     connection.on('error', function(err) {  
       res.json({"code" : "error", "status" : "Error in database connection."}); 
     return;  
     }); 
    }); 
}  
app.get("/",function(req,res){ 
     db_connect(req,res); 
}); 
//Run on port 3000 
app.listen(3000); 
+0

connectionLimit変数に使用する値を決定する方法を教えてください。 FYI、max_connectionsシステム変数は151に設定されています(これはデフォルト値だと思います)。私は、max_connectionsシステム変数の値がどんなものであるべきかさえ考えていません。あなたはそれについて少し説明できますか? –

+0

これは言うまでもありません - サーバーの負荷によって異なります。私の経験から、サーバーの負荷が軽いから中程度のものであれば、一般的に100〜500の接続で十分でしょう。 – bodi0

+1

@ PubuduDodangodaこの制限は、あなたが継続的にコンシューマーにしなければならないものです。遅いクエリとトラフィックが多い場合は、より多くの接続が必要です。あなたが速いクエリしか持っていないなら、あなたはより少ない数で安全にすることができます。さて、あなたはただの接続を許してみませんか?さて、それはあなたの実際の限界に近いものにしたいので、何かが間違っていればトリガーできます。たとえば、接続が正しく終了していない場合、クエリは非常に長い時間がかかります。これは、さらに調査する必要があるケースで、上限があると簡単に気付かない場合があります。 –

関連する問題