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

ini*_*tel 8 file node.js socket.io

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

fs.writefile('abc.txt','datatobewritten','utf8',function(err){});
Run Code Online (Sandbox Code Playgroud)

我有一个文件abc.txt并假设有两个用户尝试在此文件上同时写入然后我收到错误,所以我如何排队多个请求.

ten*_*its 9

您必须同步写入.

对于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.shift(); 
            cb(err);
        }); 
    }       
    add (...args) {
        this.queue.push(args);
        if (this.queue.length === 1) {
            this.next();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

多进程实例中,您必须使用某些锁定,例如使用lockfile.

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');
    });
}
Run Code Online (Sandbox Code Playgroud)

为了获得更好的性能,您甚至可以在此处结合使

  • 我有多个进程写入文件,我将如何结合这两种方法? (2认同)

Dav*_*mit 2

您应该编写模块名称logs或任何您喜欢的名称。

日志.js

var fs = require('fs');
var writeStream = fs.createWriteStream('./abc.txt');

module.exports = {
  /* PUSH */
  write: function (message, cb) {
      writeStream.write(message, cb);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

并在 socket.io 回调中写入这样的消息!:)

logs.write('datatobewritten');

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

希望这是有道理的:)