1.0.9 • Published 5 years ago

inter-cluster-cache v1.0.9

Weekly downloads
10
License
MIT
Repository
github
Last release
5 years ago

Inter Cluster Cache

Build Status

Centralized cache for worker clusters in NodeJS, which doesn't involve Redis or the file system.

Installation

$ npm install --save inter-cluster-cache

or

$ yarn add inter-cluster-cache

Why do I need this?

Suppose you have a small Node.js project which requires you to use clusters, with several worker processes. Each worker process is basically its own instance of the application. This results in sharing a common data source between the master process and workers quite difficult, as it requires utilizing a lot of event emitters.

You could ofcourse use redis, but what if your application is small enough to not require setting up a redis environment.

This npm module will provide you with a centralized cache that can be accessed between your master and all your worker clusters!

Usage

Cache API

MethodParametersDescription
createn/aCreates the cache, must be used before using CacheHandler object.
closen/aCloses the cache, must be used before killing master process.

CacheHandler API

MethodParametersDescriptionResolved promise returns
insertkey, valueInsert a key / value pair into the cache, the key has to be unique.nothing
setkeySet a value for an already existing key.nothing
getkeySet a value for an already existing key.value associated with key
deletekeyDelete a key / value pair from the cache.value associated with key deleted
clearn/aClear the entire cache.nothing
getCachen/aRetrieve the JavaScript object representing the cache.JavaScript object

Usage

Simple Example:

const { Cache, CacheHandler } = require('inter-cluster-cache');

(async () => {
    const cache = new Cache();
    cache.create();
    const cacheHandler = new CacheHandler();
    
    await cacheHandler.insert(1, 1);

    console.log(await cacheHandler.get(1)); // outputs - 1

    await cacheHandler.set(1, 99);

    console.log(await cacheHandler.get(1)); // outputs - 99

    console.log(await cacheHandler.getCache()); // outputs - { '1': 99 }
    
    await cacheHandler.clear();

    console.log(await cacheHandler.getCache()); // outputs - {}

    cache.close();
})();

Example with clusters:

const { Cache, CacheHandler } = require('inter-cluster-cache');
const cluster = require('cluster');

// In master process.
if (cluster.isMaster) {
    // Define a port number of your choice, default is 3137.
    const port = 3137;

    // Always construct the cache object in master cluster.
    const interClusterCache = new Cache(port);
    const masterCacheHandler = new CacheHandler();
    
    // Make sure to always create the cache or else it will not work.
    interClusterCache.create();
    
    const numWorkers = 3;
    let deathCounter = 0;
    
    for (let i = 0; i < numWorkers; ++i) {
        // Spawn the worker processes.
        const worker = cluster.fork();
    
        worker.on('exit', () => {
            // Upon death of a worker get the cache.
            masterCacheHandler.getCache()
            .then(cache => {
                console.log(cache);
                if (++deathCounter === numWorkers) {
                    // Always close the cache before killing master process.
                    interClusterCache.close();
                    process.exit();
                }
            })
            .catch(err => {
                console.log(err);
                if (++deathCounter === numWorkers) {
                    // Always close the cache before killing master process.
                    interClusterCache.close();
                    process.exit();
                }
            });
        });
    }
// In worker process.
} else {
    const workerId = cluster.worker.id;
    const workerCacheHandler = new CacheHandler();

    // Insert into the key value pair into the cache and then kill the worker.
    workerCacheHandler.insert(workerId, workerId)
    .then(() => process.exit())
    .catch(err => process.exit());
}

Todos

  • Write MORE Tests
  • Exporting cache to JSON

License

  • MIT