2015-02-24 4 views
0

Приложение nodejs построено вокруг «файла проекта».атомная запись/чтение файла в nodejs

Несколько модулей (под «модулем», я имею в виду простой файл javascript моего проекта) этого приложения необходимо часто загружать, изменять и сохранять этот файл через потоки (fs.createReadStream, fs.createWriteStream), и поскольку эти модули выполняются независимо друг от друга, иногда из-за происхождений из событий websocket (например), мне нужно сделать операции сохранения/загрузки файла проекта атома.

Это означает, что следующий сценарий:

  1. ModuleA записывает файл проекта
  2. в то же время, и до ModuleA закончил писать файл, moduleB хочет прочитать => в идеале, она должна дождитесь операции записи модуля А (в настоящее время он читает частично записанный файл и обнаруживает ошибку), прежде чем действительно прочитать файл

Является ли nodejs способным сделать это изначально или мне нужно построить своего рода атомную оболочку над моей системой чтения/записи?

ответ

1

Насколько я знаю, ничего не было встроено. Существуют модули, такие как redis-lock, хотя и реализующие механизм блокировки. Если вы запускаете на одном некластеризованном сервере, вы, вероятно, можете справиться с внедрением простой локальной блокировки.

1

Это может дать вам идею:

var Fs = require("fs"), 
    LOCK = require ("os").tmpdir() + '/foo-lock.'; 

function transLock(id, cb) { 
    Fs.open(LOCK + id, "wx", function(err, fd) { 
    if (err) { 
     // someone else has created the file 
     // or something went wrong 
     cb(err); 
    } else { 
     Fs.close(fd, function(err) { 
     // there should be no error here except weird stuff 
     // like EINTR which must be ignored on Linux 
     cb(); 
     }); 
    } 
    }); 
} 


function transUnlock(id) { 
    Fs.unlink(LOCK + id, function(err) { 
    if (err) { 
     // something is wrong and nothing we can do except 
     // perhaps log something or do some background cleanup 
    } 
    }); 
} 

function main() { 
    var id = "some-unique-name"; 

    transLock(id, function(err) { 
    if (err) 
     console.log(err); 
    else { 
     // ... do your stuffs ... 
     transUnlock(id); 
    } 
    }); 
} 

main(); 
Смежные вопросы