2016-04-16 20 views
0

Wie kann ich ein System implementieren, in dem mehrere Node.js-Prozesse mit fs.createWriteStream in die gleiche Datei schreiben, sodass sie keine Daten überschreiben? Es sieht so aus, als ob die Standardeinstellung für fs.createWriteStream ist, dass die Datei gelöscht wird, wenn diese Methode aufgerufen wird. Mein Ziel ist es, die Datei einmal zu löschen und dann alle anderen nachfolgenden Autoren nur Daten anhängen.fs.createWriteStream über mehrere Prozesse hinweg

Sollte ich fs.createWriteStream und dann fs.appendFile verwenden? Oder gibt es eine Möglichkeit, einen Stream für jeden Prozess zu öffnen, nicht nur für den ersten Prozess, um die Datei zu öffnen?

+0

Haben Sie darüber nachgedacht, einen Intermediär zu verwenden, um das Protokollschreiben zu delegieren? So wie Syslog, ein Protokollierungsdienst eines Drittanbieters oder sogar ein dedizierter Knotenprozess, der eingehende Protokollanforderungen (z. B. über UDP oder Unix-Socket oder was auch immer) in die Datei schreibt. – mscdex

+0

Ja danke das ist eine gute Beobachtung, eigentlich werde ich das wohl tun müssen. Ich denke, es wäre leistungsfähiger für jeden Kindprozess, direkt an die Datei zu gelangen; aber dann könnten die Dateidaten beschädigt werden und die Daten nicht in der richtigen Reihenfolge? Also pipe stderr (das ist der fragliche Datenstrom) zu einem einzelnen Elternteil node.js Prozess, der dann die Daten in die Datei schreibt. Weniger performant als Elternprozess ist ein Engpass, aber wahrscheinlich in Ordnung. –

Antwort

2

Sollte ich fs.createWriteStream und dann fs.appendFile verwenden?

können Sie entweder verwenden.

mit fs.createWriteStream müssen Sie dies unter der Flagge wie ändern:

fs.createWriteStream('your_file',{ 
    flags: 'a+', // default is 'w' (just 'a' might be enough here, i'm not sure) 
}) 

dies die Datei erstellen soll, wenn es nicht oder es existiert geöffnet mit Schreibzugriff, wenn es um den Zeiger vorhanden ist und auf Ende . (Append-Modus)

Wie zu verwenden fs.appendFile sollte klar sein, und es tut so ziemlich das Gleiche.

Jetzt das Problem mit mehreren Prozessen Zugriff auf die gleiche Datei. Offensichtlich kann nur ein Prozess dieselbe Datei gleichzeitig mit Schreibzugriff öffnen. Daher müssen Sie warten, bis die Datei freigegeben wird, wenn ein anderer Prozess den Schreibzugriff hat. Sie werden wahrscheinlich eine Bibliothek dafür brauchen.

dieses zum Beispiel: https://www.npmjs.com/package/lockup
oder diese: https://github.com/Perennials/mutex-node
Sie auch viel mehr finden Sie hier: https://www.npmjs.com/browse/keyword/lock
oder hier: https://www.npmjs.com/browse/keyword/mutex

ich eine dieser Bibliotheken haben nicht versucht, aber die, die ich gepostet und mehrere andere auf der Liste sollten genau das tun, was Sie brauchen.

Verwandte Themen