Nitrogen Poisonous Monoxide
    Have ideas to improve npm?Join in the discussion! »

    exclusion-mutuelle

    1.1.0 • Public • Published

    Exclusion Mutuelle


    Exclusion Mutuelle is a French language of Mutual Exclusion. This is an implementation of mutex using redlock and redis.

    Build Status npm version

    Installation

    npm install exclusion-mutuelle --save
    

    Configuration

    const mutex = require('exclusive-mutuelle');
     
    const redisClients = [
      require('redis').createClient(6379, 'redis1.example.com'),
      require('redis').createClient(6379, 'redis2.example.com')
    ];
     
    const mutexConfig = {
      redisClients, // array of redis client to store the lock key
      debugKey: 'exclusion-mutuelle', // debug key to show debug message
      minimumTtl: 100, // minimum time to live when using mutex (in ms)
      extendLockBufferOffset: 50, // Interval for redlock to extend periodically (in ms)
      maxExtendLockCount: 20, // Maximum count that lock can be extended
      redlockOptions: {
        retryCount: 0, // How many times to retry until the lock is acquired
        retryDelay: 1100 // Retry delay per attempt (in ms)
        // Please see https://github.com/mike-marcacci/node-redlock for details
      }
    };
     
    // mutexClient SHOULD be initiated as a singleton
    const mutexClient = mutex.initialize(mutexConfig);

    Quick Usage

    Running a function exclusively

    ...
    const mutexClient = mutex.initialize(mutexConfig);
     
    // Function to print a message after x ms
    const printAfter = async (message, delay) => {
      await Bluebird.delay(delay);
     
      console.log(message);
    };
     
    const exclusiveFunc1 = () => printAfter('Function 1', 1000);
    const exclusiveFunc2 = () => printAfter('Function 2', 300);
     
    // This function with lock key `lock-key` will run exclusively
    // Another function who use the same lock key, will not be able to run until this function finished
    const deferred1 = mutexClient.run(exclusiveFunc1, {
      lockKey: 'lock-key',
      lockTtl: 15000
    });
     
    // This function will throw `LockError`, because the resource is still locked by `deferred1`
    // or you can make this function wait for `deferred1` if you set the `retryCount` and `retryDelay` in `redlockOptions`
    const deferred2 = mutexClient.run(
        exclusiveFunc2,
        { lockKey: 'lock-key', lockTtl: 1000 }
      )
      .catch(LockError, () => console.log('Throw an error with type LockError'))
      .catch(error => console.log('this error should not be printed'));
     
    Bluebird
      .all([deferred1, deferred2])
      .then(() => console.log('success'))
      .catch(console.error)
     

    Using multiple lock keys

    You can set multiple lock key by passing an array of string to lockKey parameter.

    ...
    const mutexClient = mutex.initialize(mutexConfig);
     
    // Function to print a message after x ms
    const printAfter = async (message, delay) => {
      await Bluebird.delay(delay);
     
      console.log(message);
    };
     
    const exclusiveFunc1 = () => printAfter('Function 1', 1000);
    const exclusiveFunc2 = () => printAfter('Function 2', 300);
     
    // The function with multiple lock key (`lock-key1`, `lock-key2`)
    // Another function who use these lock keys will not be able to run until this function finished
    const deferred1 = mutexClient.run(exclusiveFunc1, {
      lockKey: ['lock-key1', 'lock-key2'],
      lockTtl: 15000
    });
     
    // This function will throw `LockError`, because `lock-key1` is still locked by `deferred1`
    const deferred2 = mutexClient.run(
        exclusiveFunc2,
        { lockKey: 'lock-key1', lockTtl: 1000 }
      );
     
    Bluebird
      .all([deferred1, deferred2])
      .then(() => console.log('success'))
      .catch(console.error)
     

    Install

    npm i exclusion-mutuelle

    DownloadsWeekly Downloads

    343

    Version

    1.1.0

    License

    MIT

    Unpacked Size

    38.5 kB

    Total Files

    14

    Last publish

    Collaborators

    • avatar