【问题标题】:Is it safe to use a single Mongoose database from two files/processes?从两个文件/进程中使用单个 Mongoose 数据库是否安全?
【发布时间】:2017-07-14 23:46:29
【问题描述】:

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

我通常使用 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 从不同的文件返回相同的东西。

【问题讨论】:

  • MongoDB 是一个完全独立的服务,通常在它自己的专用机器上运行。这与“在不同进程中打开文件”完全不同。这是一个“数据库”,它们是为同时作用于它们的多个进程而设计的。所以“线程安全”确实与主题无关。您使用的编写方法对于并发操作是否安全?那么这是一个完全不同的问题,完全取决于您实现的代码。但是您在这里提出的一般性问题表明您对什么是数据库缺乏了解,您应该研究一下。
  • @NeilLunn 既然我已经证明了我的无知,您是否有任何链接或资源建议可以更详细地解释 MongoDB/Mongoose?我整个星期都在阅读文档和尽可能多的 SO 问题,但显然它并没有把我带到我应该去的地方????
  • 如前所述,您似乎对“数据库”基本上是什么以及做什么的一般概念更加纠结。简而言之,它与“文本文件”有很大不同。如果您需要解释,那么如何搜索诸如“数据库如何工作?” 或类似主题之类的内容。这样的答案通常涵盖“书籍”,并不适合在这里做出任何有意义的回应。
  • @NeilLunn 老兄,我知道这不是“文本文件”。你不必如此居高临下。

标签: javascript node.js multithreading mongodb mongoose


【解决方案1】:

简短的回答是“足够安全”。

长的答案与了解什么样的一致性可以保证您的系统需求、您如何配置 MongoDB 以及是否正在进行任何分片或复制有关。

对于后者,您可能想要read about atomicity and consistency,也许还想看看write concern

即使您认为自己已经弄明白了,回答这些问题的一个好方法是测试场景:用虚假数据和事件敲击您的系统副本,看看发生的情况是否正常。

【讨论】:

  • 我已经读过几次关于写问题的文章,但我担心就像你说的那样。真实的例子可能会获得更多信息。感谢您的链接。
  • 这里是对经历网络分区的小型 MongoDB 集群的一系列测试的第一篇文章:aphyr.com/posts/284-call-me-maybe-mongodb 这应该向您介绍一些可能的故障场景以及如何考虑这些问题.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多