mongodb-lock
A really light-weight way to get distributed locks with a nice API if you're already using MongoDB.
Synopsis
Create a connection to your MongoDB database, and use it to create a lock object:
var mongodb = require('mongodb')
var mongoDbLock = require('mongodb-lock')
var con = 'mongodb://localhost:27017/test'
mongodb.MongoClient.connect(con, function(err, db) {
var lock = mongoDbLock(db, 'locks', 'database-backup')
})
Now, acquire the lock:
lock.acquire(function(err, code) {
if (err) {
return console.error(code)
}
if ( code ) {
console.log('code=' + code)
}
else {
}
})
Once you have a lock, you have a 30 second timeout until the lock is released. You can release it earlier by supplying the code:
lock.release(code, function(err, ok) {
if (err) {
return console.error(err)
}
if (ok) {
console.log('Lock released ok')
}
else {
console.log("Lock was not released, perhaps it's already been released or timed out")
}
})
MongoDB Indexes
You should make sure any indexes have been added to the collection to make the queries faster:
lock.ensureIndexes(function(err) {
if (err) {
return console.error(err)
}
})
Multiple Locks
Multiple locks can use the same collection and operate quite independently:
var dbBackupLock = mongoDbLock(db, 'locks', 'database-backup')
var hourlyStats = mongoDbLock(db, 'locks', 'hourly-stats')
var sendInvoices = mongoDbLock(db, 'locks', 'send-invoices')
Options
Currently there is only the option of the timeout. Currently the default is 30 seconds, but you can change it (in milliseconds):
var uploadFiles = mongoDbLock(db, 'locks', 'upload-files', { timeout : 60 * 1000})
uploadFiles.lock(function(err, code) {
})
0.2.0 (2015-04-17)
- [FIX] made sure that a 2nd .release() doesn't return ok (ie. it didn't do anything)
0.1.0 (2015-04-17)
- [NEW] added ability to add indexes to MongoDB
- [NEW] added lock()
- [NEW] added release()
Author
Written by Andrew Chilton -
Twitter.
License
MIT - http://chilts.mit-license.org/2014/
(Ends)