如何使用socket.io处理节点服务器上的并发文件写入请求

如何使用socket.io处理节点服务器上的并发文件写入请求。 我正在使用这写:

fs.writefile('abc.txt','datatobewritten','utf8',function(err){}); 

我有一个文件abc.txt,并假设两个用户试图写在这个文件上的同一时间,然后我得到一个错误,所以如何排队多个请求。

你必须同步写入。

对于nodejs的单个实例,您可以使用简单队列,如下所示:

 module.exports = function(path, content, cb){ var queue = queues[path]; if (queue == null) queue = queues[path] = new Queue; queue.add(path, content, (err) => { cb(err); queue.next(); }); }; var fs = require('fs'); var queues = {}; class Queue { constructor () { this.queue = []; } next () { if (this.queue.length === 0) return; var [path, content, cb] = this.queue[0]; fs.writeFile(path, content, 'utf8', (err) => { this.queue.unshift(); cb(err); }); } add (...args) { this.queue.push(...args); if (this.queue.length === 1) { this.next(); } } } 

多进程实例中,你必须使用一些locking,例如locking文件 。

 var lockFile = require('lockfile'); var fs = require('fs'); module.exports = function(path, content, cb) { lockFile.lock('foo.lock', function (err) { if (err) return cb(err); fs.writeFile(path, content, cb); lockFile.unlock('foo.lock'); }); } 

为了获得更好的性能,您甚至可以在这里结合使用两种方法

你应该写一个模块名称logs或你喜欢什么。

logs.js

 var fs = require('fs'); var writeStream = fs.createWriteStream('./abc.txt'); module.exports = { /* PUSH */ write: function (message, cb) { writeStream.write(message, cb); } } 

然后在你的socket.io相关模块中只需要顶层的模块就好

var logs = require('./logs');

并在socket.iocallback中写入这样的消息! 🙂

logs.write('datatobewritten');

底线“使用fs.createWriteStream而不是fs.writefile

希望这是有道理的:)