ログ情報を保存するノード サーバーをセットアップしました。非常に大量のリクエストが来ることが予想されます。私は mongo データ ストアを使用していましたが、そのパフォーマンスは信頼性が低すぎます。レポート側でのデータの読み取りには、異常に長い時間がかかることがよくありました。そこで、従来の mysql に切り替えます。シングルトン挿入を行うのではなく、一括挿入を準備すると、書き込みスループットが大幅に向上することは明らかです。だから私はこの男を見つけました:
https://gist.github.com/3078520
シンプルさが大好きです。それはほんの一握りの行にあり、非常に強力です。add()
レコードをキューに追加し、flush()
キューが特定のサイズに達すると呼び出す2 つの主要な関数があります。そしてflush()
、キューを 1 つの長い文字列に結合し、長い一括挿入ステートメントを作成してから、mysql ドライバーに送信します (提供されたリンクから関数を簡略化しました:
this.flush = function () {
/*1*/ var sql = queryTemplate.replace('{values}', '\n('+ queue.join('),\n(') +')');
/*2*/ handle.query(sql, callback);
/*3*/ queue = [];
}
これは基本的に、リクエスト ハンドラが所有する単一のクラス インスタンスの一部であるクラス関数です。だから私の質問は、これは安全ですか?はqueue
クラス変数です。がflush()
呼び出されると、キューを処理します。私が見ることができる唯一の問題は、flush()
が呼び出された場合、行 1 が実行されて sql ステートメント (単なる文字列) が作成され、次に別の行add()
が呼び出されて に何かが追加されqueue
、最初のプロセスが関数を呼び出しquery()
てキューを空にすることです。その場合、2 番目のプロセスによって追加されたレコードは失われます。これは、最初のプロセスが SQL ステートメントを作成したときにそれを知らず、queue
. これは可能ですか?
この質問をより一般化した形式は次のようになります。関数の実行が開始されると、スコープ外の変数に外部から影響を与えることができますか? これは非常に簡単な例です。異なるリクエストがこれら2つの関数を呼び出すと仮定して、この例でconsole.logを実行することは 可能ですか?
var global_number;
function a(){
global_number=2;
}
function b(){
global_number=1;
if(global_number==2){
console.log("a() influenced global_number in the middle of b()'s execution")
}
}
これは主にイエス/ノーの質問ですが、それ以上のものを探しています。簡単な説明、または詳細を学べるページへのリンクがあれば幸いです。ありがとう!