2017-07-14 5 views
-1

私は、同時に実行され、同じデータベースと対話するサーバーとプッシュ通知デーモンに取り組んできました。この背後にあるアイデアは、一方がダウンすると、他方は引き続き機能するということです。2つのファイル/プロセスから1つのMongooseデータベースを使用するのは安全ですか?

私は普通スウィフトを使用しますが、このプロジェクトのために私は自分のデータベースとしてMongooseを使用して、ノードでそれを書いています。私はserver.jsファイルと私のnotifier.jsファイルの両方でインポートするヘルパー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; 

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

MongoDBは完全に別個のサービスであり、多くの場合、専用のマシン上で動作します。 「異なるプロセスでファイルを開く」のようなものではありません。これは「データベース」であり、同時に実行される複数のプロセスのために作られています。だから "スレッドセーフ"は本当に主題とは関係がありません。あなたが書く方法は、並行操作に安全ですか?それは、あなたが実装するコードに完全に依存する完全に異なる質問です。しかし、あなたの一般的な質問は、データベースが何であるかを理解していないこと、そして研究すべきことを示しています。 –

+0

@NeilLunn私の無知を実証したので、MongoDB/Mongooseについて詳しく説明するリンクやリソースの提案はありますか?私は一週間中の文書を読んでいましたが、できる限り多くの質問がありましたが、明らかにそれは私がどこにいるべきなのかわかりません。 –

+0

あなたが指摘したように、「データベース」の基本概念そうです。簡単に言えば、それは「テキストファイル」とは大きく異なります。説明が必要な場合は、「データベースはどのように機能するのですか?」などのトピックを検索することができます。そのような回答は通常「本」をカバーし、ここで意味のある回答には本当に適していません。 –

答えて

1

短い答えは「十分安全」です。

長い答えは、MongoDBのを設定したか、そして起こって任意のシャーディングや複製があるのか​​どうか、お使いのシステムのニーズを保証一貫性がどんなものなのか理解に関係しています。後者の場合

、あなたはread about atomicity and consistencyにしたいと、おそらくもwrite concern覗くます。

これらの質問に答えられる良い方法は、シナリオをテストすることです。システムの複製を偽のデータやイベントで叩き、何が起きているかどうかを確認します。

+0

私はこの問題を数回書いておきましたが、あなたが言うように恐れています。実際の例ではおそらくより多くの情報が得られるでしょう。リンクありがとう。 –

+0

ネットワークパーティションを実行している小さなMongoDBクラスタを叩く一連のテストの最初の記事です:https://aphyr.com/posts/284-call-me-maybe-mongodb障害シナリオ、およびこれらの問題を考える方法について説明します。 –

関連する問題