如何使用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
”
希望这是有道理的:)