我一直在研究服务器和推送通知守护程序,它们将同时运行并与同一个数据库进行交互。这背后的想法是,如果一个人倒下,另一个人仍然会运作。
我通常使用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.js
和notifier.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
从不同的文件返回相同的内容。
答案 0 :(得分:1)
简短的回答是足够安全。"
长期的答案与理解什么样的一致性保证您的系统需要,您如何配置MongoDB,以及是否进行任何分片或复制有关。
对于后者,你会想read about atomicity and consistency,也许还要偷看write concern。
回答这些问题的一个好方法,即使你认为你已经弄明白了,也是测试场景:用假数据和事件锤击系统的副本,看看发生了什么是好的。