簡體   English   中英

MongoDB中的並發

[英]Concurrency in MongoDB

我將收集requests用作多個客戶端同時讀取的隊列。 每個客戶一次從requests讀取一個文檔,然后將其從集合中刪除。 我可以確保每個文檔只能由1個客戶端讀取和處理嗎?

客戶端是用pymongo用Python編寫的。

這里的基本過程是使用.findAndModify()

原諒這不是python代碼,但結構相同,是一個合理的通用示例。 三個文件:

{ "_id": 1 }
{ "_id": 2 }
{ "_id": 3 }

因此,從核心方法中,您只需在每個_id上使用“ remove”參數來調用它。 沒有其他進程可以同時執行此操作。

db.collection.findAndModify({
    "query": { "_id": 1 },
    "remove": true
})

那要么返回被刪除的文檔,要么什么都不返回。


為了獲得更多的“並發性”證明,請再次在這里原諒node.js代碼,但是我不打算做一些簡單的“ Twisted”類型代碼作為快速示例。 但是,它可以達到並發測試的目的:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var testSchema = new Schema({
  "_id": Number,
});

var Test = mongoose.model( 'Test', testSchema, 'test' );

mongoose.connect('mongodb://localhost/async');

async.series(
  [
    // Clear test collection
    function(callback) {
      Test.remove({},callback)
    },

    // Insert some data
    function(callback) {
      async.each([1,2,3],function(num,callback) {
        Test.create({ "_id": num },callback);
      },callback);
    },

    // Now run test in parallel
    function(callback) {
      async.each([1,1,2,2,3,3],function(num,callback) {
        Test.findOneAndRemove(
          { "_id": num },
          function(err,doc) {
            if (err) callback(err);
            console.log( "Removing: %s, %s", num, doc );
            callback();
          }
        );
      },callback);
    }
  ],
  function(err) {
    process.exit();
  }
);

結果(可能有變化的順序):

Removing: 3, { _id: 3, __v: 0 }
Removing: 1, { _id: 1, __v: 0 }
Removing: 3, null
Removing: 1, null
Removing: 2, { _id: 2, __v: 0 }
Removing: 2, null

因此,在這里進行的六次嘗試中,每個文檔兩次嘗試,實際上只有3次嘗試成功,並返回了從堆棧中拉出的結果。

這是確保獲得所需結果的原則。

看起來像您要找的

db.requests.findAndModify()

根據文檔,如果將它與主字段上的唯一索引一起使用,則應該放在一個合適的位置。

http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM