从两个文件/进程使用单个Mongoose数据库是否安全?

时间:2017-07-14 23:46:30

标签: javascript node.js multithreading mongodb mongoose

我一直在研究服务器和推送通知守护程序,它们将同时运行并与同一个数据库进行交互。这背后的想法是,如果一个人倒下,另一个人仍然会运作。

我通常使用Swift但是对于这个项目,我在Node中编写它,使用Mongoose作为我的数据库。我创建了一个帮助器class,我在server.js文件和notifier.js文件中导入了该文件。

const Mongoose = require('mongoose');
const Device = require('./device'); // This is a Schema

var uri = 'mongodb://localhost/devices';

function Database() {
    Mongoose.connect(uri,  { useMongoClient: true }, function(err) {
        console.log('connected: ' + err);
    });
}

Database.prototype.findDevice = function(params, callback) {
    Device.findOne(params, function(err, device) { 
        // etc...
    });
};

module.exports = Database;

然后与server.jsnotifier.js分开,我创建对象并查询数据库:

const Database = require('./db');
const db = new Database();

db.findDevice(params, function(err, device) {
    // Simplified, but I edit and save things back to the database via db
    device.token = 'blah';
    device.save();
});

这样做安全吗?使用Swift(和Objective-C)时,我总是担心线程安全。这是一个问题吗?我是否应该担心竞争条件并同时修改相同的文件?

此外,红利问题:Mongoose如何共享文件(或进程?)之间的连接。例如,Mongoose.connection.readyState从不同的文件返回相同的内容。

1 个答案:

答案 0 :(得分:1)

简短的回答是足够安全。"

长期的答案与理解什么样的一致性保证您的系统需要,您如何配置MongoDB,以及是否进行任何分片或复制有关。

对于后者,你会想read about atomicity and consistency,也许还要偷看write concern

回答这些问题的一个好方法,即使你认为你已经弄明白了,也是测试场景:用假数据和事件锤击系统的副本,看看发生了什么是好的。