2016-06-27 13 views
0

私はエクスプレスサーバーを稼働させています。 postルートの1つがhttp要求を行い、これらの要求のそれぞれでデータをファイルに記録したいとします。私が記録するデータは、送信されているデータから抽出されます。ウェブサーバー上でファイルを非同期で読み書きする

私が送信しているデータはxml形式ですので、まずxml2jsモジュールで解析します。 その後、ファイルを読み込んで新しいJSONを追加してから、その結果をファイルに書き戻します。私はjsonfileモジュールを使用してjsonファイルを読み書きしています。

私が現在心配しているのは、2つのリクエストが同時に発生する場合です。

私の読み取り/書き込みは非同期になり、データが失われます。私は、ファイルが成長し始めて機能が終了するのに時間がかかるので、問題がより明らかになると信じています。

どうすれば対応できますか? 私は絶対にreadfilesyncwritefilesyncを使用しています。

... 
    app.post('/testapi', function (req, res) { 

    request({ 
     "url": 'https://webservice.com', 
     "method": "POST", 
     "body" :req.body 
    }, 
     function(err, response, body){ 
     if (err) { 
      res.send(err); 
     } else { 
      res.send(body); 
      logSomeData(req.body); 
     } 
    }); 
}); 

function logSomeData(body) { 
    var currYear = new Date().getFullYear(), 
      currMonth = new Date().getMonth(), 
      fileName = __dirname + '/logs/' + currYear + '_' + currMonth + '.json'; 

    parseString(body, function (err, result) { 
     jsonfile.readFile(fileName, function(err, obj) { 

      var logData = {test : "test"}; 
      obj.push(logData); 

      jsonfile.writeFile(fileName, obj, {spaces: 2}, function(err) { 
       console.error(err) 
      }); 
     }); 
    }); 
} 
+1

これは、人々がJSONファイルの代わりにデータベースを使用する理由です。彼らはあなたのためのファイルロックのすべての問題を処理します。 – Quentin

+0

@Quentin私の会社はOracle DBを使用しています。オラクルはnodejsドライバを持っていますが、インストールはやっかいであり、ドライバは新鮮です。この目的のために役立つ可能性のある他のライトDBがありますか? – Paran0a

+2

SQLiteが気になる。はい。はい、そうです。 – Quentin

答えて

-2

あなたはファイルに内容をログに記録するミドルウェアのいくつかの並べ替えを使用することができますが、大規模なXMLファイルを読み込み、解析中nodejsは、いくつかのパフォーマンスの問題が発生する可能性があり、私の会社では、我々は(大規模なXMLファイルを解析しています150- 140MB)、単一ノードのアプリケーションでは完全なサーバーフリーズが発生し、同じサービスに対して他の要求を行うことはできません。

多くのxml解析で作業する予定がある場合は、他のNode \ JAVAサービスでlogging \ parsingを作成することをお勧めします。メインノードサーバーに他の要求を利用できるようにします。

また、XMLファイル(特に大きなファイル)をXMLストリーミングライブラリで解析することをお勧めします。そのため、すべてをメモリに読み込む代わりにストリームで解析します。

2

データベースエンジンは、通常、複数の接続を処理する際にはより熟練しているため、必要に応じてレコードをオンザフライで追加することができます。

その後、必要に応じて情報をテキストファイルに吸い上げることができます。または、SQLクエリをデータベースに適用して、本当に必要な情報を取得することができます。

使用するデータベースの種類は、この質問の範囲を超えている可能性があります。ニーズやリソースによって異なります。

関連する問題